Skip to main content
Glama
gray-wilbee

fub-mcp

by gray-wilbee

fub-mcp

A comprehensive Model Context Protocol server for the Follow Up Boss real estate CRM API. Not affiliated with or endorsed by Follow Up Boss.

Generates one MCP tool per FUB API operation (~130+ tools) directly from FUB's published OpenAPI spec, plus a small set of hand-written extras for behavior that's real but undocumented. Runs entirely on your machine — your API key never leaves it.

Install

  1. Download fub-mcp.mcpb and double-click it. Claude Desktop opens an install screen.

  2. Paste your Follow Up Boss API key into the masked field (FUB → Admin → API), then click Install. Claude Desktop stores the key in your system keychain (macOS Keychain / Windows Credential Manager); it is never typed into a chat and never sent anywhere except directly to Follow Up Boss.

  3. Turn it on. Installing does not enable it: go to Settings → Extensions, find Follow Up Boss, and switch the toggle on.

  4. Start a new chat and try "List my 3 most recently added contacts."

Claude Desktop ships its own Node.js runtime, so nothing else needs installing. Notes: the bundle isn't code-signed yet, so Claude Desktop may show an unverified-developer caution; it has been tested on macOS, and Windows is supported by Claude Desktop but not yet tested by the maintainer. To update, download the newest .mcpb and install it over the old one.

Claude Code, other MCP clients, or Terminal users

claude mcp add fub-mcp --env FUB_API_KEY=your-key -- npx -y fub-mcp

or add this to your MCP client's config (e.g. claude_desktop_config.json):

{
  "mcpServers": {
    "fub-mcp": {
      "command": "npx",
      "args": ["-y", "fub-mcp"],
      "env": {
        "FUB_API_KEY": "your-fub-api-key"
      }
    }
  }
}

Requires Node.js 18+. Get your API key from Follow Up Boss: Admin → API.

macOS guided setup (alternative to putting the key in a config file)

npx -y fub-mcp setup

Pops a native macOS dialog (masked input) for your key, validates it against the live API, stores it in ~/.fub-mcp/.env (permissions restricted to your user), and adds a secret-free mcpServers entry to Claude Desktop's config. If you're using Claude Desktop, the extension above is simpler and stores the key more securely.

Optional environment variables

Variable

Default

Purpose

FUB_MCP_SYSTEM_NAME

fub-mcp

Sent as X-System so FUB attributes actions to this tool and grants the better registered-system rate limit.

FUB_MCP_SYSTEM_KEY

unset

Only needed if you've separately registered your own system.

FUB_MCP_ALLOW_DELETE

0

Set to 1 to enable DELETE-verb tools at all. See Delete safety below.

Related MCP server: Follow Up Boss MCP Server

Delete safety

Follow Up Boss DELETE calls are permanent. This server treats them as opt-in at two layers:

  1. Server-level opt-in: unless FUB_MCP_ALLOW_DELETE=1 is set in the server's environment, delete tools aren't registered at all — the model never sees them as callable.

  2. Per-call confirmation: even with that flag set, every delete tool requires a confirm: true argument, and its description instructs the model to get explicit, specific confirmation from the user before calling it — not to infer consent from general intent.

Neither layer trusts the model alone; both must be satisfied.

What's generated vs. hand-written

Most tools (list_people, create_note, update_deal, ...) are generated at build time straight from FUB's OpenAPI spec (vendored in src/openapi/fub-openapi.json — refresh it from https://docs.followupboss.com/openapi to pick up FUB API changes).

A few things needed hand-written overrides in src/overrides/:

  • list_notes — FUB's docs only document GET /notes/{id}, but the plural GET /notes endpoint works today and supports a personId filter. Confirmed against the live API; treated as best-effort since it's unofficial.

  • update_person tag handling — adding tags should pass mergeTags=true (defaulted for you); removing a tag has no dedicated endpoint and requires a fetch → filter → PUT-the-whole-array-back pattern (documented in the tool description).

  • Notes vs. templates HTML handling — notes need isHtml: true set explicitly for HTML bodies; email templates take raw HTML directly with no such flag. These are easy to mix up, so both tools' descriptions call it out.

  • Two spec quirks fixed transparently by the generator: a couple of endpoints use :id instead of {id} for path params, and the rate-limit endpoints' documented paths double up the /v1 prefix that's already in the base URL.

Skills

Three Claude Skills ship alongside the server for common multi-step workflows the tools alone don't capture:

  • query-smart-list — resolve a Smart List by name (not just ID) before filtering people by it.

  • create-html-email-template — build and upload an HTML email template correctly (see the HTML-handling gotcha above), including FUB's %merge_field% syntax.

  • create-text-template — build an SMS template with the same merge fields, plus FUB's own texting-compliance guidance (opt-out language, carrier-filtering avoidance).

Using this outside Claude

  • ChatGPT Custom GPT: see gpt/ for a trimmed, ≤30-operation OpenAPI schema and setup instructions — each person builds their own GPT with their own API key, no shared/hosted backend involved.

  • Claude web or mobile without the desktop app: not currently supported. Claude.ai's custom-connector UI only supports OAuth (or an org-admin-only static header beta) for remote connectors, so there's no individual, bring-your-own-key path there today the way there is for a Custom GPT. Reaching pure web/mobile users would require a hosted, multi-tenant OAuth backend — out of scope for this repo for now.

Development

npm install
npm run build
npm run inspect   # opens the MCP Inspector against the built server

src/openapi/generate-tools.ts does the spec → tool-schema conversion; src/overrides/index.ts is where undocumented endpoints, description corrections, and default overrides live. src/tools.ts merges the two and applies delete-gating.

License

MIT

Available Tools

133 tools
create_action_plans_personA

Apply an Action Plan to a person. (POST /actionPlansPeople) ⚠️ Action Plans are a deprecated FUB feature — Automations are the current, recommended mechanism going forward. Unless the user specifically names an existing legacy Action Plan they already rely on, prefer the automationsPerson tools (create_automations_person to trigger one, update_automations_person to pause/unpause) over this one for new workflows.

ParametersJSON Schema
NameRequiredDescriptionDefault
personIdYesThe ID of the person to whom you would like to apply the action plan.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
actionPlanIdYesThe ID of the action plan to apply

TDQS

A4.2/5.0
Behavior3/5

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

No annotations are present, so the description carries the full burden. It clearly discloses that Action Plans are deprecated, which is important behavioral context, and the endpoint plus 'Apply' communicate that this is a write operation. However, it does not describe side effects, idempotency, or response behavior, so gaps remain.

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 sentences with no wasted words. It front-loads the primary action, then adds the deprecation warning and sibling alternatives in a compact, scannable format. 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 covers the essential context: what the tool does, that it is deprecated, and which tools to use instead. With no output schema and no annotations, it could have added a note about the response or side effects, but for an agent deciding whether to call this tool, the provided guidance is strong and 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 description coverage is 100%, so the parameters are already fully documented in the schema. The description adds no parameter-level detail beyond stating the action itself, which is acceptable given the baseline of 3 for full 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 states a specific verb and resource: 'Apply an Action Plan to a person' and backs it with the exact endpoint. It also distinguishes itself from the automationsPerson siblings by explicitly positioning this as the legacy alternative. An agent can tell exactly what this tool does.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use guidance: only when the user names an existing legacy Action Plan. It names the preferred alternatives (create_automations_person, update_automations_person) and states to prefer them for new workflows. This is exemplary routing behavior.

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

create_appointmentC

Create an appointment. (POST /appointments)

ParametersJSON Schema
NameRequiredDescriptionDefault
endYesThe ending date and time of the appointment (in UTC, also supports time zone suffix).
startYesThe beginning date and time of the appointment (in UTC, also supports time zone suffix).
titleYesTitle of the appointment.
allDayNoSets whether the appointment is an all day event or not.
typeIdNoThe Follow Up Boss appointment type identifier.
inviteesNoArray of users and/or people to invite to the appointment. (e.g., User object: `{userId: 1, name: "Tom Minch"}`, People object: `{personId: "123", name: "John Q Customer", email: "johnq@example.com"}`)
locationNoThe location or address of the appointment.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
outcomeIdNoThe Follow Up Boss appointment outcome identifier.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
createdByIdNoThe id of the user that created the appointment. (Note: This can only be set by admins, otherwise the currently logged in user's ID is used.)
descriptionNoDescription of the appointment or event.
sendInvitationNoSend an invitation email to invitees. (Note: If the "appointment reminders" is enabled, an SMS reminder will also be sent.)

TDQS

C2.4/5.0
Behavior1/5

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

With no annotations, the description must carry the full burden of behavioral disclosure. It only states 'Create an appointment' and the endpoint, adding nothing about side effects (e.g., sending invitations, admin-only fields), authentication, or response behavior. The schema descriptions for parameters like sendInvitation and createdById carry the behavioral hints, not the tool description.

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

Conciseness2/5

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

The description is a single short sentence, which is concise, but it is essentially a restatement of the tool name and endpoint. It does not front-load any unique value or earn its place; it is minimal to the point of being uninformative.

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

Completeness1/5

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

For a tool with 13 parameters, nested objects, and no output schema, the description is severely incomplete. It lacks any mention of return values, error conditions, required context (like timezone handling), or admin restrictions. The schema and sibling names provide more context than the description itself.

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 100% of parameters with detailed descriptions, so the baseline is 3. The tool description adds no parameter-level meaning beyond what the schema already provides, so it neither improves nor degrades the 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 clearly states the verb and resource: 'Create an appointment.' This is specific and distinguishes it from read-only tools like get_appointment or list_appointments. However, it does not differentiate from sibling create tools like create_event, which also creates an appointment-like entity, so it lacks explicit sibling differentiation.

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

Usage 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 alternatives. It does not mention any conditions, exclusions, or when to prefer create_event or update_appointment. The only clue is the HTTP method, which is not usage guidance.

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

create_appointment_outcomeC

Create an appointment outcome. (POST /appointmentOutcomes)

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoName of the appointment outcome.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
orderWeightNoSet this value to enforce a specific sort order.

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description carries the full behavioral disclosure burden, but it only states 'Create' and the HTTP POST. It does not mention idempotency, required versus optional parameters, success or error responses, side effects, or any constraints like uniqueness of the outcome name.

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 phrases: a clear action and the HTTP endpoint. It is front-loaded with the verb and resource, contains no filler, and every word earns its place.

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

Completeness2/5

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

Although the schema covers all parameters, the tool has no annotations, no output schema, and a one-sentence description that omits usage context, behavioral outcomes, or constraints. For a create operation with all-optional fields, an agent would benefit from knowing what happens on success, whether duplicates are allowed, or what the response contains.

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% (all 4 parameters have descriptions), so the baseline is 3. The description adds no parameter-level meaning beyond the schema, but the schema already documents each parameter adequately, including the generic extraBody and extraQuery pass-through objects.

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 the tool creates an appointment outcome, a specific verb and resource, and the POST endpoint adds clarity. However, it does not explicitly differentiate from sibling tools like list_appointment_outcomes or update_appointment_outcome, relying on the tool name's 'create' prefix.

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 provides no guidance on when to use this tool versus alternatives, no prerequisites, and no mention of conditions or exclusions. An agent is left to infer that this is the create counterpart to list/get/update outcome tools.

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

create_appointment_typeC

Create an appointment type. (POST /appointmentTypes)

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoThe name of the appointment type.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
orderWeightNoSet this value to enforce a specific sort order.

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description must carry the full burden of behavioral disclosure. It only states the action and HTTP method, without mentioning side effects, required permissions, idempotency, validation behavior, or return value. This is a meaningful gap for a mutation tool.

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

Conciseness5/5

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

The description is extremely concise: one action sentence plus the endpoint. There is no filler or redundancy, and the core purpose is front-loaded.

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

Completeness2/5

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

The tool has four parameters, nested objects, no annotations, no output schema, and no required parameters listed. The description does not clarify whether name is effectively required, how extraBody/extraQuery behave in practice, or what a successful creation returns. This is incomplete for an agent to invoke correctly with confidence.

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 has 100% parameter description coverage, so the baseline of 3 applies. The description itself adds no parameter semantics beyond what the schema already provides for name, orderWeight, extraBody, and extraQuery.

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 and resource: 'Create an appointment type' with the endpoint POST /appointmentTypes. It is unambiguous about the action, though it does not explicitly differentiate itself from sibling tools like update_appointment_type or list_appointment_types, so it stops just 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 Guidelines2/5

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

There is no guidance on when to use this tool versus alternatives such as update_appointment_type or get_appointment_type. The verb 'create' implies usage, but the description provides no context, prerequisites, or exclusions.

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

create_automations_personB

Manually trigger an Automation for a specified Person. (POST /automationsPeople)

ParametersJSON Schema
NameRequiredDescriptionDefault
personIdNoID of an existing Person for which to run the Automation
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
automationIdNoID of an existing Automation to trigger

TDQS

B3.1/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure, but it reveals nothing beyond the action itself. 'Trigger an Automation' implies side effects, yet the description omits what those effects are, whether the call is idempotent, what permissions are required, or what the response looks like.

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

Conciseness4/5

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

The description is a single sentence with no fluff and a helpful endpoint hint, making it well front-loaded. However, it is so terse that it provides no structural or contextual breakdown beyond the core statement.

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

Completeness2/5

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

There is no output schema and no annotation coverage, so the description must carry the completeness burden. It only identifies the action and omits side effects, return behavior, prerequisites, and usage context, making it inadequate for a mutation-like trigger 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 description coverage is 100%, and the input schema already documents personId, automationId, extraBody, and extraQuery well. The description adds no parameter-level meaning or examples, so it stays at the baseline for a fully-covered schema.

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

Purpose4/5

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

The description states a specific action ('Manually trigger an Automation') and resource ('for a specified Person'), and reinforces it with the endpoint. It clearly communicates the operation's purpose, though it does not explicitly contrast itself with the sibling list/get/update_automations_person 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 use case is implied: use this when you want to manually run an Automation for a Person. However, there is no explicit guidance about when to choose this over sibling tools, no prerequisites like the Person and Automation needing to exist, and no alternatives or exclusions.

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

create_callC

Add a call. (POST /calls)

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNoThe log message entered for this call.
phoneYesThe phone number this call was made to or from.
userIdNoThe ID of the user that made or received a call. (This can only be set by administrators, otherwise the currently logged in user's ID is used.)
outcomeNoThe outcome of the call, which can be one of `Interested`, `Not Interested`, `Left Message`, `No Answer`, `Busy` or `Bad Number`.
durationNoLength of the call in seconds.
personIdYesThe ID of a person associated with this call.
toNumberNoThe phone number this call was made to.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
fromNumberNoThe phone number this call was made from.
isIncomingYesSets this as an incoming or outgoing call.
recordingUrlNoThe URL for the call recording.

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It only states 'Add a call' and the endpoint, without covering permission requirements, side effects, required fields, or response behavior. This is minimal disclosure for a mutation tool.

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

Conciseness4/5

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

'Add a call. (POST /calls)' is short, front-loaded, and free of filler. It is concise, though arguably too terse for a 12-parameter creation tool, but the conciseness dimension itself is handled well.

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

Completeness2/5

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

For a 12-parameter creation endpoint with no output schema and no annotations, the description omits operational context such as required fields, admin-only userId behavior, and call outcome semantics. The schema explains parameter meaning, but the description does not provide enough surrounding context for confident 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 all 12 parameters are already documented and the baseline is 3. The description adds no additional parameter semantics beyond the HTTP method, but it does not need to compensate for missing schema coverage.

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 uses a clear verb ('Add') and resource ('a call') and includes the HTTP endpoint (POST /calls) for unambiguous identification. It signals creation, distinguishing it from get_call/list_calls/update_call at a basic level, though it does not explicitly name those 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?

There is no guidance on when to use this tool versus update_call or list_calls, and no mention of prerequisites such as personId, phone, and isIncoming. The sibling list shows alternatives exist, but the description does nothing to route an agent toward the correct choice.

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

create_custom_fieldC

Create a custom field. (POST /customFields)

ParametersJSON Schema
NameRequiredDescriptionDefault
typeYesThe type of custom field.
labelYesThe user-friendly name of the custom field (e.g., "Anniversary").
choicesNoArray of options related to a custom field of type `dropdown`.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
hideIfEmptyNoWhen viewing a person, we will hide this field if it is empty.
isRecurringNoWhether a date field occurs every year (e.g. birthdays, anniversaries, etc.). (Note: This is only set and returned for `date` custom fields.)
orderWeightNoA weighted integer for the field to assign values for custom sorting.

TDQS

C2.9/5.0
Behavior2/5

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

Annotations are absent, so the description carries the full burden of behavioral disclosure. It only states the action and endpoint, omitting whether the operation is destructive, what permissions are needed, or that dropdown types require a 'choices' array. It is not misleading but provides almost no behavioral insight.

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 sentence with no fluff, redundancy, or wasted words, and the endpoint is front-loaded. It is appropriately concise, though so terse that it barely rises above the tool name in informational value.

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

Completeness2/5

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

With 8 parameters, 2 required, nested objects, no output schema, and no annotations, this description is far too thin. It does not explain that 'choices' is needed for dropdown fields, what the POST response contains, or any operational context. The schema documents fields, but the description fails to provide the contextual glue needed to safely invoke this 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%, with descriptive entries for all 8 parameters including enums, defaults, and notes like isRecurring being date-only. The description adds no parameter-level information, but the baseline 3 applies because the schema already fully documents the parameters.

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 uses a specific verb ('Create') and resource ('custom field') and includes the exact endpoint, making the action clear. However, it does not distinguish this generic custom field tool from the sibling create_deal_custom_field, so an agent may be unsure whether this creates person-level or deal-level custom fields.

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?

There is no guidance on when to use this tool versus alternatives like create_deal_custom_field, update_custom_field, or list_custom_fields. No prerequisites, conditions, or exclusions are mentioned, so the agent is left to infer usage from the tool name alone.

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

create_dealC

Add a deal. (POST /deals)

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName of the deal.
priceNoThe price associated with this deal.
stageIdYesThe stage that this deal should be assigned to.
userIdsNoA list of user ids that should be part of this deal.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
peopleIdsNoA list of person ids that should be part of this deal.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
descriptionNoDescription of the deal.
orderWeightNoSet this value to enforce a specific sort order.
possessionDateNoPossession Date for this deal.
teamCommissionNoCommission split for the team split.
agentCommissionNoCommission split for the agent split.
commissionValueNoCommission value to assign to this deal.
dueDiligenceDateNoDue Diligence Date for this deal.
projectedCloseDateNoProjected close date of this deal.
earnestMoneyDueDateNoEarnest Money Due Date for this deal.
finalWalkThroughDateNoFinal Walk Through Date for this deal.
mutualAcceptanceDateNoMutual Acceptance Date for this deal.

TDQS

C2.1/5.0
Behavior2/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It only says 'Add a deal', which implies a mutation, but does not disclose side effects, validation requirements, or what happens after creation. It fails to provide any behavioral context beyond the bare action.

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

Conciseness2/5

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

The description is one short sentence, but this is under-specification rather than conciseness. It lacks any structure or front-loading of important information, and every word could be expanded to add value.

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

Completeness1/5

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

For an 18-parameter tool with no output schema and no annotations, this description is grossly incomplete. It does not explain what a deal is, what the required fields mean in context, any constraints, or what the response looks like. An agent has almost no context beyond 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 all 18 parameters are documented in the schema. The description adds nothing beyond the schema, which is the baseline for high coverage. It does not clarify parameter relationships or conditional requirements, but the schema already handles basic semantics.

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

Purpose3/5

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

The description 'Add a deal' clearly states the verb and resource, and it is not a tautology since 'Add' implies creation. However, it is extremely minimal and does not differentiate from related tools like update_deal or get_deal, so it only partially satisfies the dimension.

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

Usage Guidelines1/5

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

There is no guidance on when to use this tool versus alternatives. Sibling tools like update_deal, list_deals, and get_deal exist, but the description provides no context about prerequisites, scenarios, or when not to use this tool.

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

create_deal_attachmentB

Add an attachment to a deal. (POST /dealAttachments)

ParametersJSON Schema
NameRequiredDescriptionDefault
uriYesThe URI of an **externally** hosted file.
dealIdYesThe id of the deal you want to add an attachment to.
fileNameYesName of the file.
fileSizeNoSize of the file in bytes.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

B3/5.0
Behavior1/5

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

No annotations are provided, so the description must carry the full behavioral disclosure burden. It only says 'Add' and gives the endpoint; it does not mention side effects, permissions, idempotency, return behavior, or error conditions. This is insufficient for a mutating tool.

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 clear sentence with the endpoint appended; there is no wasted wording and the core purpose is front-loaded. It is appropriately sized for the minimal information it conveys.

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

Completeness2/5

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

Despite full schema coverage, this is a mutating tool with no annotations and no output schema. The description does not explain the result of the operation, what the response contains, or any behavioral constraints beyond the schema, leaving the agent under-informed.

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 in the schema. The description adds no parameter-level meaning, so the baseline of 3 applies.

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

Purpose5/5

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

The description clearly states the action ('Add an attachment') and the resource ('to a deal'), and includes the HTTP endpoint. It distinguishes this creation tool from sibling tools like get_deal_attachment and update_deal_attachment.

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 get_deal_attachment or update_deal_attachment, nor any context for when adding an attachment is appropriate. The agent must infer usage from the tool name and schema.

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

create_deal_custom_fieldB

Create a deals custom field. (POST /dealCustomFields)

ParametersJSON Schema
NameRequiredDescriptionDefault
typeYesThe type of deals custom field.
labelYesThe user-friendly name of the custom field (e.g., "Anniversary").
choicesNoArray of options related to a deals custom field of type `Dropdown`.
readOnlyNoDetermines whether a deals custom field is read only.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
hideIfEmptyNoSets whether we will hide this field if it is empty.
isRecurringNoWhether a date field occurs every year (e.g. birthdays, anniversaries, etc.).
orderWeightNoA weighted integer for the field to assign values for custom sorting.

TDQS

B3.2/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure, but it only restates the creation action and endpoint. It does not mention side effects, authorization needs, the conditional requirement of choices for dropdown fields, or response 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 short phrase plus endpoint, with no filler or redundancy. It front-loads the key action and resource immediately.

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

Completeness2/5

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

Despite 9 parameters, nested objects, no annotations, and no output schema, the entire context is one line. It doesn't mention conditional behavior around dropdown choices, extraBody/extraQuery usage, or related tools, leaving an agent with insufficient context for a create 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?

Schema description coverage is 100%, so the schema already documents all parameters and the tool description adds no parameter-level meaning. The baseline of 3 applies because the description does not need to compensate for schema gaps.

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 the exact action and resource: 'Create a deals custom field,' reinforced by the endpoint 'POST /dealCustomFields.' The word 'deals' distinguishes it from the sibling create_custom_field, so an agent can select it correctly 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 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 instead of alternatives such as create_custom_field, update_deal_custom_field, or list_deal_custom_fields. There are no when-to-use conditions, prerequisites, or exclusions.

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

create_em_campaignC

Create an email marketing campaign. (POST /emCampaigns)

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoName of the email campaign or template.
originNoName of the email marketing system where this campaign originated from.
subjectNoEmail subject line.
bodyHtmlNoEmail body in HTML.
originIdNoInternal ID of the new campaign or email in the origin system.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It reveals only that this is a POST creation operation; it does not mention required context, auth needs, side effects, idempotency, or the shape of the created campaign.

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 concise sentence with an endpoint, and there is no filler. It is suitably front-loaded, though the brevity leaves little room for context.

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

Completeness2/5

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

For a mutation tool with no annotations and no output schema, the description should supply more operational context. It lacks alternative selection guidance, behavioral caveats, and expected return information, so it is not complete enough for an agent to use confidently.

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 of 3 applies even though the description adds no parameter-level detail. It does not clarify how parameters relate to an email campaign beyond what the schema already states.

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

Purpose4/5

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

The description states a specific verb and resource: 'Create an email marketing campaign' and gives the exact endpoint POST /emCampaigns. It is clear but does not actively differentiate itself from sibling tools such as create_em_event or update_em_campaign.

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?

There is no guidance about when to use this tool versus alternatives. The description only offers the operation and endpoint, leaving the agent to infer selection criteria from the name and schema.

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

create_em_eventB

Notify Follow Up Boss about marketing emails sent, opens, clicks, bounces, unsubscribes and spam reports. (POST /emEvents)

ParametersJSON Schema
NameRequiredDescriptionDefault
emEventsNoArray of email marketing events in the following format: [{"type": "delivered", "occurred": "2017-04-09T16:10:59Z", "recipient": "john.smith@gmail.com", "personId" : 1, "campaignId": 141, "userId": 3}, ...]
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

B3.3/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It states the action ('Notify') and endpoint, but does not disclose side effects, idempotency, required authentication, rate limits, or what happens on duplicate submissions. The term 'Notify' is vague about whether it creates persistent records or just logs events.

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?

Single sentence with a clear verb and resource, followed by the HTTP path. No filler words. Efficient and front-loaded.

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?

No output schema exists, and the description does not explain return values or error behavior. With nested objects and zero annotation coverage, an agent would benefit from knowing prerequisites or confirmation behavior. However, the schema is well-documented, so the main gap is usage context rather than data shape.

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 all parameters including the emEvents array and its nested fields. The description adds little beyond a high-level list of event types in prose, which largely maps to the 'type' enum in the schema. Baseline 3 is appropriate because the schema does the heavy lifting.

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

Purpose5/5

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

States a specific verb+resource: 'Notify Follow Up Boss' and lists the event types. Includes the HTTP endpoint (POST /emEvents), which disambiguates it from siblings like create_event and create_em_campaign.

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 vs alternatives like create_event or list_em_events. The description only states the action and endpoint, leaving the agent to infer from tool names and schema. No exclusions or alternative references.

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

create_eventA

Send in a lead or an event related to a lead. (POST /events) Use this — not create_person — when a NEW LEAD needs to be registered and should trigger FUB's lead routing, automations, and per-source workflows. create_person only inserts a bare contact record and triggers none of that; this is the actual lead-ingestion event. Set type to one of Registration, Inquiry, Seller Inquiry, Property Inquiry, General Inquiry, Viewed Property, Saved Property, Visited Website, Incoming Call, Unsubscribed, Property Search, Saved Property Search, Visited Open House, or Viewed PageRegistration for a genuinely new lead. Set source (and system if relevant) since lead routing rules commonly key off source. FUB auto-deduplicates the nested person object by phone/email — no separate deduplicate flag needed here, unlike create_person. ⚠️ If occurredAt is set to more than 1 day in the past, FUB treats the event as historical and will NOT trigger routing/automations at all — leave it unset (defaults to now) or within the last day if the point is to actually trigger workflows; only backdate it deliberately for importing historical data where you specifically don't want anything to fire.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoThe type of event. Currently one of `Registration`, `Inquiry`, `Seller Inquiry`, `Property Inquiry`, `General Inquiry`, `Viewed Property`, `Saved Property`, `Visited Website`, `Incoming Call`, `Unsubscribed`, `Property Search`, `Saved Property Search`, `Visited Open House` or `Viewed Page`.
personNoInformation about the lead who triggered this event. Follow Up Boss will automatically de-duplicate people based on their phone number or email address.
sourceNoThe name of the lead source.
systemNoThe name of the system used in providing leads.
messageNoA message from the user about this inquiry.
pageUrlNoThis field is to be used with the `Viewed Page` event type and indicates the url of the page viewed. (e.g., "http://www.samplerealestate.com/contact-us")
campaignNoThe name of the source where the lead originated. (e.g., If the lead came to your site through an organic search on `www.google.com` the source is "Google".)
propertyNoInformation about the property this event is related to.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
pageTitleNoThis field is to be used with the `Viewed Page` event type and indicates the title of the page viewed. (e.g., "Contact Us")
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
occurredAtNoThe date this event occurred. This is used to determine if the event is historical. Historical events will not trigger workflows upon creation. Any DateTime greater than 1 day will be considered historical.
descriptionNoAny additional information about this inquiry.
pageDurationNoThis field is to be used with the `Viewed Page` event type and indicates the duration of the visitor on the page viewed given in seconds.
pageReferrerNoThis field is to be used with the `Viewed Page` event type and indicates the referrer url where the visitor came from. (e.g., "https://www.google.com") (Note: If `pageReferrer` is sent in, `pageUrl` should be set as well.)
propertySearchNoIf this event was an inquiry you may have information about what the person was searching for, you can submit this information using this field.

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations provided, the description carries the full behavioral burden and does so well: it discloses that FUB auto-deduplicates the nested person object, that occurredAt older than 1 day is treated as historical and will NOT trigger routing/automations, and that leaving it unset defaults to now. This goes far beyond what any structured field would reveal.

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 key distinction and usage rule are front-loaded, and the length is justified by the volume of critical behavior. It is somewhat long and includes repeated emphasis, so not a 5, but every major 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?

For a complex 16-parameter tool with nested objects and no output schema or annotations, the description covers the main behavioral pitfalls (dedupe, routing, historical cutoff, source importance). It does not describe return values, but with no output schema expected and the call-side behavior well covered, it is nearly complete.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds meaningful selection guidance: type values with 'Registration for a genuinely new lead,' source/system being key for routing, and the critical occurredAt threshold. It doesn't walk through every parameter, but the most decision-critical ones get extra 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?

The description opens with a specific action ('Send in a lead or an event related to a lead') and explicitly contrasts itself with create_person, stating this is the actual lead-ingestion event that triggers FUB's routing, automations, and per-source workflows. An agent can immediately distinguish it from create_person and the many create_* siblings.

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

Usage Guidelines5/5

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

It gives an explicit when-to-use rule ('Use this — not create_person — when a NEW LEAD needs to be registered') and explains why create_person is insufficient. It also warns against backdating occurredAt unless deliberately importing historical data, giving clear do/don't scenarios.

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

create_groupC

Create a new group. (POST /groups)

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe name of the group.
typeNo`Agent` groups allow admins and agents and `Lender` groups allow lender role users.Agent
usersYesAn array of user IDs that will be members of this group.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
claimWindowNoNumber of seconds to allow someone to claim a lead in a first-to-claim group before reassigning. The default is 30 minutes (1800 seconds) with a minimum of 1 minute and maximum of 30 minutes.
distributionNoThe distribution model to utilize. (Note: Lender groups cannot be set to `first-to-claim`.)round-robin
defaultPondIdNoThe ID of the pond to assign unclaimed first-to-claim leads to after the claim window expires.
defaultUserIdNoThe ID of the user to assign unclaimed first-to-claim leads to after the claim window expires.
defaultGroupIdNoThe ID of the group to assign unclaimed first-to-claim leads to after the claim window expires.

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are present, so the description carries the full burden of behavioral disclosure. It reveals that this is a POST/create operation, but it does not mention side effects, permission requirements, defaults for claimWindow or distribution, whether the operation is idempotent, or what response an agent should expect.

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 extremely concise: one short sentence plus an endpoint hint. There is no wasted wording, and the core action is placed up front.

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

Completeness2/5

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

Despite the rich schema, there is no output schema and no annotation coverage description does not state what the API returns on success, how errors appear, or how the extraBody/extraQuery parameters should be used in practice. For a mutation tool with 10 parameters, this is under-specified and requires the agent to infer expected behavior from sibling patterns.

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 of 3 applies. The description itself adds no parameter-level meaning, but the schema thoroughly documents each of the 10 parameters, including defaults, enums, and special constraints such as Lender groups not supporting first-to-claim.

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

Purpose4/5

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

The description states a specific verb and resource: "Create a new group," with the endpoint reinforcement of POST /groups. It is clear what operation the tool performsaren't distinguished from sibling tools such as update_group or create_team, but the create verb is unambiguous enough for basic selection.

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?

There is no guidance about when to use this tool versus alternatives like get_group, list_groups, or update_group. The phrase "Create a new group" only implies the obvious case, and no prerequisites, exclusions, or context for choosing this over related group/team tools are provided.

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

create_noteA

Add a note. (POST /notes) If body contains HTML markup, you must also pass isHtml=true — unlike email templates, FUB does not auto-detect HTML in notes.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNoThe content of the note.
isHtmlNoIf enabled, will render the HTML tags contained within the body on the Follow Up Boss user interface.
subjectNoGives a note a title or subject.
personIdYesThe ID of a person.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

A4.2/5.0
Behavior3/5

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

With no annotations, the description carries the behavioral burden. It discloses a useful non-obvious behavior: FUB does not auto-detect HTML in notes, unlike email templates, and requires isHtml=true. However, it does not cover permissions, side effects, or return value expectations, which leaves some gaps for a mutation tool.

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

Conciseness5/5

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

The description is two sentences with no wasted words. It front-loads the core purpose and then adds the single most important usage caveat.

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 tool with six documented parameters and no output schema, the description plus the fully described schema is largely sufficient to invoke it correctly. It highlights the main gotcha around HTML handling. It could mention return values or prerequisites, but the agent has enough to call the tool accurately.

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 meaningful semantic value by explaining when isHtml must be passed and contrasting note behavior with email templates. This goes beyond the schema's simple field description.

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 action and resource: "Add a note. (POST /notes)". This clearly distinguishes it from sibling tools like get_note, update_note, and list_notes.

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 by stating the tool adds a note and gives a concrete condition for when isHtml must be true. It does not explicitly compare against alternatives, but no alternative create-note tool exists among siblings, and no exclusion criteria are needed.

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

create_people_relationshipB

Create a new relationship for a person. (POST /peopleRelationships)

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoThe type of relationship, e.g. `Spouse`, `Brother`, `Partner` , etc.
emailsNoA list of email addresses associated with the relationship. (Specify type and value, `isPrimary` is not expected. The first email in the list will be the primary email address for the relationship.)
phonesNoA list of phone numbers associated with the relationship. (Specify type and value, `isPrimary` is not expected. The first phone in the list will be the primary phone number for the relationship.)
lastNameNoThe last/family name of the relationship.
personIdNoPerson ID this relationship is associated with.
addressesNoA list of addresses associated with the relationship. (This is the address where this person can be contacted, it is not the address of a property this person may be interested in selling or buying).
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
firstNameNoThe first/given name of the relationship.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

B3.3/5.0
Behavior2/5

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

No annotations exist, so the description must carry the full behavioral burden. It only says 'Create' and gives the endpoint; it does not disclose that personId is effectively required, what response is returned, whether the operation is idempotent, or what side effects occur beyond creating a relationship.

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 short, front-loaded with the action, and includes the endpoint for API context. It is efficient, though it sacrifices operational detail that would make it more useful.

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

Completeness2/5

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

For a create tool with 9 parameters, nested objects (emails, phones, addresses), and no output schema or annotations, this description is incomplete. It does not explain the relationship model, clarify required inputs like personId, or describe return behavior, leaving agents to infer critical usage details.

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 every parameter has a detailed description in the schema. The tool description adds no parameter-level meaning, but the baseline of 3 applies because the schema already does the heavy lifting.

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

Purpose5/5

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

The description states a specific verb and resource: 'Create a new relationship for a person' and includes the HTTP endpoint. This clearly distinguishes it from siblings like create_person, update_people_relationship, and list_people_relationships.

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 word 'new' implies this tool is for creating rather than updating a relationship, but the description does not explicitly mention alternatives like update_people_relationship or any prerequisites (e.g., personId appears conceptually required but is not marked required). Usage guidance is only implicit.

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

create_personA

Manually add a new person. (POST /people) FUB's docs also list a wildcard "custom*" field here for reading/writing custom fields directly (e.g. a "Closing Date" field as custom.ClosingDate) — that's not a literal field name, so it's not in this tool's fixed schema. Pass custom. entries via extraBody instead. Call list_custom_fields first to get exact names. deduplicate defaults to false, meaning creating a person whose email or phone matches an existing contact creates a SEPARATE duplicate record rather than erring or merging — a common way CRMs end up full of duplicate leads. Unless the user clearly wants an intentional second/separate record (e.g. a shared household phone), pass deduplicate=true, or call get_people_check_duplicate first and confirm with the user if a likely match already exists. ⚠️ This does NOT register a new lead in FUB's sense: it creates a bare contact record only — no lead routing, no automations, no per-source workflows fire. If the user actually means "a new lead just came in" (e.g. from a website registration, an inquiry, an open house sign-in) rather than "just add this person to my CRM," use create_event instead — that's what actually triggers FUB's lead routing and automations.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoA list of tags applied to the person.
priceNoThe price of the property of the person's first inquiry, or the estimated sell/buy price for this person.
stageNoThe stage the person is in. (e.g., "Lead" or "Trash". See [stage API endpoint](ref:stages-get) for more options.)Lead
emailsNoA list of email addresses associated with the person. (Specify type and value, isPrimary is not expected. The first email in the list will be the primary email address.)
phonesNoA list of phone numbers associated with the person. (Specify type and value, isPrimary is not expected. The first phone in the list will be the primary phone number.)
sourceNoThe source of the lead.
lastNameNoThe last/family name of the person.
addressesNoA list of addresses associated with the person. (These are the addresses where this person can be contacted, it is not the address of a property this person may be interested in selling or buying).
contactedNoWhether the person has been contacted or not.
createdAtNoWill set the creation time for the person, if wanting to create historical leads.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
firstNameNoThe first/given name of the person.
sourceUrlNoThis is a direct link to the information about a person at the lead provider.
assignedToNoFull name of the agent assigned to this person.
backgroundNoBackground information on the person. (Can be a multi-line string.)
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
deduplicateNoBy default new people will be created even if there are existing people with the same email or phone. By passing true, deduplication logic will be used and, if a person is found, a 200 response will be returned along with response data for that existing person. No changes will be made based on the payload.
timeframeIdNoID of the timeframe to move (Refer to the /timeframes endpoint for valid values of timeframeId.)
collaboratorsNoList of user ids to set as collaborators on this person. Not including a collaborator's user id in this array will remove them as a collaborator.
assignedPondIdNoID of the pond assigned to this person.
assignedUserIdNoID of the agent assigned to this person.
assignedLenderIdNoID of the lender assigned to this person.
assignedLenderNameNoFull name of the lender assigned to this person.

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations provided, the description carries the full behavioral disclosure burden, and it does so thoroughly. It warns that deduplicate defaults to false and creates a separate duplicate record, that this tool does NOT trigger FUB lead routing or automations, and that the custom* field is not a literal field name but must be passed via extraBody. These are exactly the non-obvious behavioral traits an agent needs.

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

Conciseness5/5

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

Although the description is long, it is dense and every sentence earns its place: endpoint identification, custom-field workaround, duplicate risk, and lead-routing distinction. It is front-loaded with the core purpose and then layers warnings and alternatives in a logical order without tautology 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 complex create tool with 23 parameters, no annotations, and no output schema, the description covers the most decision-critical context: duplicate behavior, custom field mechanism, and lead vs. person semantics. It does not describe response shape or return values, but that is a minor gap given the strong operational guidance provided elsewhere.

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, but the description adds practical param meaning beyond the schema. It explains the real-world consequence of the deduplicate default, clarifies how custom fields should be provided through extraBody, and directs the agent to list_custom_fields for exact names. This is meaningful added value over the raw 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 a precise verb and resource: 'Manually add a new person. (POST /people)'. It also disambiguates this tool from create_event, explaining that creating a person is not the same as registering a lead, which makes the purpose unmistakable among many sibling tools.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use guidance and alternatives: it says to call list_custom_fields first for custom field names, to use get_people_check_duplicate before creating when duplicates are a concern, and to use create_event instead when the user means a new lead rather than a bare CRM contact. This leaves almost no ambiguity about tool selection.

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

create_person_attachmentB

Attach a file to a person. (POST /personAttachments)

ParametersJSON Schema
NameRequiredDescriptionDefault
uriYesURI of an externally hosted file.
fileNameYesName of the file.
fileSizeNoSize of the file in bytes.
personIdYesID of the person.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

B3.2/5.0
Behavior2/5

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

There are no annotations, so the description carries the full burden of disclosing behavior. It only implies a write operation via 'Attach' and 'POST', but does not mention authentication needs, idempotency, duplicate handling, validation, or what is returned on success or failure.

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 extremely concise and front-loaded, stating the action and resource in the first phrase. The parenthetical endpoint adds useful reference information without extra filler.

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

Completeness2/5

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

With no annotationsthor, no output schema, six parameters, and nested objects, the description is too thin. It does not explain return values, the purpose or behavior of extraBody/extraQuery in context, or error conditions, leaving an agent with only the schema to understand the full call.

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 parameters are already documented in the input schema. The description itself adds no parameter-level meaning, which matches the baseline of 3 for 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 states a specific verb and resource: 'Attach a file to a person' and reinforces it with the endpoint POST /personAttachments. This clearly differentiates the tool from sibling tools like create_deal_attachment by specifying the person scope.

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 provides no guidance on when to use this tool versus alternatives such as get_person_attachment, update_person_attachment, or create_deal_attachment. It also omits prerequisites or conditions, such as whether the person must exist or whether the file must already be externally accessible.

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

create_pipelineB

Add a pipeline. (POST /pipelines)

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName of the pipeline.
stagesNoAn array of stage objects that should be associated with the pipeline.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
descriptionNoDescription of the pipeline.
orderWeightNoSet this value to enforce a specific sort order.

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of disclosure. It only states the basic action and endpoint, without mentioning side effects, required permissions, validation behavior, idempotency, or what happens to nested stages.

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 extremely concise: one short statement plus the HTTP method/path. Both pieces of information earn their place, with no filler or redundant wording.

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

Completeness1/5

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

This is a complex tool with 6 parameters, a nested stages object, extraBody/extraQuery escape hatches, and no output schema. The one-line description provides none of the additional context an agent needs, such as response behavior, error cases, or how the extra fields should be used.

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 all six parameters. The description adds no parameter-level meaning, but the baseline of 3 applies because the schema already handles 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?

The description states a specific verb ('Add') and resource ('a pipeline'), and also gives the HTTP endpoint (POST /pipelines). This clearly distinguishes it from sibling tools like get_pipeline, list_pipelines, and update_pipeline.

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 about when to use this tool versus alternatives, no prerequisites, and no exclusions. The verb 'Add' implies a create operation, but the description does not explicitly say 'use this to create a new pipeline, not to update or retrieve one.'

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

create_pondB

Create a pond. (POST /ponds)

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe name of the pond you want to create
userIdYesThe Pond Lead Agent
userIdsYesIDs of all users to add as members of the pond
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. "Create a pond" implies a mutating write operation, but it does not describe permissions, side effects, response behavior, or idempotency. This is a significant gap for a create tool with no annotation support.

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 extremely concise and front-loaded: "Create a pond. (POST /ponds)". It contains no filler or wasted words. The endpoint is somewhat redundant with the tool name and schema but harmless; the brevity is appropriate given the schema carries most detail.

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

Completeness2/5

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

For a tool with five parameters, nested objects, no output schema, and no annotations, this description is too thin. It does not explain what a pond is in this domain, the role of userId as lead agent, or what a successful creation returns. An agent cannot fully assess correctness from the description alone.

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 input schema already documents all parameters including name, userId, userIds, extraBody, and extraQuery. The description adds no parameter meaning beyond the schema, which meets the baseline for fully covered schemas.

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 and resource: "Create a pond" with the endpoint. This clearly differentiates from siblings like get_pond, list_ponds, and update_pond based on the create action. An agent can tell what the tool does without opening the schema.

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

Usage 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 create_pond versus alternatives. It does not mention that create_pond is for new ponds while update_pond handles existing ones, nor does it note prerequisites or conditions. Usage must be inferred entirely from the tool name.

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

create_reactionB

Add a reaction to a corresponding reference data object, e.g. "Note" or "ThreadedReply" (POST /reactions/{refType}/{refId})

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNoThe single-character emoji reaction.
refIdYes
refTypeYes
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

B3.1/5.0
Behavior2/5

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

With no annotations, the description carries the full behavioral burden and only reveals that this is a POST/add operation. It does not disclose whether duplicate reactions are allowed, what authentication or permissions are required, what side effects occur, or what the response looks like.

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

Conciseness5/5

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

The description is one concise sentence that front-loads the action and includes the endpoint for extra clarity. There is no filler and no repetition of schema content.

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 simple creation endpoint, the description and schema together are mostly usable: required path parameters are identifiable and the body field is explained. However, without annotations, output schema, and a full enumeration of valid reference types are all missing, leaving gaps around response format and allowed values.

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 documents body, extraBody, and extraQuery, while refType and refId lack schema descriptions. The description partly compensates by embedding refType/refId in the URL path and giving examples of acceptable refType values, but it does not define refId semantics or constrain refType beyond two examples.

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

Purpose4/5

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

The description states a specific action ('Add a reaction') and target ('reference data object'), with concrete examples 'Note' or 'ThreadedReply' plus the endpoint POST /reactions/{refType}/{refId}, so the purpose is clear. It is distinct from siblings like create_note or get_reaction, though it does not explicitly contrast with any sibling.

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?

There is no guidance on when to use this tool versus alternatives or when not to use it. The phrase 'corresponding reference data object' gives only generalized context, but no exclusions, prerequisites, or sibling routing are provided.

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

create_stageB

Create a new stage. (POST /stages)

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName of the stage.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
orderWeightNoSet this value to enforce a specific sort order.

TDQS

B3.1/5.0
Behavior2/5

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

No annotations exist, so the description carries the full burden of behavioral disclosure. It only repeats the create action and endpoint, omitting side effects, authorization needs, idempotency, duplicate handling, or response behavior.

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

Conciseness4/5

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

The description is front-loaded and contains no filler: the purpose is stated first and the endpoint adds useful routing context. However, it is so terse that it misses opportunities to add behavioral guidance.

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

Completeness2/5

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

With no output schema and no annotations, the description should explain what a successful creation returns and what prerequisites exist. It also does not clarify how stages relate to pipelines or whether extraBody must carry association fields, leaving important invocation context 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 all four parameters, including extraBody, extraQuery, and orderWeight, are already documented. The description itself adds no parameter-level meaning, but the schema covers the necessary detail.

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

Purpose5/5

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

The description uses a specific verb and resource: 'Create a new stage.' The POST endpoint reinforces the creation action and clearly distinguishes this tool from sibling get_stage, update_stage, and list_stages.

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 is given about when to use create_stage versus alternatives like update_stage or list_stages. The verb 'create' is the only signal, and no when-not-to-use conditions or prerequisites are mentioned.

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

create_taskB

Create a new task. (POST /tasks)

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoThe name of the task.
typeNoType can be one of the following: `Follow Up`, `Call`, `Text`, `Email`, `Appointment`, `Showing`, `Closing`, `Open House` or `Thank You`
dueDateNoDue date for this task in YYYY-MM-DD format.
personIdYesThe id of the person this task is related to.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
assignedToNoThe full name of the agent to assign this task. (Note: This is required if `assignedUserId` is empty.)
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
dueDateTimeNoDue date for this task with a time included that also supports timezone suffixes. (e.g., 2004-11-16T03:00:00 -05:00)
isCompletedNoSets whether the task is completed or not.
assignedUserIdNoThe id of the user to assign to this task. (Note: This is required if `assignedTo` is empty.)
remindSecondsBeforeNoSet a reminder for the task to be sent via email and desktop notification. This is only available for tasks with a due time set.

TDQS

B3.2/5.0
Behavior2/5

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

The description adds no behavioral insight beyond the name itself; it does not mention side effects, permissions, idempotency, or return behavior. With no annotations to fall back on, the description carries the full burden and fails to disclose anything not already obvious.

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, direct sentence with no filler or repetition. It is compact and immediately comprehensible, fully earning its length.

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

Completeness2/5

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

With 11 parameters, conditional requirements, and no output schema or annotations, the one-line description is insufficient for an agent to fully understand the tool's behavior and expected outcomes. The schema covers parameter details, but the description does not address return values or operational context.

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 parameters are fully documented within the input schema. The description itself contributes no additional parameter semantics, hitting the baseline for schema-heavy cases.

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 ('Create') and the resource ('a new task'), and includes the HTTP endpoint for additional precision. It is unambiguous and distinguishes itself from sibling tools like update_task, get_task, and list_tasks.

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 is provided about when to use this tool versus alternatives, nor any exclusions or prerequisites. The description simply states what the tool does without context on when it is appropriate.

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

create_teamB

Create a new team. (POST /teams)

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe name of the team.
userIdsYesAn array of user IDs that will be member of this team.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
leaderIdsNoThe complete list of team leaders.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

B3.2/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It only states that it creates a team, but does not mention required permissions, idempotency, behavior on duplicate names, or return values. For a creation endpoint, these are significant gaps.

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 sentence with zero wasted words, front-loading the action and including the endpoint. It is appropriately sized for the information it conveys, though that information is minimal.

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

Completeness2/5

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

For a creation tool with five parameters, no output schema, and no annotations, the description is too sparse. It omits critical context such as what the response contains, side effects of creation, whether the operation is idempotent, and any relationship between parameters. The agent would need to infer behavior from the schema and endpoint alone.

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 detailed descriptions for all five parameters. The tool description itself adds no parameter information beyond what the schema already provides, so it meets the baseline of 3 for high coverage without adding extra semantic value.

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 ('Create') and the resource ('a new team'), which is specific and distinguishes it from siblings like update_team, get_team, and list_teams. The HTTP method 'POST /teams' reinforces the creation aspect without ambiguity.

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?

There is no guidance on when to use this tool versus alternatives. It does not mention prerequisites, conditions for choosing create_team over update_team, or any exclusions. The usage context is entirely implied by the verb 'create'.

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

create_templateA

Create a new email template. (POST /templates) body is the raw HTML of the email template directly — there is no separate isHtml/html flag for templates (unlike notes, which need isHtml=true explicitly). FUB templates support %merge_field% placeholders that FUB substitutes when a human actually sends the template (not by this tool — this just saves the template text as-is). Reference: Contact: %contact_name% (full), %contact_first_name%, %contact_last_name%, %contact_email%, %contact_phone%, %contact_address%, %contact_street%, %contact_city%, %contact_state%, %contact_zipcode%, %contact_country%, %contact_rels_first_name% (first names of the contact's linked relationships, e.g. spouse/family added via peopleRelationships). Company (from Admin > Company settings): %company_name%, %company_phone%. Agent / Lender / Sender — same field set, swap the prefix (agent = assigned agent, lender = assigned lender, sender = whoever is actually sending this particular message, which may be neither): %agent_name%, %agent_first_name%, %agent_last_name%, %agent_email%, %agent_phone% (the FUB-assigned calling/texting number), %agent_mobile_phone% (their real/personal number), %agent_merge_field_1% (one free-form field each user sets in My Settings > Other Settings > Edit User Merge Field — commonly a booking link or social profile). ⚠️ %_phone% vs %mobile_phone% is genuinely ambiguous — always confirm with the user which one they mean before using either; picking wrong sends the recipient the wrong callback number. Inquiry (how the contact became a lead, e.g. clicking "Get more info" on a listing site): %inquiry_address%, %inquiry_address_url% (only if the lead source provided one), %inquiry_address_preview% (renders an HTML photo+link box — email only, meaningless in a plain-text SMS template). Recently viewed (populated only when synced with a provider that shares property views): %viewed_address%, %viewed_address_url%, %viewed_address_preview%, %last_5_preview% (up to 5 as HTML boxes, email only). Other: %source_name% (lead source, e.g. "Zillow" — "I saw your inquiry on %source_name%"), %greeting_time% ("Morning"/"Afternoon"/"Evening" based on send time — "Good %greeting_time%, %contact_first_name%"), %tour_time% (populated if the contact scheduled a tour via Zillow). Custom fields: %custom% (e.g. %custom_website%, %custom_birthday%, %custom_spouse_name%). Call list_custom_fields to confirm a field exists — but note its API name (e.g. customBirthday, camelCase) and its merge-field name (%custom_birthday%, snake_case) are different spellings of the same field, and there's no API that returns the merge-field spelling directly, so confirm the exact form with the user (or FUB's own Merge Fields dropdown in the template composer) if it's not obvious from the label. A merge field with no value for a given contact is simply left blank when the template is used — not an error, not a visible placeholder.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesThe HTML body of the email template.
nameYesThe name of the new email template.
subjectYesThe email subject used when this email template is selected.
isSharedNoIndicates whether this email template should be shared with other users in the same Follow Up Boss account.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden. It discloses key traits: the tool doesn't substitute merge fields at save time, FUB substitutes them later when a human sends, empty merge fields are left blank rather than erroring, and there is no separate HTML flag. It could additionally mention response shape or auth requirements, but the behavioral core is well 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 long, but it is front-loaded with the core purpose and body semantics, then organized into clear merge-field categories. The length is largely justified by the complexity of FUB merge fields; the warning about ambiguous phone fields earns its place. It loses a point because it could be tightened without losing essential guidance.

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 no annotations and no output schema, this description is unusually complete for invocation: it covers endpoint, required parameters, body format, placeholder behavior, and empty-field edge cases. The main gaps are lack of explicit return-value information and no mention of `isShared` behavior beyond the schema, but those are minor relative to the rich context provided.

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%, so the baseline is 3, but the description goes far beyond: it explains that `body` is raw HTML, enumerates the full merge-field vocabulary with contextual warnings about ambiguous phone fields, and describes custom field placeholder conventions. This is exactly the kind of parameter meaning an agent needs 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 a specific verb, resource, and endpoint: 'Create a new email template. (POST /templates)'. It clearly distinguishes this from updating templates and from text-message templates by emphasizing email and raw HTML body. Even without reading the schema, an agent knows exactly what the tool does.

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 frames when to use this tool: when creating a new email template via POST /templates. It adds useful guidance by contrasting with notes ('unlike notes, which need isHtml=true explicitly') and by clarifying that this tool only saves text, not sends it. It doesn't explicitly route to sibling tools like update_template or create_text_message_template, but the usage context is clear.

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

create_text_messageA

Create a record of an externally sent text message. (POST /textMessages)

ParametersJSON Schema
NameRequiredDescriptionDefault
messageYesThe body of the text message.
personIdYesThe id of the person associated with the text message.
toNumberYesThe phone number the text message was sent to (e.g., 888-555-1234).
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
fromNumberYesThe phone number the text messages was sent from (e.g., 888-555-9876).
isIncomingNoSet whether the text was outgoing to a person or incoming from a person.
externalUrlNoAn optional link that will appear in the byline of the text message record in the timeline.
externalLabelNoAn optional descriptive text that appears in the byline of the text message record on the person's timeline.

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations, the description carries the behavioral burden. 'Create a record' makes the primary side effect clear and 'externally sent' suggests no actual SMS is dispatched by this tool. But it does not address permissions, error behavior, or what happens with incoming messages despite the isIncoming parameter.

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 sentence with no wasted words, and the essential purpose is front-loaded. Including the POST path is a compact way to ground the tool in the API surface.

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 is a 9-parameter creation action, and the schema covers parameters well, so the description is minimally sufficient. However, it omits any mention of return value or response behavior, and there is no output schema to compensate, leaving some ambiguity about what the caller should expect.

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 all parameters. The description adds no extra meaning about parameter formats, relationships, or usage beyond what the schema already provides, which meets the baseline but does not add value.

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: 'Create a record of an externally sent text message', and includes the POST /textMessages endpoint. This clearly distinguishes the tool from siblings like list_text_messages, get_text_message, and create_text_message_template.

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 phrase 'externally sent text message' implies this tool is for logging texts that were sent outside the system rather than for sending new texts. However, it does not explicitly state when to prefer this tool over get_text_message or create_text_message_template, and it offers no exclusions.

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

create_text_message_templateA

Create a text message template. (POST //textMessageTemplates) FUB templates support %merge_field% placeholders that FUB substitutes when a human actually sends the template (not by this tool — this just saves the template text as-is). Reference: Contact: %contact_name% (full), %contact_first_name%, %contact_last_name%, %contact_email%, %contact_phone%, %contact_address%, %contact_street%, %contact_city%, %contact_state%, %contact_zipcode%, %contact_country%, %contact_rels_first_name% (first names of the contact's linked relationships, e.g. spouse/family added via peopleRelationships). Company (from Admin > Company settings): %company_name%, %company_phone%. Agent / Lender / Sender — same field set, swap the prefix (agent = assigned agent, lender = assigned lender, sender = whoever is actually sending this particular message, which may be neither): %agent_name%, %agent_first_name%, %agent_last_name%, %agent_email%, %agent_phone% (the FUB-assigned calling/texting number), %agent_mobile_phone% (their real/personal number), %agent_merge_field_1% (one free-form field each user sets in My Settings > Other Settings > Edit User Merge Field — commonly a booking link or social profile). ⚠️ %_phone% vs %mobile_phone% is genuinely ambiguous — always confirm with the user which one they mean before using either; picking wrong sends the recipient the wrong callback number. Inquiry (how the contact became a lead, e.g. clicking "Get more info" on a listing site): %inquiry_address%, %inquiry_address_url% (only if the lead source provided one), %inquiry_address_preview% (renders an HTML photo+link box — email only, meaningless in a plain-text SMS template). Recently viewed (populated only when synced with a provider that shares property views): %viewed_address%, %viewed_address_url%, %viewed_address_preview%, %last_5_preview% (up to 5 as HTML boxes, email only). Other: %source_name% (lead source, e.g. "Zillow" — "I saw your inquiry on %source_name%"), %greeting_time% ("Morning"/"Afternoon"/"Evening" based on send time — "Good %greeting_time%, %contact_first_name%"), %tour_time% (populated if the contact scheduled a tour via Zillow). Custom fields: %custom% (e.g. %custom_website%, %custom_birthday%, %custom_spouse_name%). Call list_custom_fields to confirm a field exists — but note its API name (e.g. customBirthday, camelCase) and its merge-field name (%custom_birthday%, snake_case) are different spellings of the same field, and there's no API that returns the merge-field spelling directly, so confirm the exact form with the user (or FUB's own Merge Fields dropdown in the template composer) if it's not obvious from the label. A merge field with no value for a given contact is simply left blank when the template is used — not an error, not a visible placeholder. Texting-specific, per FUB's own Compliance/Carrier Filtering guidance: initial/first-outreach text templates should include opt-out language ("Reply STOP to unsubscribe") and introduce the sender/company by name. Avoid designing a template purely for identical mass-blasting — carriers filter messages that look like spam, personalization (via merge fields) reduces that risk. If the template includes a URL, use the full URL rather than a shortened link, since shorteners are more likely to get carrier-filtered.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe name of your text message template.
messageYesThe body of your text message template.
isSharedNoSet to true if this template should be shared with other users in the same Follow Up Boss account.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations provided, the description carries the full behavioral burden and succeeds impressively. It discloses that placeholder substitution happens later, that unresolved merge fields are left blank rather than causing errors, that some fields are email-only and meaningless in SMS, that phone versus mobile phone is ambiguous, and that carrier-filtering compliance risks exist. This is far beyond a typical create-tool description.

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 long, but the complexity of FUB merge fields justifies most of the length. It is well organized by category (Contact, Company, Agent, Inquiry, etc.), front-loads the core create action and key deferral behavior, and uses warnings and examples to make the dense content scannable. It could be trimmed, but it earns its length.

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 text-template creation tool with no output schema and 5 parameters, the description covers virtually everything an agent needs: merge field syntax, per-context behavior, custom-field lookup guidance, privacy-relevant phone distinctions, compliance best practices, and URL handling. The only minor omission is the API response shape, but that is not critical for a create operation and no output schema is expected.

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

Parameters5/5

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

Although schema coverage is 100%, the description dramatically enriches the semantics of the `message` parameter with a complete merge-field reference, examples, caveats, and compliance guidance. It also clarifies custom-field naming pitfalls and warns about ambiguous phone fields, adding meaning that the schema alone could never convey.

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: 'Create a text message template. (POST //textMessageTemplates)'. The repeated 'text message template' framing and the texting-specific compliance guidance clearly set it apart from generic sibling tools like create_template or merge 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 description establishes clear context: this is for creating a template, not sending it, and it explains what the tool does not do ('FUB substitutes when a human actually sends the template — not by this tool'). It does not explicitly name sibling alternatives like update_text_message_template, but the creation scope and endpoint make the usage context unambiguous.

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

create_webhookB

Subscribe to a new webhook. (POST /webhooks)

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesThe url of the webhook. Must be a secure endpoint (https).
eventYesThe event the webook responds to. This should be one of the following: `peopleCreated`, `peopleUpdated`, `peopleDeleted`, `peopleTagsCreated`, `peopleStageUpdated`, `peopleRelationshipCreated`,`peopleRelationshipUpdated`,`peopleRelationshipDeleted`, `notesCreated`, `notesUpdated`, `notesDeleted`, `emEventsOpened`, `emEventsClicked`, `emEventsUnsubscribed`, `tasksCreated`, `tasksUpdated`, `tasksDeleted`, `appointmentsCreated`, `appointmentsUpdated`, `appointmentsDeleted`, `textMessagesCreated`, `textMessagesUpdated`, `textMessagesDeleted`, `callsCreated`, `callsUpdated`, `callsDeleted`, `dealsCreated`, `dealsUpdated`, `dealsDeleted`, `emailsCreated`, `emailsUpdated`, `emailsDeleted`, `eventsCreated`, `stageCreated`, `stageUpdated`, or `stageDeleted`
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

B3.4/5.0
Behavior2/5

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

No annotations are provided, so the description must carry the full burden. It discloses the action ('subscribe') but does not describe side effects, idempotency, response behavior, or any requirements (e.g., authentication, rate limits). For a creating tool, this is a minimal disclosure.

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 extremely concise: 'Subscribe to a new webhook. (POST /webhooks)' – six words, front-loaded, with zero filler. It efficiently conveys the core action and endpoint.

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

Completeness2/5

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

For a tool with no annotations, no output schema, and four parameters including open object fields (extraBody, extraQuery), this description is too sparse. It doesn't explain the response format, how to handle the extra raw fields, or any behavioral caveats, leaving the agent under-informed for correct invocation.

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

Parameters3/5

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

Schema description coverage is 100%, and each parameter already has a descriptive schema definition. The tool description adds no parameter-level information, 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 states a specific verb ('Subscribe') and resource ('new webhook'), and the HTTP method POST clarifies it is a creation endpoint. This clearly distinguishes it from siblings like update_webhook, list_webhooks, or get_webhook.

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 word 'new' implies this is for creating a webhook, and the sibling names suggest there are update/list/get variants. However, the description gives no explicit guidance on when to choose this over alternatives, no prerequisites, and no exclusions.

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

get_appointmentC

Retrieve an appointment by id. (GET /appointments/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

C2.8/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It only says 'Retrieve an appointment by id', which implies read-only but doesn't disclose any side effects, required permissions, error behavior, or response format. For a simple GET it is minimally acceptable, but it fails to add any context beyond the action itself.

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 with the endpoint included, front-loaded and free of fluff. It is appropriately sized for a simple retrieval operation; no unnecessary detail dilutes the message.

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

Completeness2/5

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

With no output schema, no annotations, and incomplete parameter coverage, the description leaves out essential context. It doesn't mention what the response contains, that extraQuery can be used for custom filters, or any limitations. For a tool with a nested object and sibling retrieval tools, this is insufficient for an agent to call it correctly without external knowledge.

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

Parameters2/5

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

The description mentions only 'by id', which is already visible in the schema as the required 'id' property. It does not explain the format or purpose of id, and completely omits the optional 'extraQuery' parameter, which has schema coverage only at 50%. Since schema coverage is low and the description adds no parameter meaning, it fails to compensate.

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 action ('Retrieve') and a specific resource ('an appointment by id'), and even includes the HTTP endpoint. However, it doesn't differentiate from sibling retrieval tools like get_event or get_call, though the name itself is explicit. It is slightly redundant with the tool name but adds the id-based intent.

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 usage guidance is provided beyond the obvious retrieval-by-id action. There is no mention of when to use this vs. alternatives (e.g., list_appointments when id is unknown), nor any exclusions or conditions. The context implies usage but doesn't state it explicitly.

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

get_appointment_outcomeB

Retrieve an appointment outcome by ID. (GET /appointmentOutcomes/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

B3.2/5.0
Behavior2/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It states 'Retrieve' which implies a read-only operation, but it does not disclose potential behaviors such as 404 handling, auth requirements, rate limits, or what fields are returned. The description adds little beyond the obvious semantics of a GET-by-ID request.

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 the key information front-loaded. Including the HTTP endpoint is a small, useful addition. There is no wasted text.

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 simple get-by-ID tool, the description is minimally viable: it names the resource and the lookup key. However, with no output schema and no annotations, it leaves the return shape and error behavior unspecified. Given the extraQuery parameter and the generic nature of the schema description, more contextual detail would help an agent invoke this correctly, but the tool is simple enough that the description is adequate but not complete.

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

Parameters2/5

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

Schema description coverage is only 50% (the 'id' parameter has no description in the schema). The description repeats 'by ID' but adds no new meaning about the parameter's format or source. The extraQuery parameter is already documented in the schema, and the description does not clarify how it applies to this specific endpoint. Since the description must compensate for the incomplete schema coverage and does not, this is a significant gap.

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

Purpose5/5

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

The description states a specific verb and resource: 'Retrieve an appointment outcome by ID'. This clearly distinguishes it from sibling tools like list_appointment_outcomes (list), create_appointment_outcome (create), and update_appointment_outcome (update). The HTTP endpoint reinforces the intent without ambiguity.

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 is provided on when to use this tool versus alternatives. It does not mention that you should use it when you already have a specific appointment outcome ID, nor does it reference list_appointment_outcomes for searching without an ID. The usage context is only implied by the phrase 'by ID'.

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

get_appointment_typeC

Retrieve an appointment type by ID (GET /appointmentTypes/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It discloses the HTTP method (GET) and resource path, which implies a read operation, but it does not describe error behavior, authentication requirements, or what happens if the ID does not exist. The description adds minimal behavioral context beyond the endpoint itself.

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 sentence that is concise and front-loads the core action. It includes the HTTP endpoint, which is useful but slightly redundant with the tool name. No wasted words, though it could have used the space to add usage guidance.

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

Completeness2/5

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

For a simple read-by-ID tool, the description is minimal but not entirely inadequate. However, with no annotations, no output schema, and an undocumented 'id' parameter, an agent lacks information about expected return values, error cases, and parameter format. The sibling list_appointment_types suggests this is part of a CRUD family, but the description does not clarify how this tool fits.

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 50%: the 'id' parameter has no description in the schema, and 'extraQuery' has a detailed description. The tool description does not explain the 'id' parameter format or that it is the appointment type identifier, though the endpoint path implies it. The 'extraQuery' parameter is well-documented in the schema, so the description adds little beyond what the schema already provides.

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

Purpose4/5

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

The description states a specific verb ('Retrieve') and resource ('appointment type by ID'), and includes the HTTP endpoint (GET /appointmentTypes/{id}) which makes the operation unambiguous. It doesn't explicitly distinguish from sibling tools like get_appointment or list_appointment_types, but the resource and ID-based lookup are clear 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?

No guidance is provided about when to use this tool versus alternatives. The description does not mention that list_appointment_types should be used for browsing or that get_appointment is for individual appointments, not appointment types. An agent must infer usage from the name and endpoint alone.

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

get_automationC

Retrieve an Automation by ID. (GET /automations/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

C2.8/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals the HTTP method 'GET,' which implies a read operation, but it does not describe the response format, error behavior, authentication requirements, or any side effects. This is minimal coverage for a tool with no structural safety hints.

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 sentence plus the endpoint, with no filler or redundancy. It is front-loaded with the action and resource, and every token contributes to identifying the tool.

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

Completeness2/5

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

Given the absence of annotations and output schema, plus the presence of a nested extraQuery parameter and many automation-related siblings, this description is too thin. It does not clarify what an Automation is, what the response looks like, how extraQuery applies here, or when this tool should be preferred over list_automations or get_automations_person.

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

Parameters2/5

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

Schema coverage is only 50%, and the description adds little beyond clarifying that 'id' is the identifier used in the URL. The extraQuery parameter is left to the schema's generic description, which gives examples for /people or /deals but no automation-specific context. The description does not compensate for the uncovered parameter semantics.

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

Purpose4/5

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

The description states a clear verb and resource: 'Retrieve an Automation by ID,' reinforced by the explicit 'GET /automations/{id}' endpoint. It is unambiguous about what the tool does and the 'by ID' scope helps distinguish it from list-style tools, though it does not explicitly differentiate from siblings like list_automations or get_automations_person.

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 usage guidance is provided. The description does not say when to use this tool versus list_automations, nor does it mention alternatives or conditions for choosing a different automation-related tool. The agent is left to infer usage from the endpoint alone.

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

get_automations_personB

Retrieve an Automation-Person pairing. (GET /automationsPeople/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

B3.2/5.0
Behavior2/5

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

No annotations are provided, so the description must carry the burden of behavioral disclosure. It only says 'Retrieve' and shows a GET endpoint, which implies a read operation, but it does not disclose possible missing-resource behavior, permission requirements, or how extraQuery interacts with the request. This is minimal rather than informative.

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 sentence plus endpoint reference, with no filler. Every word contributes to identifying the operation and the path.

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 simple by-id retrieval tool, the description plus schema is minimally sufficient to attempt a call, since the only required input is the id. However, without annotations or usage guidance, an agent still lacks guidance on behavior, alternatives, or expected edge cases. It is adequate but thin.

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

Parameters2/5

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

The schema describes extraQuery but not the required id parameter, giving 50% coverage. The description only echoes the endpoint placeholder 'id' without explaining what the id refers to beyond 'pairing. It does not compensate for the undocumented required parameter.

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 ('Retrieve') and a specific resource ('Automation-Person pairing'), with an explicit endpoint. This clearly distinguishes it from siblings like get_automation, get_person, and list_automations_people, which concern 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 Guidelines2/5

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

The description gives no guidance about when to use this tool versus alternatives such as list_automations_people, create_automations_person, or update_automations_person. Usage is only implied by the name and endpoint, with no exclusions or alternative routing.

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

get_callB

Retrieve a call by id. (GET /calls/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

B3.1/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It only states a read operation ('Retrieve') without detailing any potential side effects, authentication requirements, rate limits, or error behavior. For a tool with no annotation coverage, this is a significant gap.

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, front-loaded sentence with no extraneous words. It efficiently conveys the core purpose and includes the HTTP endpoint for extra context, earning a perfect score for conciseness.

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 simple get-by-id operation with one required parameter, the description suffices to invoke the tool. However, without an output schema and no annotation hints, an agent lacks information about return format, error conditions, or authentication requirements. The description is adequately minimal but not complete given the absence of structured metadata.

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 description references the 'id' parameter ('by id') but adds no additional meaning beyond the schema. The extraQuery parameter is covered in the schema but not mentioned in the description. Given 50% schema coverage, the description does not compensate for the unaddressed parameter semantics.

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

Purpose4/5

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

The description clearly states the action ('Retrieve a call') and the resource ('by id'). It is unambiguous and distinguishes from other get tools by specifying 'call'. However, it doesn't explicitly differentiate from similar list or search tools, though the intent is obvious.

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 provides no guidance on when to use this tool versus alternatives like list_calls or update_call. It lacks any mention of prerequisites, context, or conditions that would help an agent decide between this and other call-related operations.

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

get_custom_fieldB

Get a custom field by id. (GET /customFields/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It only says "Get," implying a read, but does not disclose idempotency, error behavior, permissions, or whether the resource could differ from related custom-field tools. It adds no meaningful behavioral context beyond the action itself.

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, efficient sentence with the endpoint appended as a useful reference. No filler or redundant wording; it is front-loaded with the primary action.

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 this simple read operation with a required id and an optional extraQuery parameter, the description covers the core action but lacks any behavior/usage context. It is minimally viable: an agent can infer the basic call, but would still need schema details for extraQuery and would not know about error cases or alternative tools.

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 phrase "by id" clarifies that the id parameter is a resource identifier, which the schema does not describe. However, the extraQuery parameter is left entirely to the schema, and with only 50% schema coverage the description could have done more to explain how to use it or when it might be needed. This is adequate but minimal.

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?

Clear and specific: "Get a custom field by id" states a direct verb and resource, and the endpoint (GET /customFields/{id}) confirms the target. It distinguishes from list_custom_fields by specifying a single id, but does not explicitly contrast with get_deal_custom_field, which is a sibling with a similar name.

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 usage guidance is provided. The description only states what the tool does, not when it should be used over alternatives like list_custom_fields or get_deal_custom_field, nor any context about common scenarios or required prerequisites.

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

get_dealA

Retrieve a deal by id. (GET /deals/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

A3.8/5.0
Behavior3/5

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

No annotations are provided, so the description carries the burden of behavioral disclosure. It discloses the HTTP method GET, signaling a read-only operation, but it does not describe the return payload, potential errors, permissions, or rate limits. That is minimal but adequate for a simple fetch-by-id tool.

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 the endpoint included. It has no filler and front-loads the core behavior immediately.

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 straightforward by-id retrieval with no output schema, stating the endpoint and required id is sufficient for invocation. It does not explain response fields, but that is not strictly necessary for a GET-by-id operation. The context is complete enough in context of its simplicity.

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 50%; the id parameter itself has no schema description, so 'by id' at least connects it to the deal resource. The extraQuery parameter is already well documented in the schema, and the description adds no further parameter meaning. This is adequate but not enriching.

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 the exact operation: retrieve a single deal by id, and includes the endpoint GET /deals/{id}. This is clear, specific, and easily distinguished from list_deals (listing a collection) and update_deal (a mutation).

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 phrase 'by id' implies this is the correct tool when a deal identifier is already known, as opposed to searching or filtering via list_deals. However, there is no explicit when/when-not guidance or mention of alternatives, so it relies on inference.

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

get_deal_attachmentC

Get a deal attachment by id. (GET /dealAttachments/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

C2.9/5.0
Behavior2/5

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

Annotations are absent, so the description carries the full burden of behavioral disclosure. The embedded HTTP method 'GET /dealAttachments/{id}' hints at read-only semantics, which is some value. However, it says nothing about auth/permission requirements, 404 or error behavior for missing ids, rate limits, or whether the response contains metadata versus binary content — significant gaps for a fetch 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?

One short sentence with zero filler, front-loaded with the action verb and resource. The HTTP endpoint hint is a compact, useful addition. Nothing in the description is wasted.

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 simple get-by-id operation with two parameters, the core action is adequately stated. But with no output schema, no annotations, and no behavioral description, an agent cannot know what the tool returns, how to handle a missing id, or what extraQuery filters actually do to the fetch. Adequate for invoking, incomplete for confident correct use.

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

Parameters2/5

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

Schema coverage is only 50%; the required 'id' parameter has no schema description and the tool description adds only 'by id' to clarify it is the lookup key. The extraQuery parameter is already well-documented in the schema with an example, so the description adds no value there. The description does not fully compensate for the undocumented id parameter.

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

Purpose4/5

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

The description states a clear verb+resource ('Get a deal attachment by id') so an agent knows the operation. It implicitly distinguishes from siblings like create_deal_attachment, update_deal_attachment, and get_person_attachment via the verb and 'deal' scope, but it never explicitly names or contrasts those siblings, so differentiation is left to inference.

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

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 (e.g., get_person_attachment for person attachments, or list_deals to find an id first). No preconditions, no when-not-to-use, and no exclusions are stated. The agent must guess when this tool is the right choice among the 100+ siblings.

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

get_deal_custom_fieldB

Get a deals custom field by ID. (GET /dealCustomFields/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

B3.3/5.0
Behavior3/5

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

With no annotations, the description carries the disclosure burden. It reveals the HTTP method (GET) and that the operation is a read, but it says nothing about permissions, error behavior, or response format. The endpoint and 'by ID' provide minimal behavioral context without fully disclosing 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 sentence plus the endpoint, with no filler or duplicated information. Important scoping information (by ID) is front-loaded, and the endpoint adds precision without bloating the text.

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 simple 2-parameter GET tool, the description is minimally sufficient, but there is no output schema and the description does not state what the response contains or any error/edge-case behavior. It also lacks the sibling differentiation needed to make context 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 coverage is 50%: extraQuery is documented in the schema, while id is not. The description's 'by ID' adds a small amount of meaning by indicating the id parameter is the target custom field's identifier, but it does not compensate for the missing id docs or explain how extraQuery relates to the operation.

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 uses a clear verb ('Get') and a specific resource ('a deals custom field'), and the endpoint path clarifies it targets a single custom field by ID. It doesn't explicitly distinguish itself from sibling get_custom_field or list_deal_custom_fields, so it isn't a 5, but there is no ambiguity about the operation's core purpose.

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 is given about when to use this tool versus either get_custom_field or list_deal_custom_fields, nor any prerequisites or context. The only implied usage is retrieving one custom field if the caller already has an ID.

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

get_eventA

Retrieve a single event by id. (GET /events/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

A3.5/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It discloses the HTTP method (GET) which implies a read-only operation, but it does not state what happens if the id is not found (404 vs empty), whether the response is a single object or wrapped, or any rate-limit/auth behavior. For a simple read tool this is a moderate gap.

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 sentence, front-loaded with the action and resource, and includes the HTTP endpoint as a compact disambiguator. No wasted words.

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 simple single-resource GET with one required parameter, the description plus schema is mostly sufficient. However, with no output schema and no annotations, an agent is left guessing about the return shape and error behavior. The extraQuery parameter is well-documented in the schema, so that gap is covered. Overall adequate but not 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 50%: the 'id' parameter has no description beyond its type, and 'extraQuery' has a detailed description. The tool description adds no parameter-level meaning beyond the schema. The 'id' parameter's semantics are implied by the description ('by id'), but the schema already names it. Baseline 3 is appropriate because the schema covers half the parameters and the description clarifies the id's role.

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 ('Retrieve'), a specific resource ('a single event'), and the identifier ('by id'). It also includes the HTTP endpoint (GET /events/{id}), which disambiguates it from sibling tools like list_events, get_call, and get_task. This is a clear, distinct purpose.

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: call this when you need one event by its id, versus list_events for multiple events. However, it does not explicitly state when to prefer this over alternatives, nor does it mention any exclusions or prerequisites (e.g., event must exist, id required). The context is clear but not explicit.

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

get_groupB

Retrieve a group by id. (GET /groups/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

B3.2/5.0
Behavior3/5

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

With no annotations provided, the description carries the behavioral disclosure burden. The GET method and the verb 'Retrieve' make the read-only nature clear, which is valuable. However, the description does not disclose what happens on missing ids, the response format, or any pagination/query behavior beyond the endpoint.

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 and the endpoint with no filler. It is appropriately sized for a simple retrieval operation.

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 get-by-id tool, the description plus schema covers the essential call mechanics: the HTTP method, the resource, and the required id parameter. It is slightly incomplete because it does not clarify how this relates to list_groups or get_groups_round_robin, but nothing critical is missing for making a basic successful call.

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

Parameters2/5

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

The description adds no meaning to the parameters. The schema already documents extraQuery in detail, but the required 'id' parameter has no semantic explanation beyond its type, and the description does not compensate for that gap. With only 50% schema description coverage, parameters are only partially clarified.

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 ('Retrieve'), resource ('group'), and lookup key ('by id'), and includes the REST path GET /groups/{id}. It is clear on its own but does not explicitly distinguish itself from sibling tools like list_groups or get_groups_round_robin, 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 Guidelines2/5

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

No guidance is given on when to use this tool versus alternatives. The description implies that you should use it when you already have a group id, but it never names alternatives such as list_groups or get_groups_round_robin, nor does it mention any exclusion conditions.

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

get_groups_round_robinC

Lists groups and includes round-robin data. (GET /groups/roundRobin)

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoSorts results based on the provided field name. Prepending the field with a minus sign (-) sorts the results in descending order.
typeNo`Agent` groups allow admins and agents and `Lender` groups allow lender role users.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

C2.9/5.0
Behavior2/5

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

No annotations exist, so the description carries the full disclosure burden. It reveals the endpoint and the presence of round-robin data but does not explain pagination, response shape, permission requirements, or whether this is read-only beyond the implied GET.

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?

Two short clauses with no filler; the main purpose appears immediately and the endpoint is useful context. Information is compact, though some behavioral details are sacrificed.

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

Completeness2/5

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

The tool has no output schema and no annotations, so a bare statement that it returns round-robin data is incomplete. An agent is left to guess what the additional data looks like and how list_groups differs beyond naming, especially with a sibling list_groups available.

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 sort, type, and extraQuery well. The description adds no param-level detail, but it does not need to; baseline 3 is appropriate.

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

Purpose4/5

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

Clearly identifies the operation with a specific verb ('Lists groups') and a distinguishing feature ('includes round-robin data'), reinforced by the endpoint '(GET /groups/roundRobin)'. It is distinct from sibling list_groups by that feature, though it could more explicitly contrast the two.

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 choose this tool over list_groups or other listing tools. The description implies use when round-robin data is needed, but does not state exclusions or alternatives.

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

get_identityB

Get identity and authentication information. (GET /identity)

ParametersJSON Schema
NameRequiredDescriptionDefault
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

B3.1/5.0
Behavior2/5

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

With no annotations, the description carries the full burden, but it only states that this is a read operation returning identity/authentication information. It does not disclose what the response contains, whether authentication credentials are required, or any potential side effects or limitations.

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 extremely concise with no filler. The verb, resource, and endpoint are front-loaded, and every fragment adds 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?

For a simple read-only tool with no required parameters, the description is minimally sufficient. However, the lack of an output schema and any behavioral detail means an agent cannot predict exactly what identity or authentication information will be returned.

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 full documentation of the single optional parameter, extraQuery, including its purpose and behavior. The description adds no parameter-specific details, so the baseline score of 3 is appropriate.

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

Purpose4/5

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

The description clearly states the operation and resource: 'Get identity and authentication information' and includes the HTTP endpoint '(GET /identity)'. This is specific and not a tautology, though it does not explicitly differentiate itself from siblings like get_me or get_user.

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 is provided about when to use this tool versus alternative identity-related tools such as get_me, get_user, or list_users. The description states what the tool does but gives no context for selection or exclusions.

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

get_inbox_apps_conversations_participantsC

Retrieves participants in an Inbox App conversation. (GET /inboxApps/{inboxAppId}/conversations/{extConversationId}/participants)

ParametersJSON Schema
NameRequiredDescriptionDefault
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
inboxAppIdYes
extConversationIdYes

TDQS

C2.7/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the operation is a retrieval, which implies read-only, but it does not disclose behavior like whether only certain participant types are returned, permission requirements, pagination, or what happens if the conversation has no participants. The bare HTTP path is weak compensation for the missing annotation safety profile.

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, compact sentence with the HTTP endpoint included for reference. It is front-loaded with the verb and resource, and every word earns its place. It could arguably be shorter by omitting the endpoint, but the endpoint is useful disambiguation for API-fluent agents.

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

Completeness2/5

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

For a simple GET tool with three parameters, the description is thin. There is no output schema and no annotations, so the description must convey what the agent should expect: the shape of returned participant data, any pagination, or relationship to the sibling POST variant. It only covers the basic operation, leaving the agent to guess at response format and edge cases.

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

Parameters2/5

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

Schema description coverage is only 33%: inboxAppId and extConversationId have no parameter descriptions, and the description text does not explain their semantics beyond the URI template. The extraQuery parameter is well described in the schema, so that parameter carries itself, but the two required identifiers are opaque. The description adds no meaning for the two most important parameters.

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 the action ('Retrieves participants') and the specific resource ('an Inbox App conversation'), and the HTTP path adds precision. It is distinct from the sibling post_inbox_apps_conversations_participants, which would add participants, so purpose is clear and 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?

There is no explicit guidance on when to use this tool versus siblings like post_inbox_apps_conversations_participants or update_conversation. The HTTP method GET implies a read operation, but the description does not state this is for viewing participants only, nor does it mention any prerequisites (e.g., inbox app must be installed/conversation must exist).

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

get_installed_appB

Lists Inbox App installation(s) and ID(s) for your Published Inbox App on the current FUB account. (GET /inboxApps/installedApps/{publishedInboxAppId})

ParametersJSON Schema
NameRequiredDescriptionDefault
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
publishedInboxAppIdYes

TDQS

B3.1/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It discloses that this is a read-only 'Lists' operation and includes the GET endpoint, which is useful. However, it does not mention authentication, scoping edge cases, pagination, or what an 'installation' entails.

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 focused sentence that front-loads the purpose and appends the endpoint for disambiguation. There is no 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?

Given the tool's simplicity, the description conveys the core operation and return concept (installation(s) and ID(s)). However, with no annotations, no output schema, and incomplete parameter semantics, an agent still lacks some context about response shape and edge behavior.

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

Parameters2/5

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

Schema coverage is only 50%, and the required publishedInboxAppId has no schema description. The tool description only marginally compensates by referencing 'your Published Inbox App' and showing the endpoint placeholder; it does not clearly define the parameter's meaning or the extraQuery behavior beyond what the schema already 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 names the operation ('Lists') and the specific resource ('Inbox App installation(s) and ID(s)') scoped to the current FUB account's Published Inbox App. It is understandable on its own, though it does not explicitly distinguish itself from related inbox-app siblings like post_inbox_apps_install.

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 is given about when to use this tool versus alternatives, nor when not to use it. The phrase 'for your Published Inbox App' hints at context, but there are no exclusions, prerequisites, or sibling comparisons to help an agent choose confidently.

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

get_meB

Retrieve information about the currently authenticated user. (GET /me)

ParametersJSON Schema
NameRequiredDescriptionDefault
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

B3.3/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It implies a read operation ('Retrieve') but does not explicitly state it is read-only, nor does it mention authentication, rate limits, or error behavior. It adds little beyond the endpoint itself, leaving agents to infer the operational 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 concise sentence, front-loading the core purpose. It includes the endpoint in parentheses for reference without unnecessary verbosity. 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 simple tool with one optional parameter and no required fields, the description is minimally sufficient. However, it omits any details about the response format, authentication implications, or potential errors. Given the lack of an output schema and annotations, a bit more context about expected behavior would make it more complete, but the tool's simplicity keeps it at a moderate level.

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 description does not mention the extraQuery parameter at all, but the input schema provides a detailed description of it. Since schema coverage is 100%, the schema adequately explains the parameter. The description adds no additional semantic value beyond what the schema already provides, matching the baseline for high 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 states a specific verb ('Retrieve'), resource ('information about the currently authenticated user'), and endpoint ('GET /me'). This is clear and distinguishes it from siblings like get_user, which targets a specific user. The tool name reinforces the meaning.

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 is provided on when to use this tool versus alternatives. There is no mention of prerequisites, authentication requirements, or situations where get_user or list_users would be more appropriate. The description is purely a statement of function with no usage context.

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

get_noteA

Retrieve a note by id. (GET /notes/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
includeReactionsNoWhen set to true, will include the reactions that have been left on the note (as well as the replies if those have also been requested). Reactions are keyed by the emoji reaction. The value is an array of user IDs who have left that reaction.
includeThreadedRepliesNoWhen set to true, will include threaded replies attached to the note. Replies may include HTML tags in their bodies.

TDQS

A3.9/5.0
Behavior3/5

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

With no annotations, the description carries the behavioral burden. 'GET /notes/{id}' and 'Retrieve' convey a read-only fetch, which is useful, but there is no mention of response shape, auth or error behavior, or default inclusions/exclusions beyond what the schema already states.

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 short sentence with an endpoint parenthetical and no filler. The most important scope information ('by id') is front-loaded, and 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 straightforward GET with well-documented optional parameters, the essentials are present. However, with no output schema and no annotations, the description never addresses return content or any special behavior, leaving a noticeable but not severe 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 75%, and the schema already documents extraQuery, includeReactions, and includeThreadedReplies in detail. The description only adds 'by id' for the otherwise undocumented id parameter, which is marginal, 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 description states a specific verb ('Retrieve'), a resource ('note'), and the selection key ('by id'), and it adds the HTTP endpoint for precision. The 'by id' qualifier distinguishes it from list_note/create_note/update_note siblings even without naming them explicitly.

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 'by id' gives clear invocation context: use this when you have a note identifier and want a single note. It does not explicitly name alternatives or exclusions, but the id qualifier is sufficient for basic routing among the sibling tools.

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

get_people_check_duplicateB

Check whether a person exists in Follow Up Boss. (GET /people/checkDuplicate)

ParametersJSON Schema
NameRequiredDescriptionDefault
emailNoThe email address to search for.
phoneNoThe phone number to search for.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

B3.2/5.0
Behavior3/5

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

With no annotations provided, the description carries the full behavioral burden. It discloses that this is a GET-style check operation, which implies a safe, read-only behavior. However, it does not explain matching semantics, response format, or behavior when no identifier parameters are supplied.

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 plus the endpoint reference, with no wasted words or filler. The core purpose is front-loaded and the API path is a useful, non-redundant addition.

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

Completeness2/5

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

The tool has no output schema and no annotations, yet the description does not explain what the duplicate check returns or whether at least one of email/phone is required. Given all parameters are optional in the schema, this could lead an agent to make an invalid or meaningless call.

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 three parameters clearly. The description itself adds no parameter-level meaning, so baseline 3 is appropriate. The extraQuery parameter is well explained in the schema with an example.

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

Purpose4/5

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

The description states a specific action ('Check whether a person exists') and names the exact endpoint it maps to, which clearly identifies the tool's purpose. It does not explicitly differentiate itself from sibling tools like get_person or list_people, though the name and endpoint imply a distinct duplicate-check behavior.

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 instead of get_person, list_people, or create_person, and no context about when duplicate checking is appropriate. It also does not mention prerequisites such as requiring an email or phone number before calling.

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

get_people_relationshipA

Get a specific relationship. (GET /peopleRelationships/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

A3.8/5.0
Behavior3/5

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

No annotations are provided, so the description carries the burden. The 'GET' method makes the read-only behavior clear, but the description does not disclose response shape, error behavior, auth requirements, or how extraQuery affects results.

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, information-bearing sentences with no filler. The action and endpoint are front-loaded and immediately usable.

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 single-resource GET with only one required parameter and an extraQuery fallback documented in the schema, the description is nearly sufficient. It could be improved by naming sibling alternatives, but nothing essential is missing 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?

The description adds the fact that id is a path parameter via the endpoint template, which the schema does not explicitly say. extraQuery is well documented in the schema itself, so the description does not need to repeat 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?

States a specific verb and resource: 'Get a specific relationship' plus the exact endpoint. The word 'specific' distinguishes it from list_people_relationships, and the resource itself separates it from create/update relationship 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?

Usage is implied: use this when you need one relationship by ID, rather than listing relationships. But it does not explicitly name alternatives or state 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.

get_people_unclaimedA

Get unclaimed leads. (GET /people/unclaimed) Defaults to limit=100 (FUB's max per page) rather than its own default of 10 — bulk requests are the common case here. If the response's _metadata shows more results remain, keep paginating: use offset for offset-based endpoints, or the _metadata.next cursor value (as the next argument) for cursor-based endpoints like notes.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of results to return. (Max 100.)
offsetNoSpecifies the number of rows to skip before starting to return results.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

A4/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It openly discloses a notable deviation from the API default: it sets limit=100 (FUB's max) rather than the underlying default of 10, and explains the intent ('bulk requests are the common case here'). It also describes the pagination contract, telling the agent to check _metadata and use offset or the _metadata.next cursor. This is substantial and useful transparency, though it does not explicitly state read-only behavior or any rate-limit/authorization implications.

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 sentences, no wasted words. The first is a clear purpose statement, the second explains the default-limit override with a rationale, and the third provides actionable pagination guidance. Every sentence earns its place, and the most important information is front-loaded.

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 list endpoint with no output schema and three optional parameters, the description gives the essential operational context: what it returns, the altered default, and the pagination mechanics. It does not describe the shape of each returned lead object, but that is likely standard for the API. It also leaves extraQuery usage to the schema alone, which already has a clear description. Overall, the description covers the most important contextual needs for an agent to invoke the tool 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?

All three parameters are already described in the input schema (100% coverage), which sets the baseline at 3. The description adds practical meaning to two of them: it explains why limit defaults to 100 and when to use offset (when _metadata shows more results). This goes beyond the schema's dry definitions. However, it does not mention extraQuery at all, leaving that entirely to the schema description, so it does not fully elevate beyond the baseline.

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

Purpose5/5

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

The description opens with a specific verb-resource pair, 'Get unclaimed leads,' and reinforces it with the API endpoint (GET /people/unclaimed). The qualifier 'unclaimed' cleanly differentiates this from sibling tools like list_people (which retrieves all people) and post_people_claim (which modifies ownership). An agent can immediately understand what the tool does and how it differs from nearby alternatives.

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 explicit guidance on when to prefer this tool over siblings such as list_people, get_person, or post_people_claim. It mentions that bulk requests are common, but that is a default-behavior note, not tool-selection advice. There is no 'use this when...' or 'use this instead of...' framing, leaving the agent to infer the usage context from the name alone.

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

get_personA

Retrieve a person by id. (GET /people/{id}) Use fields to request only what you need instead of full records when scanning many people. For custom fields, call list_custom_fields first to discover the exact field names/labels rather than guessing.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
fieldsNoComma separated list of fields to return. (e.g., `firstName,lastName,timeframeId,timeframeUpdated,timeframeStatus,customFieldName`) <br><br> Special values include `allCustom` (returns all custom fields) and `allFields` (returns all fields, including custom fields).
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

A4.2/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden. It discloses that this is a GET/read operation and hints that full records are the default unless reduced via `fields`. However, it does not mention response shape, error behavior for missing IDs, or permission requirements, which would be valuable for a tool with no annotation safety 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?

Three terse sentences, each earning its place. The primary action is front-loaded, the endpoint is embedded naturally, and the two follow-up sentences provide pragmatic guidance without 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 simple read-by-id tool with no output schema and only three parameters, the description covers the core invocation path and even advises on optimizing payloads and handling custom fields. A minor gap is the absence of any expected return shape or error semantics, but given the tool's simplicity and the guiding notes, it is substantially complete.

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 67%, and the description adds meaningful semantics beyond the schema: it explains why `fields` exists (request only what you need, avoid full records) and warns that custom field names must be discovered via list_custom_fields rather than invented. This goes beyond the schema's bare parameter type 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 + resource ('Retrieve a person by id') and includes the exact endpoint (GET /people/{id}). This clearly distinguishes it from siblings like list_people (collection), update_person (mutation), and get_person_attachment (different resource).

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 explicit guidance on when to use the `fields` parameter ('when scanning many people') and instructs calling list_custom_fields first to discover exact field names rather than guessing. It does not explicitly name alternative tools for this action, but the context is clear enough to route an agent.

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

get_person_attachmentC

Retrieve an attachment by ID. (GET /personAttachments/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

C2.7/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It only states the action and endpoint, without mentioning whether the operation is read-only, any authorization requirements, error behaviors, or what the returned attachment object contains. This is a significant gap for a tool that mutates nothing but still needs context.

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 appropriately brief and front-loads the primary action and resource. It is a single sentence with the endpoint appended, containing no redundancy. However, it omits necessary contextual details, so it is concise but not fully functional.

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

Completeness2/5

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

For a tool with two parameters (including a nested object), no output schema, and no annotations, this description is incomplete. It does not explain what an attachment is, how 'extraQuery' is used, what the response format is, or any special behavior. The agent would have to infer too much, making the description insufficient for confident invocation.

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

Parameters2/5

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

The tool description adds virtually no parameter meaning beyond the schema. The schema already lists 'id' and 'extraQuery', with 'extraQuery' fully described. The description only says 'by ID', which adds little to the schema's explicit parameter list. Given schema coverage is only 50% (no description for 'id'), the description should compensate but does not.

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 the action ('Retrieve') and the resource ('an attachment by ID'), with an explicit endpoint. It is unambiguous about what the tool does, but it does not differentiate itself from sibling tools like get_deal_attachment or get_evidence, relying on the name for context.

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?

There is no guidance on when to use this tool versus alternatives, nor any mention of prerequisites or contextual conditions. The description is purely functional and offers no direction on selecting it among similar retrieval tools, leaving the agent to infer usage.

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

get_pipelineB

Retrieve a pipeline by id. (GET /pipelines/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It only states the HTTP method and resource, which is essentially the same as the tool name. It does not disclose what happens if the id is not found, whether related objects are included, or any response characteristics. For a read operation, this is a minimal but not rich disclosure.

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 sentence with the endpoint included, which is efficient and front-loaded. It earns its place by adding the HTTP method and path, though it is terse. No wasted words.

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

Completeness2/5

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

For a simple get-by-id tool, the description is minimal. There is no output schema, no annotations, and no mention of error behavior or response format. The sibling list is large, and the description does not help an agent distinguish when to use get_pipeline vs list_pipelines. The endpoint is helpful, but the description lacks enough context for an agent to know what to expect.

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 50%: the 'id' parameter has no description, while 'extraQuery' has a detailed description. The description adds no parameter-level meaning beyond the schema. The 'extraQuery' parameter is well explained in the schema, but 'id' is left to the tool name and endpoint. Baseline 3 is appropriate because the schema covers half the parameters well.

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

Purpose4/5

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

The description states a specific verb ('Retrieve') and resource ('pipeline by id'), and includes the HTTP endpoint (GET /pipelines/{id}) which clarifies the operation. It is distinguishable from siblings like list_pipelines and update_pipeline, though it doesn't explicitly name them.

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: use this when you have a pipeline id and need a single pipeline. It does not explicitly state when to use list_pipelines instead, nor does it mention any prerequisites or context. The endpoint hint provides some context but no exclusions or alternatives.

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

get_pondA

Get a pond by id. (GET /ponds/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description must carry behavioral disclosure. It does indicate the HTTP method (GET) and scoping by id, which implies a read-only exact-match retrieval, but it does not mention error cases (e.g., 404) or response shape. For a simple getter this is minimally adequate.

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, and the endpoint is included parenthetically for immediate context. 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 operation, the description plus schema covers the essential parameter (id, with the endpoint), and extraQuery is documented in the schema. Missing details like error handling or return format are not covered, but there is no output schema and the tool is straightforward.

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 50%; only extraQuery is described. The description adds meaning to the 'id' parameter by stating the tool retrieves 'by id', but it does not elaborate on id format or extraQuery. The schema already documents extraQuery, so the description provides marginal value 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 uses a specific verb ('Get) and resource ('pond), and specifies retrieval by 'id', clearly distinguishing it from list_ponds (which lists multiple ponds) and from other resource getters like get_event or get_call. The endpoint '(GET /ponds/{id})' reinforces the scope.

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 the tool is for retrieving a single pond when an id is available, which is the context for use. However, it does not explicitly contrast with list_ponds or other alternatives, and provides no exclusion criteria.

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

get_rate_limit_limitsA

Currently-configured rate limits for the calling partner system. Cheaper than /v1/rateLimit/usage (no Redis fan-out). (GET /rateLimit/limits)

ParametersJSON Schema
NameRequiredDescriptionDefault
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description must carry behavioral weight. It does indicate this is a GET, implies read-only behavior, and discloses a performance trait (no Redis fan-out). However, it doesn't mention response shape, whether the call counts against rate limits, or any authentication requirements.

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 resource identity, and uses the endpoint and sibling comparison efficiently. Every sentence adds value with no 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 simple read-only endpoint with one optional parameter, the description covers what the tool returns conceptually and why to prefer it. The absence of an output schema is a minor gap, but the tool's purpose and differentiation are sufficiently clear.

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% for the single parameter, so the schema already documents extraQuery. The description adds no parameter-level detail, which is acceptable given the high schema coverage, so baseline 3 applies.

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

Purpose5/5

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

The description names the exact resource ('currently-configured rate limits') and gives the endpoint path. It also distinguishes itself from get_rate_limit_usage by clarifying this is about configured limits, not usage.

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 concrete selection context by stating this endpoint is cheaper than /v1/rateLimit/usage and why (no Redis fan-out). It doesn't explicitly say 'use usage when you need actual consumption data,' but the contrast is clear enough to guide tool choice.

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

get_rate_limit_usageB

24-hour request volume, rate-limit hits, and currently-configured limits for the calling partner system. (GET /rateLimit/usage)

ParametersJSON Schema
NameRequiredDescriptionDefault
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

B3.4/5.0
Behavior3/5

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

There are no annotations, so the description carries the full burden of behavioral disclosure. It indicates a read-only GET operation and a 24-hour time window, but it does not describe response format, error conditions, authentication, or pagination behavior.

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

Conciseness5/5

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

The description is one concise sentence plus the endpoint path, and the most important information is front-loaded. Every element earns its place without 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 simple read-only tool with no required parameters and a fully documented schema, the description provides the essential semantics: what the tool reports and which endpoint it hits. It is slightly incomplete only because it does not disambiguate from get_rate_limit_limits or describe the response shape.

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% for the single optional extraQuery parameter, and that parameter is already documented with an example and clarification of pass-through behavior. The description itself adds no parameter detail, so the baseline score of 3 is appropriate.

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

Purpose4/5

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

The description states a specific resource (rate limit usage), the HTTP method, and the concrete data it returns: 24-hour request volume, rate-limit hits, and configured limits. It is clear in what the tool does, though it does not explicitly differentiate itself from the sibling get_rate_limit_limits.

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 usage guidance is provided. The description does not say when to prefer this tool over get_rate_limit_limits or any other alternative, nor does it mention prerequisites or call context.

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

get_reactionA

Fetch a reaction (GET /reactions/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

A3.5/5.0
Behavior3/5

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

The description explicitly states 'GET /reactions/{id}', signaling a read-only, side-effect-free operation. However, with no annotations and no output schema, it does not disclose authentication requirements, not-found behavior, or response shape; this is minimally viable but not rich.

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 compact sentence with the action front-loaded and the endpoint appended; there is no filler or repeated information. It earns its place without needing expansion.

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 simple two-parameter GET, the description plus schema is minimally viable. Yet with no output schema or annotations, the agent is left without explicit return-shape, not-found, or authorization context.

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 50%: extraQuery is documented in the schema, while id has only a type. The description adds the meaningful fact that id is a path parameter via /reactions/{id}, but provides no format or constraints beyond that.

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 pairs the verb 'fetch' with the resource 'reaction' and gives the exact endpoint, so the operation is unambiguous. It does not, however, contrast with sibling tools such as create_reaction or other get_* tools, so it stops short of full differentiation.

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?

No alternative tools or when-not-to-use conditions are named; the only guidance is the GET endpoint, which implies the tool is for retrieving a single reaction by ID. This is usable but implicit rather than explicit.

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

get_smart_listB

Retrieve a Smart List by id. (GET /smartLists/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

B3.3/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. 'Retrieve' and 'GET' imply a read-only operation, but the description does not disclose response shape, error behavior, authentication needs, or any other runtime traits.

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 plus a compact endpoint reference. Every element earns its place; there is no redundant or filler content.

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 simple GET-by-id tool this is minimally adequate, but with no output schema and no annotations the description should provide more context about the returned object and any relevant usage caveats. It also omits guidance about the sibling list_smart_lists 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 50%: extraQuery is described but id is not. The description adds some meaning by showing id as a URL path parameter in /smartLists/{id}, but it does not explain what the id corresponds to beyond the resource name.

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

Purpose5/5

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

The description states a specific verb and resource: 'Retrieve a Smart List by id.' The path parameter {id} makes the purpose unambiguous and distinguishes it from list_smart_lists, which lists smart lists rather than fetching one.

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?

There is no guidance about when to use this tool versus alternatives like list_smart_lists. The description only states the operation; it does not say 'use this when you have a specific id' or mention any exclusions.

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

get_stageC

Get a stage by id. (GET /stages/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It only states 'Get a stage by id', revealing nothing about error handling (e.g., 404 when not found), response format, or side effects. The HTTP method GET implies read-only, but that is the extent of behavioral context. The description is not misleading but is severely under-informative.

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, concise sentence with zero filler. It front-loads the core action and includes the HTTP endpoint for clarity. While it is minimal, it is appropriately sized for a straightforward get-by-id operation, earning a high conciseness score despite lacking depth.

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

Completeness2/5

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

This is a simple retrieval tool, but the description is incomplete for an agent to use correctly without additional context. It does not describe the return value (since there is no output schema), nor does it mention error cases, authentication, or related concepts like what constitutes a 'stage' in this API. Sibling tools exist for creating and updating stages, but no cross-references are given. Given the tool's simplicity, the description falls short of what is needed for confident invocation.

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

Parameters2/5

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

Schema description coverage is 50%: the id parameter has no description, and extraQuery does. The tool description does not elaborate on either parameter beyond what the schema provides. Since coverage is low, the description should compensate by explaining id's format or usage, but it does not. The id's meaning is inferable from the name, but extraQuery remains only partially explained by the schema. The description adds no parameter-level value.

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 'Get', the resource 'stage', and the identifier 'by id', making the operation unambiguous. It distinguishes itself from siblings like list_stages (plural), create_stage, and update_stage by specifying a single stage retrieval. The HTTP method (GET /stages/{id}) reinforces the read-only nature.

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?

There is no guidance on when to use this tool versus alternatives. The description does not mention that list_stages should be used to fetch multiple stages, nor does it state any prerequisites or exclusions. For a simple getter, implied usage exists (when you have a stage ID), but the lack of explicit direction leaves agents to infer.

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

get_taskA

Get a task by id. (GET /tasks/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. The explicit GET method and path signal a read-only, idempotent operation, which is useful. However, it does not disclose response shape, error behavior, authentication requirements, or any potential caveats, leaving some behavioral aspects unstated.

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 clauses with no filler. The core action is front-loaded, and the HTTP endpoint provides additional precision 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?

Given the tool's simplicity (one required parameter, no output schema), the description and schema together are largely sufficient for calling the tool. The main gaps are the lack of explicit return value details and any mention of required authentication or edge cases, but these are minor for a straightforward get-by-id 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?

The schema description coverage is 50%; extraQuery is already well-documented with examples, but the id parameter has no schema description. The description's 'by id' clarifies that the id parameter is the task's unique identifier, adding meaning that the schema alone lacks.

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

Purpose5/5

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

The description states a specific verb and resource: 'Get a task by id' and reinforces it with the HTTP endpoint '(GET /tasks/{id})'. This clearly identifies the tool's purpose and distinguishes it from list_tasks and other get_* siblings that target 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 Guidelines3/5

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

The phrase 'by id' implies the tool is used when the caller already has a task identifier, but no explicit guidance is given about when to use this tool versus list_tasks or update_task. There are no named alternatives or exclusions, so the usage context is only implied.

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

get_teamA

Get a team by id. (GET /teams/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

A3.5/5.0
Behavior2/5

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

No annotations are provided, so the description must carry the full behavioral burden. It only says 'Get' and the HTTP 'GET' verb, which implies a read-only operation, but it does not disclose response contents, error behavior, authorization needs, or whether any related data is included. This is minimal and leaves important behavioral context unstated.

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 short, front-loaded, and free of filler. The parenthetical endpoint adds a useful concrete detail without bloating the text. 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 simple single-resource getter with only two parameters, the description is minimally adequate. However, there is no output schema, and the description does not indicate what the response looks like, what errors may occur, or any authentication requirements, leaving the agent with incomplete context for handling the result.

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 50%: extraQuery has a thorough schema description, but id has none. The description's 'by id' adds minimal semantic meaning to the id parameter, and the endpoint path clarifies it is the team identifier. It does not compensate much beyond that, but the required parameter's role is at least implied.

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

Purpose5/5

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

The description states a specific verb and resource: 'Get a team by id.' It clearly distinguishes from sibling tools like list_teams, create_team, and update_team. Adding the explicit endpoint '(GET /teams/{id})' reinforces the exact operation.

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 phrase 'by id' implies the tool should be used when a caller has a specific team identifier and wants the team record. However, it gives no explicit guidance about when to prefer this over list_teams or how it relates to other team-related tools, so routing is left mostly to inference.

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

get_templateA

Retrieve an email template by id, optionally merging fields. (GET /templates/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
mergePersonIdNoWhen specified, the returned template will have its merge fields filled out with the specified person record and the current user record.

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations, the description carries the transparency burden. It discloses that this is a read operation via 'Retrieve' and 'GET', and mentions optional merge behavior. It does not address error responses or confirm whether merging is transient, but for a simple GET the core behavior is clear.

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, front-loaded sentence with the endpoint appended. Every word adds value; there is 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 simple read operation with one required parameter and two schema-documented optional parameters, the description plus schema is enough to call it correctly. There is no output schema, but 'Retrieve an email template' sufficiently indicates the expected result.

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 67%, and the two richer parameters (extraQuery and mergePersonId) are documented in the schema. The description adds minimal extra meaning for id ('by id') and mergePersonId ('optionally merging fields'), which is adequate but not detailed.

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 ('Retrieve') and resource ('email template'), and specifies the lookup mode ('by id'), which separates it from list_templates. The GET endpoint reinforces exactly what operation is performed.

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 when to use the tool (fetching a single template by id, optionally with merge fields), but it does not state when to prefer list_templates or post_templates_merge instead. No exclusions or alternative routing are provided.

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

get_text_messageA

Retrieve a text message by id. (GET /textMessages/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

A3.8/5.0
Behavior3/5

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

There are no annotations, so the description carries the burden of behavioral disclosure. It does indicate a read-only GET operation, but it omits details such as error behavior, authorization requirements, or what is returned when the id does not exist.

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 sentence followed by the endpoint, with no redundant wording. Every part contributes directly to understanding the tool's 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?

For a simple get-by-id operation, the description combined with the schema is sufficient to invoke the tool correctly. The lack of output schema is compensated by the natural expectation that a 'retrieve' operation returns the resource, though a bit more detail about return shape would be ideal.

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 one of two parameters (extraQuery) with a detailed description; the id parameter is not described. The tool description only says 'by id', which minimally clarifies the id's role but adds little beyond the schema. With 50% coverage, more compensation would be expected.

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 a specific verb ('Retrieve') and resource ('a text message by id'), which distinguishes it from sibling tools like get_text_message_template or list_text_messages. The inclusion of the HTTP endpoint further reinforces the exact operation.

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 phrase 'by id' implies this tool is used when a specific text message identifier is known, rather than for listing or searching. However, it does not explicitly mention alternatives like list_text_messages or state when not to use this tool.

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

get_text_message_templateB

Retrieve a text message template by id. (GET /textMessageTemplates/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It only says 'Retrieve' and gives the endpoint; it doesn't disclose whether the template is returned in full, whether deleted templates are included, authentication requirements, or error behavior. For a read operation with zero annotation coverage, this is a notable gap.

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

Conciseness4/5

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

One concise sentence with the endpoint path included. It is front-loaded with the action and resource. The endpoint path is arguably redundant with the tool name but adds useful precision without bloat.

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

Completeness2/5

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

For a simple get-by-id tool with no output schema and no annotations, the description is minimal. It doesn't mention what the response contains, whether extraQuery is needed for this endpoint, or any special behavior. Given the sibling list includes both get_template and get_text_message_template, more context about template types would help.

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 50%: the 'id' parameter is documented only by name/type, and 'extraQuery' has a rich description. The description adds no parameter-level meaning beyond the schema, but the schema already explains extraQuery well. The 'id' parameter's semantics are obvious from the tool name and endpoint, so baseline 3 is appropriate.

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

Purpose4/5

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

The description states a specific verb ('Retrieve') and resource ('text message template by id'), and includes the endpoint path for clarity. It clearly distinguishes from siblings like list_text_message_templates and create_text_message_template, though it doesn't explicitly name them.

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 simple retrieval use case by id, and the endpoint path adds context. However, it doesn't explicitly state when to use this over alternatives like list_text_message_templates or get_template, nor does it mention any prerequisites or exclusions.

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

get_threaded_replyB

Fetches a threaded reply (GET /threadedReplies/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

B3.1/5.0
Behavior3/5

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

No annotations are provided, so the description carries the behavioral burden. It does disclose the HTTP method (GET), which implies a read-only fetch, and gives the exact path. However, it does not mention authentication needs, error behavior, or response shape, leaving some behavioral aspects unstated.

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, front-loaded sentence that communicates the verb, resource, and REST endpoint without any filler. Every word contributes useful information, and the endpoint is provided in a scannable format.

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 simple GET-by-id operation, the description conveys the core call shape. However, with no annotations and no output schema, it leaves some gaps: no response format, no error conditions, and no indication of when a threaded reply context applies. It is minimally viable but not complete.

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

Parameters2/5

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

Schema coverage is only 50%: extraQuery has a useful schema description, but id has no description beyond its type. The description adds only a path-template hint ({id}) and does not explain what the id refers to or how extraQuery should be used. This is insufficient compensation for the undocumented id parameter.

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

Purpose4/5

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

The description states a clear action ('Fetches') and a specific resource ('threaded reply'), and even includes the exact endpoint (GET /threadedReplies/{id}). It does not explicitly distinguish this from the many sibling get_* tools, but the resource is specific enough that an agent can tell what it targets.

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?

There is no guidance about when to use this tool versus any alternative, no context for when threaded replies are relevant, and no exclusions or prerequisites. The description is purely a definition of the operation, leaving all usage decisions to inference.

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

get_userC

Retrieve a user by id. (GET /users/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

C2.6/5.0
Behavior2/5

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

With no annotations provided, the description must carry the full burden of behavioral disclosure. It mentions GET, implying a read-only operation, but does not disclose authentication requirements, error behaviors, return format, or any other behavioral traits. This is minimal and insufficient for a tool with no annotation coverage.

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

Conciseness3/5

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

The description is a single, concise sentence, which earns points for brevity. However, it is too sparse to be 'appropriately sized' – it omits context that would help an agent, making it under-specified rather than efficiently informative.

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

Completeness2/5

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

Given the tool has two parameters, no output schema, and no annotations, the description should provide more context about expected responses, special behaviors, or relationship to similar tools. It does none of this, leaving an agent with only a bare retrieval statement and no additional guidance for correct invocation.

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

Parameters2/5

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

Schema coverage is 50%: the extraQuery parameter has a description in the schema, but id does not. The description adds only that retrieval is 'by id', which is already implied by the required field. It does not compensate for the missing id documentation or clarify how id should be formatted or used, and it ignores extraQuery entirely.

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

Purpose4/5

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

The description states a specific verb (Retrieve) and resource (user by id), and includes the HTTP endpoint (GET /users/{id}) for extra clarity. However, it does not explicitly distinguish from the sibling get_person tool, so it is clear but not fully 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?

The description gives no guidance on when to use this tool versus alternatives like get_me or list_users. It only states what it does, leaving the agent to infer appropriate usage without explicit exclusions or recommendations.

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

get_webhookB

Get details of a specific webhook. (GET /webhooks/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

B3.2/5.0
Behavior3/5

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

With no annotations, the description must carry the behavioral burden. It does disclose a GET/read operation via both the wording 'Get details' and the explicit endpoint '(GET /webhooks/{id})'. However, it does not mention authentication, not-found behavior, or any response shape details.

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 very short and front-loaded, with the core purpose in the first sentence and the endpoint as immediate useful context. It earns its place but is slightly under-specified compared to a more complete concise description.

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 simple get-by-id tool with only two parameters and no output schema, the description is adequate but not complete. It provides the operation and resource, while parameter semantics are split between description and schema, but return format and error conditions are left unspecified.

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 50%; the extraQuery parameter is well-described in the schema, while 'id' is only minimally covered. The description and endpoint add that id identifies a specific webhook, but no format or usage detail beyond that is given.

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 the action ('Get details') and resource ('a specific webhook'), and includes the endpoint path for precision. It distinguishes itself from list_webhooks through 'specific', though it does not explicitly differentiate from sibling get_webhook_event.

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 is given for when to use this tool versus alternatives such as list_webhooks or create_webhook. The description implies 'use this when you need one webhook by ID' but provides no explicit context or exclusions.

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

get_webhook_eventA

Get a list of events for a given webhook. (GET /webhookEvents/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries the burden, and it does disclose that the operation is a read-only GET that returns a list. It does not mention pagination, ordering, permissions, or what an event entry contains, but the GET method plus 'list' gives the essential side-effect 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?

One short sentence plus an endpoint reference; no filler or repetition. The core action is front-loaded and the parenthetical endpoint adds useful specificity without bloat.

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?

This is a minimal viable definition: the tool has only two parameters and the action is simple, but there is no output schema, no annotations, and no guidance on result format or pagination. The sibling list includes closely related tools, so the description alone leaves some routing and return-shape questions open.

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 50%: extraQuery is fully described in the schema, while id has no property description. The description adds value by linking {id} to the webhook in question, but it leaves id's type/format and the purpose of extraQuery for this endpoint to be inferred.

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

Purpose4/5

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

The description names a specific verb and resource: it retrieves a list of events tied to a webhook, and adds the concrete endpoint GET /webhookEvents/{id}. It is clear enough to separate from get_event/get_webhook, but it does not explicitly distinguish itself from sibling list_events.

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 phrase 'for a given webhook' implies the agent should call this when it already has a webhook id and wants that webhook's event history. However, it gives no explicit when-not-to-use guidance or contrast with sibling tools such as list_events or get_webhook.

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

list_action_plansA

Get a list of Action Plans. (GET /actionPlans) Defaults to limit=100 (FUB's max per page) rather than its own default of 10 — bulk requests are the common case here. If the response's _metadata shows more results remain, keep paginating: use offset for offset-based endpoints, or the _metadata.next cursor value (as the next argument) for cursor-based endpoints like notes. ⚠️ Action Plans are a deprecated FUB feature — Automations are the current, recommended mechanism going forward. Unless the user specifically names an existing legacy Action Plan they already rely on, prefer the automationsPerson tools (create_automations_person to trigger one, update_automations_person to pause/unpause) over this one for new workflows.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsNoSearch for Action Plans by `id`. Use a comma separated list, e.g. `/actionPlans?ids=287564,67484,8436437`
sortNoSort Action Plans by a given field. (e.g., "id" or "name")
limitNoNumber of results to return. Max 100.
namesNoSearch for Action Plans by `name`. Use array parameters format with encoded values, e.g. `/actionPlans?names[]=Action%20Plan%20Name%201&names[]=Action%20Plan%20Name%202`.
offsetNoSpecifies the number of rows to skip before starting to return results.
statusNoSearch for Action Plans with one of the following statuses: `Active`,`Deleted`, or `Active,Deleted` (if you want both).
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

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 beyond the schema: it overrides the default limit to 100 (FUB's max) rather than the API's default of 10, and it instructs on pagination behavior using _metadata and offset/next cursor. It also discloses the deprecation status. No annotations are provided, so the description carries the full burden, and it does so well. It doesn't mention rate limits or auth, but the pagination and default-override details are valuable.

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 well-structured and front-loaded with the core purpose, then the default behavior, then pagination, then deprecation warning. It's a bit long but every sentence earns its place—the deprecation warning and pagination guidance are critical for correct usage. The emoji warning is a minor stylistic choice but doesn't hurt clarity.

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 (7 params, nested objects, no output schema), the description covers the key operational details: default limit, pagination, and deprecation. It doesn't describe return values, but with no output schema, that's a minor gap. The deprecation context is especially important for an agent deciding whether to use this tool at all. It's complete enough 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?

Schema description coverage is 100%, so the schema already documents all 7 parameters. The description adds context about the limit default (100 vs 10) and pagination, but doesn't add much per-parameter meaning beyond what the schema provides. Baseline 3 is appropriate since the schema does the heavy lifting.

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: 'Get a list of Action Plans' with the endpoint (GET /actionPlans). It distinguishes itself from siblings by noting the deprecation and recommending automationsPerson tools for new workflows, which helps an agent understand its specific role among the many list_* tools.

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

Usage Guidelines5/5

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

The description provides explicit guidance on when to use this tool vs alternatives: it notes the deprecation of Action Plans, states that Automations are the current recommended mechanism, and explicitly says to prefer create_automations_person and update_automations_person for new workflows unless the user names an existing legacy Action Plan. This is clear when-to-use and when-not-to-use guidance.

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

list_action_plans_peopleA

List Action Plans applied to a particular person or list people on a particular Action Plan. (GET /actionPlansPeople) Defaults to limit=100 (FUB's max per page) rather than its own default of 10 — bulk requests are the common case here. If the response's _metadata shows more results remain, keep paginating: use offset for offset-based endpoints, or the _metadata.next cursor value (as the next argument) for cursor-based endpoints like notes. ⚠️ Action Plans are a deprecated FUB feature — Automations are the current, recommended mechanism going forward. Unless the user specifically names an existing legacy Action Plan they already rely on, prefer the automationsPerson tools (create_automations_person to trigger one, update_automations_person to pause/unpause) over this one for new workflows.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of results to return. Max 100.
offsetNoSpecifies the number of rows to skip before starting to return results.
personIdNoList Action Plans applied to a specified person.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
actionPlanIdNoList People on the specified Action Plan.

TDQS

A4.6/5.0
Behavior4/5

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

With no annotations, the description carries full responsibility. It discloses the deprecation status, the default limit override (100 instead of 10), and the pagination strategy (offset or _metadata.next). It hints at the response containing _metadata but does not fully specify the response structure, which would be expected without an output 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?

Every sentence serves a purpose: purpose, endpoint, default override, pagination instructions, and deprecation warning with alternative tools. Information is front-loaded, and there is no fluff. The length is justified by the tool's complexity.

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 (5 parameters, two modes, pagination, deprecation), the description covers most essentials: what it does, when to use it, pagination, and alternative tools. However, it does not explicitly state the response format (e.g., array of people or action plans) or error conditions, which would be helpful without an output schema.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description adds value by explaining why limit defaults to 100 (bulk common case), how extraQuery can pass custom fields, and the dual-mode usage (personId vs actionPlanId). This goes beyond the schema's minimal descriptions, making the parameters more actionable.

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 two distinct actions: listing Action Plans for a person or listing people on an Action Plan. It also includes the endpoint and differentiates from related tools by noting deprecation and pointing to automations. This gives an agent a clear, unambiguous understanding of the tool's scope.

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 when-to-use guidance: use for legacy Action Plans only if the user names one, otherwise prefer automationsPerson tools. It also explains pagination behavior (offset vs cursor) and the default limit override, leaving no ambiguity about how to call it correctly.

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

list_appointment_outcomesA

List appointment outcomes. (GET /appointmentOutcomes) Defaults to limit=100 (FUB's max per page) rather than its own default of 10 — bulk requests are the common case here. If the response's _metadata shows more results remain, keep paginating: use offset for offset-based endpoints, or the _metadata.next cursor value (as the next argument) for cursor-based endpoints like notes.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoThe sort order can be one of the following: `id`, `name`, `orderWeight` (Note: Prefix the string with a minus (`-`) to sort in descending order (e.g., `-orderWeight`)).orderWeight
limitNoNumber of results to return. Max 100.
offsetNoSpecifies the number of rows to skip before starting to return results.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations provided, the description carries behavioral disclosure itself. It goes beyond the schema by explaining that the default limit is intentionally set to 100 for bulk use cases and by describing how to continue paginating via _metadata using offset or cursor-based next. This is meaningful behavioral context, though it stops short of describing response structure 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 compact and front-loaded with the core purpose. Both sentences earn their place: the first states the operation and default behavior; the second provides actionable pagination guidance. There is no redundant or filler content.

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 list endpoint with no output schema and no annotations, the description covers the important operational details: endpoint, intentional default, and pagination loop. It could be more complete by briefly indicating the response shape, but the provided guidance is sufficient for an agent to call the tool correctly and handle paging.

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 description adds useful workflow context around pagination and the limit default, but it does not add substantially new meaning to individual parameters beyond what the schema already documents.

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 verb and resource: 'List appointment outcomes' with the endpoint GET /appointmentOutcomes. It distinguishes itself concept from sibling create/get/update operations, though it doesn't explicitly contrast with those sibling 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 gives clear context that bulk requests are the common case and explains default pagination behavior. However, it does not explicitly state when to use this tool versus get_appointment_outcome or create_appointment_outcome, leaving the usage distinction to be inferred from the tool name.

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

list_appointmentsA

Search for appointments. (GET /appointments) Defaults to limit=100 (FUB's max per page) rather than its own default of 10 — bulk requests are the common case here. If the response's _metadata shows more results remain, keep paginating: use offset for offset-based endpoints, or the _metadata.next cursor value (as the next argument) for cursor-based endpoints like notes.

ParametersJSON Schema
NameRequiredDescriptionDefault
endNoDate and time representing the end of a date/time range for which to search (must be combined with the `start` argument).
limitNoNumber of results to return. Max 100.
startNoDate and time representing the start of a date/time range for which to search (must be combined with the `end` argument).
offsetNoSpecifies the number of rows to skip before starting to return results.
userIdNoFind all appointments related to a user by id.
personIdNoFind all appointments related to a person. (Note: This can be comma separated list to search multiple users.)
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description carries the burden of behavioral disclosure. It reveals non-obvious behavior: the default limit is deliberately set to 100 (the API max) instead of 10, and it instructs how to continue pagination using offset or cursor values. It stops short of explicitly stating read-only semantics, permissions, or response format, but the GET method and 'search' imply read-only.

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 with a clear front-loaded purpose. Each sentence contributes either purpose, default behavior, or pagination. The mention of 'like notes' in the pagination sentence is slightly extraneous and could be simplified, but overall it is efficient and well-structured.

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 search tool with 7 optional parameters and no output schema, the description covers the essential behavior: pagination and the default limit. It does not explain the response shape, but the resource name implies a list of appointment objects, and the schema already documents parameter semantics. The absence of output schema makes a 4 appropriate – useful gaps remain (e.g., response format, combining start/end), but they are partially covered by the schema descriptions.

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% (all parameters have descriptions), so baseline is 3. The description adds value by explaining why the limit default is overridden (FUB's max) and clarifies how offset/next map to pagination modes. This goes beyond the schema's basic parameter descriptions, earning a 4.

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: 'Search for appointments,' and the plural resource name combined with the parenthetical GET /appointments clearly distinguishes it from siblings like get_appointment (single resource) and list_appointment_types (different resource). An agent can immediately tell this lists appointment records.

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 clear context that the tool is optimized for bulk requests ('bulk requests are the common case here') and explains the pagination strategy for retrieving all results. However, it does not explicitly name alternatives or state when to use get_appointment for a single appointment, so it stops short of full when/when-not guidance.

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

list_appointment_typesA

List appointment types. (GET /appointmentTypes) Defaults to limit=100 (FUB's max per page) rather than its own default of 10 — bulk requests are the common case here. If the response's _metadata shows more results remain, keep paginating: use offset for offset-based endpoints, or the _metadata.next cursor value (as the next argument) for cursor-based endpoints like notes.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoThe sort order can be one of the following: `id`, `name`, `orderWeight` (Note: Prefix the string with a minus (`-`) to sort in descending order (e.g., `-orderWeight`)).orderWeight
limitNoNumber of results to return. Max 100.
offsetNoSpecifies the number of rows to skip before starting to return results.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations provided, the description carries the behavioral disclosure burden. It meaningfully discloses that the default limit is changed to 100, that pagination may be needed when _metadata indicates more results, and how to continue with offset or cursor. This goes well beyond what the schema alone conveys.

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 no filler. The core purpose and endpoint are front-loaded, followed by high-value default and pagination behavior. Every clause contributes operational guidance.

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 list tool with no required parameters and fully documented schema, the description covers the endpoint, default behavior, and pagination strategy. It does not describe response fields, but with no output schema that would be a nice-to-have rather than a critical missing piece.

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 extra value by explaining the practical default behavior for `limit`, and by clarifying when to use `offset` versus the cursor-style `next` argument, which is not even present in 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 a clear verb and resource: 'List appointment types', followed by the exact endpoint. This unambiguously distinguishes it from the get/create/update appointment type siblings.

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

Usage Guidelines4/5

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

The description gives clear usage context by noting that bulk requests are the common case and explaining how to paginate through results. It does not explicitly name the single-record alternative get_appointment_type, but the list-vs-get distinction is clear enough from the context.

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

list_automationsA

Get a list of Automations (GET /automations) Defaults to limit=100 (FUB's max per page) rather than its own default of 10 — bulk requests are the common case here. If the response's _metadata shows more results remain, keep paginating: use offset for offset-based endpoints, or the _metadata.next cursor value (as the next argument) for cursor-based endpoints like notes.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of results to return. Max 100.
offsetNoSpecifies the number of rows to skip before starting to return results.
statusNoSearch for Automations with one of the following statuses: `Active`, `Disabled`, or `Deleted`.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
manualOnlyNoReturn automations that contain a manual trigger
enabledOnlyNoReturn only automations that are enabled

TDQS

A3.7/5.0
Behavior4/5

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

With no annotations provided, the description carries the behavioral burden and does well: it discloses that the default limit is 100 instead of 10, that pagination may be needed, and how to continue when _metadata indicates more results. It does not explicitly state read-only safety, but the GET method and 'Get a list' wording make that reasonably clear.

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

Conciseness4/5

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

The description is front-loaded with the core purpose and endpoint, then explains the non-obvious default and pagination behavior. The second sentence is long and includes a generic aside about cursor-based endpoints 'like notes', which could be tightened, but there is no real wasted content.

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 list operation with six optional parameters and no annotations, the description covers the key operational details: default limit, pagination mechanics, and the most common usage. It does not describe the response item shape, but with no output schema that is a relatively minor gap for a well-understood list endpoint.

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 description adds useful pagination guidance beyond the schema by explaining when to use offset and what _metadata.next means, but it also mentions a 'next' argument not present in the input schema, which slightly muddies parameter semantics.

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

Purpose4/5

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

The description clearly states the verb and resource: 'Get a list of Automations (GET /automations)'. It is unambiguous about what the tool does, but it does not explicitly differentiate itself from the sibling get_automation for single-item lookups, so it stops just short of full sibling differentiation.

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

Usage Guidelines3/5

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

The description implies the common use case by noting 'bulk requests are the common case here', which gives some usage context. However, it never directly tells the agent when to prefer this tool over get_automation or other list tools, nor does it state any exclusions.

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

list_automations_peopleA

Get a list of pairings of Automations and the People on which they have or will be run. (GET /automationsPeople)

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoAutomation Status to filter by, i.e. one of "Initial", "Running", "Paused", or "Completed"
personIdNoID of a Person (i.e. to view only pairings for that Person)
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
automationIdNoID of an Automation (i.e. to view only pairings for that Automation)

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations, the description itself must carry behavioral disclosure. 'Get' and the explicit GET endpoint indicate a read-only list operation, which is useful, but it does not describe pagination, response shape, authentication needs, or default behavior with no filters.

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 front-loaded sentence with no filler, and the endpoint is appended for disambiguation. It is appropriately sized for a straightforward list tool.

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

Completeness4/5

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

The core semantics are clear: an optional-filter list of automation-people pairings. Given the low parameter complexity and the schema covering all filters, the description is largely complete. It only omits pagination and response details, which is a minor gap because 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 coverage is 100%, so all four parameters (status, personId, automationId, extraQuery) are fully documented in the schema. The description adds no parameter-level meaning; the baseline of 3 applies because the schema does the heavy lifting.

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 ('Get a list') and resource ('pairings of Automations and the People'), and adds a temporal nuance ('have or will be run'). It is clearly distinct from siblings like get_automations_person (single pairing) and list_automations (automations only).

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?

There is no guidance about when to choose this tool over alternatives such as get_automations_person or list_automations, and no prerequisites or exclusions are stated. Usage must be inferred entirely from the resource name and endpoint.

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

list_callsA

Search for calls. (GET /calls) Defaults to limit=100 (FUB's max per page) rather than its own default of 10 — bulk requests are the common case here. If the response's _metadata shows more results remain, keep paginating: use offset for offset-based endpoints, or the _metadata.next cursor value (as the next argument) for cursor-based endpoints like notes.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of results to return. Max 100.
phoneNoFilter calls based on the phone number of a specific person or lead. This will finds calls regardless of whether they were incoming or outgoing.
offsetNoSpecifies the number of rows to skip before starting to return results.
personIdNoFilter calls by a person ID.
toNumberNoFilter calls based on the number that the call was to.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
fromNumberNoFilter calls based on the number that the call was from.

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden and does meaningful work: it explains the intentional limit=100 default, flags that this differs from the API default, and gives concrete pagination instructions involving _metadata, offset, and cursor values. This goes well beyond what the schema alone 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?

Three tight sentences with no filler. The core purpose and endpoint lead, followed by the important default behavior and pagination guidance. 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?

For a list endpoint with 7 optional, well-documented parameters, the description covers the important behavioral nuances: default limit, bulk orientation, and pagination. It does not describe the full response shape, but the mention of _metadata and the absence of an output schema make the current guidance reasonably complete 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%, and every parameter already has a description in the schema. The description adds real value by explaining the limit default rationale and how to use offset versus cursor-style pagination, which helps the agent use parameters correctly.

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?

Description states the specific verb 'Search' and resource 'calls', and includes the endpoint (GET /calls). It is clearly a collection-level operation, but it does not explicitly contrast with get_call or other siblings, so it stops short of full differentiation.

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 gives useful context about bulk requests and pagination, implying when list behavior is intended. However, it does not explicitly say when to prefer this tool over get_call, create_call, or update_call, nor does it state any exclusions.

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

list_custom_fieldsA

List all custom fields. (GET /customFields) Defaults to limit=100 (FUB's max per page) rather than its own default of 10 — bulk requests are the common case here. If the response's _metadata shows more results remain, keep paginating: use offset for offset-based endpoints, or the _metadata.next cursor value (as the next argument) for cursor-based endpoints like notes.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoSorts results based on the provided field name. Prepending the field with a minus sign (-) sorts the results in descending order.id (desc)
labelNoFind custom field by label.
limitNoNumber of results to return. Max 100.
offsetNoSpecifies the number of rows to skip, before starting to return results.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations present, the description carries the behavioral burden. It discloses that the tool overrides the server default from 10 to 100 and explains how to continue paginating via offset or _metadata.next. It does not mention auth or rate limits, but for a read-only list endpoint it provides meaningful runtime behavior beyond a generic 'lists records' line.

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 sentences, each carrying distinct information: what the endpoint does, how the default limit behaves, and how to paginate. The action and route are front-loaded, and there is no filler or redundant restatement of 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 pageable list endpoint with no output schema and no annotations, the description supplies the essential operational details: default page size, how to detect remaining results via _metadata, and how to request the next page. It is sufficient for an agent to call and paginate correctly, though a brief note about the returned object shape would be extra credit.

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 parameters are already documented. The description adds value by explaining the limit default behavior and clarifying when to use offset versus cursor-based pagination, which supplements the schema's static parameter definitions. It does not need to repeat the sort, label, or extraQuery 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 uses the specific action 'List' against the resource 'custom fields' and appends the explicit route (GET /customFields), making the endpoint unambiguous. It is clearly distinct from sibling tools like list_deal_custom_fields because it targets the general customFields resource.

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 clear context for the common use case: 'bulk requests are the common case here,' and then explains how to paginate through results. It does not explicitly name alternatives or exclusion cases, but the intended usage is clear enough for an agent to select this tool for general custom-field listing.

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

list_deal_custom_fieldsA

List all deals custom fields available in your account. (GET /dealCustomFields) Defaults to limit=100 (FUB's max per page) rather than its own default of 10 — bulk requests are the common case here. If the response's _metadata shows more results remain, keep paginating: use offset for offset-based endpoints, or the _metadata.next cursor value (as the next argument) for cursor-based endpoints like notes.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoSorts results based on the provided field name. Prepending the field with a minus sign (-) sorts the results in descending order.id (desc)
labelNoFind custom field by label.
limitNoNumber of results to return. Max 100.
offsetNoSpecifies the number of rows to skip, before starting to return results.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

A4.5/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden. It discloses the default limit override (100 vs. 10), the presence of _metadata, and how pagination works. It does not explicitly state read-only behavior, but 'List' implies it, and the pagination details add useful behavioral insight 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?

Three sentences, all useful. The purpose is front-loaded, the endpoint is given, and pagination instructions follow. No filler or 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?

Given no output schema and no annotations, this description covers the critical operational details: what it lists, the pagination behavior, and how to proceed when more results exist. The mention of cursor-based endpoints like notes is slightly tangential but still helps the agent handle similar tools. Nothing essential is missing for correct invocation.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description adds value by explaining the limit default and how to use offset/cursor for pagination. It also hints at extraQuery usage with an example, which enriches the parameter meaning beyond the bare schema.

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

Purpose5/5

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

The description states a specific verb and resource ('List all deals custom fields') and includes the endpoint (GET /dealCustomFields). It clearly distinguishes this from the sibling list_custom_fields by restricting scope to deal custom fields, so an agent can tell them apart 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?

It gives clear context on when pagination is needed ('bulk requests are the common case') and explains how to paginate with offset or cursor. It does not explicitly name alternatives (e.g., get_deal_custom_field for a single field), but the scope is obvious from the name and description.

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

list_dealsC

Search for deals. (GET /deals)

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoOnly return deals with a status of `Active`, `Archived`, or `Deleted`.
userIdNoReturn a list of deals for a specific user.
personIdNoReturn a list of deals for a specific person.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
pipelineIdNoReturn deals for a specific pipeline only.
includeDeletedNoSet to `1` to include deals with a status of `Deleted` in the results.
includeArchivedNoSet to `1` to include deals with a status of `Archived` in the results.

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It only reveals the HTTP method GET, implying a read-only operation, but does not disclose pagination, result ordering, filtering behavior, permissions, or what happens with empty results. An agent cannot anticipate anything beyond 'this fetches deals.'

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 extremely efficient, using only two short phrases and no filler. The endpoint hint is useful and front-loaded. It could be argued that it is under-specified, but for what it contains, every word earns its place.

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

Completeness2/5

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

For a tool with seven parameters, no annotations, and no output schema, this description is too minimal. It does not explain the result format, how filters interact, or any caveats about the search behavior. Sibling tools and the schema fill some gaps, but the description alone leaves too much to 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 all seven parameters have descriptions in the input schema itself. The tool description adds no additional semantics beyond the schema, which makes the baseline score of 3 appropriate. The extraQuery parameter does get some schema-level explanation but that is not from the description.

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

Purpose4/5

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

The description states a specific verb and resource: 'Search for deals.' The parenthetical '(GET /deals)' reinforces the read/list intent. However, it does not explicitly differentiate from siblings like get_deal, create_deal, or update_deal, so it stops short of full distinction.

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 prefer this tool over alternatives. It does not mention that this is for listing multiple deals as opposed to fetching a single deal with get_deal, nor does it describe any filtering context. Usage is only implied by the tool name and the verb 'search.'

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

list_em_campaignsA

List email marketing campaigns. (GET /emCampaigns)

ParametersJSON Schema
NameRequiredDescriptionDefault
originNoSearch for campaigns from a specific origin.
originIdNoSearch for campaigns with a specific ID from the originating system.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations, the description carries the behavioral transparency burden. It communicates the safe, read-only nature via 'GET /emCampaigns', but it does not disclose behaviors such as pagination, sorting defaults, response shape, or authorization requirements.

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, direct sentence plus a useful endpoint reference. It is front-loaded with the core action and includes no filler or redundant elaboration.

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 simple list endpoint with a fully covered schema, the description is minimally viable. However, the absence of an output schema and any mention of response format or pagination leaves some practical ambiguity for an agent invoking this 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?

The input schema provides 100% description coverage for all three parameters, so the schema already explains origin, originId, and extraQuery. The tool description adds no parameter-level meaning beyond what the schema states.

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 ('List') and a specific resource ('email marketing campaigns'), and the endpoint 'GET /emCampaigns' confirms exactly what the tool returns. This clearly distinguishes it from sibling tools like create_em_campaign, update_em_campaign, and list_em_events.

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 intended use is implied by the verb and resource: use this when you need to retrieve email marketing campaigns. However, it does not explicitly state when to prefer this over alternatives, when not to use it, or mention pagination/filtering as practical guidance.

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

list_em_eventsA

List email marketing events. (GET /emEvents) Defaults to limit=100 (FUB's max per page) rather than its own default of 10 — bulk requests are the common case here. If the response's _metadata shows more results remain, keep paginating: use offset for offset-based endpoints, or the _metadata.next cursor value (as the next argument) for cursor-based endpoints like notes.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoFind email marketing events based on type. Options include `delivered`, `open`, `click`, `bounced`, `soft-bounce`, `hard-bounce`, `unsubscribe`, `spamreport` and `dropped`.
limitNoNumber of results to return. Max 100.
offsetNoSpecifies the number of rows to skip before starting to return results.
personIdNoFind email marketing events by person ID.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
updatedAfterNoFind email marketing events that have been created or updated after the specified time.

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the full behavioral burden and compensates well by disclosing the non-obvious default-limit override and the pagination mechanism using _metadata. It leaves the specific pagination style for this endpoint slightly implicit, but the presence of an offset parameter makes it inferable.

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 sentences with no wasted words: the purpose is front-loaded, and the pagination guidance earns its place by addressing a common source of errors. Structure is compact and readable.

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 list endpoint with all-optional parameters, this description covers the essential calling behavior: what it returns in terms of pagination, how to page through results, and what the default limit is. It omits things like authentication or result shape, but those are less critical when the schema and endpoint context are already supplied.

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 input schema covers 100% of parameters, so the baseline is 3. The description adds meaningful context around the limit parameter by explaining the default override and the rationale for bulk requests, which goes beyond the schema's 'default: 100' statement.

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 concrete action and resource ('List email marketing events') and includes the endpoint, so the agent knows exactly what the tool does. It doesn't explicitly distinguish from siblings like list_events, but the 'email marketing events' qualifier narrows it sufficiently.

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 provides useful operational context, such as bulk requests being the common case and how pagination should be handled. However, it does not explicitly say when to prefer this tool over siblings like list_events or list_em_campaigns, nor does it state 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.

list_eventsA

Search for events. (GET /events) Defaults to limit=100 (FUB's max per page) rather than its own default of 10 — bulk requests are the common case here. If the response's _metadata shows more results remain, keep paginating: use offset for offset-based endpoints, or the _metadata.next cursor value (as the next argument) for cursor-based endpoints like notes.

ParametersJSON Schema
NameRequiredDescriptionDefault
nextNoTo get the next page of results, set this to the value returned in _metadata.next, or use the URL from _metadata.nextLink directly.
typeNoComma separated list of one or more of the following: "Registration", "Inquiry", "Seller Inquiry", "Property Inquiry", "General Inquiry", "Viewed Property", "Saved Property", "Visited Website", "Incoming Call", "Unsubscribed", "Property Search", "Saved Property Search", "Visited Open House" or "Viewed Page".
limitNoNumber of results to return. (Max 100.)
offsetNoSpecifies the number of rows to skip, before starting to return results. (For more efficient paging, please use the "next" parameter instead.)
personIdNoFind all events related to a person.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
hasPropertyNoFilters based on whether a property is associated with an event or not.
propertyAddressNoSearches property addresses for a given value, including partial matches.

TDQS

A3.7/5.0
Behavior4/5

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

With no annotations, the description carries the burden of behavior disclosure, and it does well by explaining the limit default deviation, max page size, and how to continue pagination via _metadata, offset, or next. It does not cover auth, rate limits, or response shape, but for a read-only GET tool the most important behavioral traits are disclosed.

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 focused sentences with no filler: the purpose is front-loaded, followed by the most operationally important detail (default limit) and pagination instructions. Every sentence 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?

The description covers the key operational concern—paginating through large result sets—and the schema fully documents parameters. However, there is no output schema and no description of the event object itself, ordering, or response format, which leaves a meaningful gap for an agent consuming the results.

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 parameters are already well documented. The description adds some value by explaining how next and offset relate to pagination, but it does not meaningfully expand on the schema's parameter-level semantics.

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

Purpose4/5

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

The description clearly states the resource ('events') and the operation ('Search'), reinforced by the explicit 'GET /events' endpoint. It does not explicitly differentiate from siblings like get_event or list_em_events, so it misses the top score.

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 note that 'bulk requests are the common case here' implies this tool is best for bulk event retrieval, but it does not explicitly state when to choose it over get_event or other list tools. Pagination guidance is provided, but no exclusions or alternative-selection rules are given.

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

list_groupsC

List groups. (GET /groups)

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoSorts results based on the provided field name. Prepending the field with a minus sign (-) sorts the results in descending order.
typeNo`Agent` groups allow admins and agents and `Lender` groups allow lender role users.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It only discloses the HTTP GET method, which implies read-only behavior, but it says nothing about pagination, sorting defaults, filtering side effects, or return format. This is minimal behavioral disclosure beyond what the name already conveys.

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 extremely brief and front-loaded, containing no filler words. Every token earns its place, though it is so terse that it verges on under-specification. Still, for a simple list endpoint it is appropriately concise.

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 simple list tool with no required parameters and a fully self-describing schema, the description is minimally sufficient. It lacks context about what groups are, whether the list is scoped to the current user or all groups, and how results are paginated, but these are not severe gaps given the tool's low complexity.

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 all three parameters. The description adds no additional parameter semantics, but the baseline of 3 is appropriate because the schema already does the heavy lifting.

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 the action (List) and resource (groups), with the HTTP method as a helpful hint. However, it does not distinguish itself from sibling tools like get_group or create_group, so it misses the discrimination that would earn 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 Guidelines2/5

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

There is no guidance on when to use this tool versus alternatives such as get_group, create_group, or list_teams. The agent receives no context about when listing is preferred over fetching a specific group.

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

list_notesA

List notes, optionally filtered by person. This endpoint is NOT in FUB's published API docs (only GET /notes/{id} is documented there), but the plural GET /notes endpoint works today and supports filtering by personId — confirmed against the live API. Since it's undocumented, treat it as best-effort: if FUB changes this behavior, fall back to get_note by id. (GET /notes) Defaults to limit=100. This endpoint paginates via a cursor, not offset: pass the previous response's _metadata.next value as next to get the following page.

ParametersJSON Schema
NameRequiredDescriptionDefault
nextNoCursor from a previous response's _metadata.next, to fetch the next page.
limitNoNumber of results to return. Max 100.
personIdNoOnly return notes for this person ID.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

A4.3/5.0
Behavior4/5

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

No annotations are provided, so the description must carry the behavioral burden. It discloses that the endpoint is undocumented and best-effort, confirms live behavior, states default limit=100, and explains cursor-based pagination with _metadata.next — substantial behavioral context beyond a plain list action.

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

Conciseness4/5

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

The description is longer than most but each sentence earns its place: purpose, undocumented caveat, fallback, default, and cursor pagination. It front-loads the core purpose and keeps important warnings integrated without rambling.

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 4-parameter list tool with no output schema, this is complete enough to invoke correctly: it covers filtering, pagination, default limit, and risk mitigation. The absence of return-shape details is partly mitigated by explicitly referencing _metadata.next as the pagination source.

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 input schema already documents all four parameters, so the baseline is 3. The description adds value by explaining the limit default, the cursor-vs-offset pagination semantics for `next`, and the confirmed personId filtering behavior, which helps an agent use the parameters correctly.

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 clear verb and resource ('List notes') and identifies the optional filter by person, and explicitly frames this as the plural GET /notes versus the documented GET /notes/{id}, so an agent can distinguish it from get_note. The undocumented status is flagged upfront.

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 concrete usage context: use it to list notes optionally filtered by personId, and if the undocumented endpoint breaks, fall back to get_note by id. It doesn't enumerate all alternatives, but the most relevant sibling and fallback condition are explicit.

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

list_peopleA

Search for people. (GET /people) Defaults to limit=100 (FUB's max per page) rather than its own default of 10 — bulk requests are the common case here. If the response's _metadata shows more results remain, keep paginating: use offset for offset-based endpoints, or the _metadata.next cursor value (as the next argument) for cursor-based endpoints like notes. Use fields to request only what you need instead of full records when scanning many people. For custom fields, call list_custom_fields first to discover the exact field names/labels rather than guessing. FUB's docs also list a wildcard "custom*" field here for reading/writing custom fields directly (e.g. a "Closing Date" field as custom.ClosingDate) — that's not a literal field name, so it's not in this tool's fixed schema. Pass custom. entries via extraQuery instead. Call list_custom_fields first to get exact names.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoThe ID(s) of a person or people. (e.g., "123,456")
nameNoSearch for person with a name like what is given. (e.g., If you search for "drew", it might return a contact like "Andrew".)
sortNoThe sort order, can be one of the following: `id`, `created`, `updated`, `name`, `firstName`, `lastName`, `price`, `stage`, `lastActivity`, `lastCommunication`, `lastReceivedEmail`, `lastSentEmail`, `lastEmail`, `emailsReceived`, `emailsSent`, `lastIncomingCall`, `lastOutgoingCall`, `lastCall`, `firstCall`, `callsIncoming`, `callsOutgoing`, `callsDuration`, `lastReceivedText`, `lastSentText`, `lastText`, `lastLeadActivity`, `lastEmEventActivity`, `lastIdxVisit`, `textsReceived`, `textsSent`, `propertiesViewed`, `propertiesSaved`, `pagesViewed` or `nextTask`. <br /><br />Custom Fields (e.g. `customClosePrice`) can also be used in sorting.created
tagsNoSearch for people that match one or more tags. (e.g., "Foo,Bar" will match contacts with tags that include Foo OR Bar.)
emailNoSearch for a person by email address.
limitNoNumber of results to return. Max 100.
phoneNoSearch for a person by phone number.
stageNoSearch for person by stage name. (e.g., "Lead" or "Trash". See [stages API endpoint](ref:stages-get) for available stages.)
fieldsNoComma separated list of fields to return or use `allFields` to return all fields. (e.g., `firstName,lastName,timeframeId,timeframeUpdated,timeframeStatus,customFieldName`). Note: All custom fields should be prefixed with `custom` (i.e. customBirthday, customField). <br><br> Special values include `allCustom` (returns all custom fields) and `allFields` (returns all fields, including custom fields). <br><br> When using the `fields` parameter to filter the response, the `id` field will be included (even when not specified explicitly).
offsetNoSpecifies the number of rows to skip, before starting to return results.
sourceNoSearch for a person by lead source.
lastNameNoSearch for person with a last name like what is given. (e.g., If you search for "drew", it might return a contact like "Andrew".)
contactedNoSearch for people by whether or not they have been contacted.
firstNameNoSearch for person with a first name like what is given. (e.g., If you search for "drew", it might return a contact like "Andrew".)
assignedToNoSearch for a person by the user that is assigned to them. (e.g., Passing "William Riker" would return any person assigned to them.)
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
priceAboveNoSearch for people who have specified a price above a given value.
priceBelowNoSearch for people who have specified a price below a given value.
smartListIdNoSearch for people that match a smart list with given ID.
includeTrashNoSet whether to include people in the "trash" stage. (By default responses from /people will not include any people with a "trash" stage.)
assignedPondIdNoSearch for a person by the assigned pond id.
assignedUserIdNoSearch for people by the assigned user ID.
assignedLenderIdNoSearch for people by the assigned lender user ID.
includeUnclaimedNoSet to include unclaimed leads offered to the current user.
lastActivityAfterNoSearch for last activity after a given time. (e.g., "2016-11-23 01:02:03")
assignedLenderNameNoSearch for people by the assigned lender name.
lastActivityBeforeNoSearch for last activity before a given time. (e.g., "2016-11-23 01:02:03")

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals non-obvious behavior: the default limit is intentionally overridden to 100, pagination must follow `_metadata`, and custom fields require special handling via `extraQuery` rather than literal field names. It does not cover auth or rate limits, but for a read-only GET search, the key operational quirks are disclosed.

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

Conciseness4/5

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

The description is appropriately front-loaded with purpose and endpoint, and every sentence earns its place around defaults, pagination, and custom fields. It is dense at nearly 190 words and could be bulleted for readability, but there is no filler or tautology.

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 27 optional parameters, no annotations, and no output schema, the description supplies the essential operational context: default pagination behavior, result-count handling via `_metadata`, field minimization, and the custom-field discovery workflow. It does not describe the response shape beyond `_metadata`, but the most confusing aspects of this endpoint are covered.

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 adds real value beyond the schema by explaining the `limit` default override, advising on `fields` usage, and clarifying that custom fields must be passed through `extraQuery`. These insights meaningfully deepen parameter understanding without repeating schema text.

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

Purpose5/5

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

The description opens with a specific verb and resource — "Search for people. (GET /people)" — which unambiguously identifies the tool's purpose. The plural 'people' plus the search verb clearly distinguishes it from siblings like get_person or update_person, and the endpoint is stated explicitly.

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 strong context: it states that bulk requests are the common case, explains the default limit override, gives a concrete pagination procedure, and tells the agent to use `fields` to minimize payloads. It also explicitly points to list_custom_fields as a prerequisite for custom-field queries. However, it does not explicitly name alternatives like get_person for single-record lookups.

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

list_people_relationshipsC

Get relationships between people in Follow Up Boss. (GET /peopleRelationships)

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoSearches for person with a name like what is given. (e.g., If you search for `drew`, it might return a contact like `Andrew`.)
sortNoThe sort order. Can be one of the following: `id`, `created`, `updated`, `name`, `firstName`, `lastName`, `personId`.
lastNameNoSearches for person with a last name like what is given. (e.g., If you search for `drew`, it might return a contact like `Andrew.`)
personIdNoFilter relationships by a person ID.
firstNameNoSearches for person with a first name like what is given. (e.g., If you search for `drew`, it might return a contact like `Andrew.`)
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations provided, the description carries the full disclosure burden. It only names the operation and endpoint but does not indicate pagination behavior, default sorting, response shape, read-only safety, or whether the operation is limited by any default scope. This is a thin description for a list endpoint.

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

Conciseness5/5

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

The description is a single, well-formed sentence that immediately states the action and resource, with the endpoint appended in parentheses. Every word earns its place, and there is no fluff or repetition.

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

Completeness2/5

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

The tool has six parameters, no required fields, no output schema, and no annotations, yet the description only provides a two-line purpose statement. Critical context is missing: what a 'relationship' is in Follow Up Boss, whether results are paginated, and what the return structure looks like. The agent cannot confidently predict the tool's behavior from this definition.

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 in the schema, including the extraQuery object. The description adds no parameter-level meaning, so the baseline of 3 is appropriate; it neither compensates nor harms beyond the schema.

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

Purpose4/5

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

The description states a specific verb ('Get'), a clear resource ('relationships between people'), and the system ('Follow Up Boss'), so an agent knows what the tool does. However, it does not explicitly differentiate itself from the sibling get_people_relationship, leaving some ambiguity about list vs. single-item scope.

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?

There is no guidance on when to use this tool versus alternatives such as get_people_relationship, create_people_relationship, or update_people_relationship. It does not mention whether this should be used for bulk retrieval, filtering by person, or any recommended scenarios.

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

list_pipelinesC

Search for pipelines. (GET /pipelines)

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoThe pipeline name to lookup. (Must be an exact match.)
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It only gives the action and endpoint, without mentioning pagination, exact-match behavior beyond the schema, authentication needs, or what the response contains. The GET method implies a read operation but that is left to inference.

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 extremely short and front-loaded, with the endpoint parenthetical adding useful orientation. However, it says little beyond the tool name and HTTP method, making it efficient but quite spare.

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

Completeness2/5

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

With no annotations, no output schema, and a large sibling tool set, the description leaves too much unsaid about when to use the tool, what it returns, and how results are scoped or paginated. The parameter schema helps, but the description alone is insufficient for confident selection and 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 input schema covers 100% of the parameters and already explains exact-match semantics for name and passthrough behavior for extraQuery. The description adds no parameter-specific value, but with full schema coverage the baseline of 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 'Search for pipelines' and includes the endpoint GET /pipelines, clearly identifying a search/list operation on pipeline resources. It doesn't explicitly differentiate from get_pipeline, but the verb 'search' 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?

No guidance on when to use list_pipelines versus get_pipeline or other pipeline-related tools. There are no exclusions, alternatives, or conditions provided.

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

list_pondsA

Get a list of ponds. (GET /ponds) Defaults to limit=100 (FUB's max per page) rather than its own default of 10 — bulk requests are the common case here. If the response's _metadata shows more results remain, keep paginating: use offset for offset-based endpoints, or the _metadata.next cursor value (as the next argument) for cursor-based endpoints like notes.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of results to return. Max 100.
offsetNoSpecifies the number of rows to skip before starting to return results.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

A4.7/5.0
Behavior5/5

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

No annotations are provided, so the description must carry the full behavioral burden. It honestly discloses the non-obvious default override (limit=100 vs. the API's own 10) and explains the exact pagination mechanism via _metadata, covering both offset and cursor-based cases. This is exactly the kind of behavioral context an agent needs to correctly retrieve all results.

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 sentences, no filler. The primary purpose is front-loaded, and each subsequent sentence delivers essential operational detail (default behavior, pagination strategy) 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?

Despite lacking annotations and an output schema, the description covers what an agent needs to know: the resource, the default limit, how to interpret the response's _metadata, and how to continue paginating. Optional parameters are already fully described in the schema, and the description adds the missing operational 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 coverage is 100%, so the baseline is 3, but the description adds meaningful context beyond the schema by explaining why limit defaults to 100 and how offset or the next cursor should be used with the corresponding parameters. It clarifies the relationship between the two pagination styles, which isn't evident from the schema alone.

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

Purpose5/5

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

Opens with a clear verb and resource: 'Get a list of ponds.' and even includes the HTTP endpoint for certainty. It distinguishes itself from siblings like get_pond, create_pond, and update_pond by explicitly stating it is the list operation.

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 clear context that bulk requests are the common case, explaining why the limit defaults to 100. It also gives explicit pagination instructions, but it does not name an alternative tool (e.g., get_pond) for single-item needs.

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

list_smart_listsA

Get a list of Smart Lists. (GET /smartLists) Defaults to limit=100 (FUB's max per page) rather than its own default of 10 — bulk requests are the common case here. If the response's _metadata shows more results remain, keep paginating: use offset for offset-based endpoints, or the _metadata.next cursor value (as the next argument) for cursor-based endpoints like notes.

ParametersJSON Schema
NameRequiredDescriptionDefault
allNoUse this parameter to show all smart lists, whether from FUB Classic or FUB.
fub2NoBy default this endpoint only returns Smart Lists created in the classic version of our UI. To return Smart Lists created in our current version, use this parameter.
limitNoNumber of results to return. Max 100.
offsetNoSpecifies the number of rows to skip before starting to return results.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of behavioral transparency. It discloses the non-obvious default override (limit=100 instead of 10), explains the pagination pattern via _metadata, and clarifies offset vs cursor-based endpoints. This goes well beyond a bare 'list' statement, though it does not mention auth or full response shape.

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 sentences with no filler. It front-loads the core purpose, then adds the most decision-relevant behavioral details about defaults and pagination. Every sentence contributes to correct usage.

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 compensates by mentioning _metadata and pagination, which are the main response-related details an agent needs. It is sufficient to invoke the tool and handle multi-page results, though a bit more about the overall return shape would make it fully complete.

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 documents all parameters with 100% coverage, so the baseline is 3. The description adds meaningful context beyond the schema by explaining the limit override, the pagination flow, and how offset/cursor arguments relate to response metadata. It does not add anything about all/fub2 or extraQuery, but the schema handles those adequately.

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 the operation ('Get a list of Smart Lists') and the endpoint (GET /smartLists), so an agent immediately knows what the tool does. It does not explicitly contrast with the sibling get_smart_list, but the plural 'list' and resource name already differentiate it from that singular variant.

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 clear context for when this tool is useful, noting that 'bulk requests are the common case' and that limit defaults to 100 accordingly. It lacks explicit when-not-to-use guidance or a named alternative, but the pagination instructions give usable direction for the common follow-up behavior.

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

list_stagesA

Retrieve a list of stages. (GET /stages) Defaults to limit=100 (FUB's max per page) rather than its own default of 10 — bulk requests are the common case here. If the response's _metadata shows more results remain, keep paginating: use offset for offset-based endpoints, or the _metadata.next cursor value (as the next argument) for cursor-based endpoints like notes.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoSorts the stages by `orderWeight`, `id` or `name`.orderWeight
limitNoNumber of results to return. Max 100.
offsetNoSpecifies the number of rows to skip before starting to return results.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations provided, the description carries the behavioral disclosure burden. It adds non-obvious details: the default limit is overridden to 100, FUB's max per page, and the agent is told how to continue pagination via offset or cursor. It does not describe the response shape, but for a list endpoint this is a reasonably transparent disclosure.

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 action and endpoint. The third sentence is slightly over-general for this tool—mentioning cursor-based endpoints 'like notes' when stages has an offset parameter—but the content is still relevant and not bloated.

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 that there is no output schema and no annotations, the description provides the essential operational context: endpoint, default limit, and pagination behavior. It is enough for an agent to call the tool correctly, though explicit guidance about retrieving a single stage via get_stage would make it more complete.

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 describes all four parameters, so the baseline is 3. The description adds meaning beyond the schema by explaining why limit defaults to 100 and by giving an operational rule for using offset or cursor-based pagination, which helps the agent invoke the tool correctly.

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 begins with a specific verb and resource: 'Retrieve a list of stages' and adds the REST path GET /stages. This is clear, but it does not explicitly contrast with sibling tools such as get_stage or list_pipelines, so it stops just short of full sibling differentiation.

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

Usage Guidelines3/5

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

The description implies the intended use by stating that bulk requests are the common case and gives concrete pagination instructions. However, it never explicitly tells the agent when to prefer this tool over get_stage or when not to use it, so usage guidance is mostly inferred rather than explicit.

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

list_tasksC

Get a list of tasks. (GET /tasks)

ParametersJSON Schema
NameRequiredDescriptionDefault
dueNoFind tasks that fall into the following ranges: `today`, `overdue` and `upcoming`.
nameNoFind tasks where the name is like what you pass in. (e.g., "world" would find a task named "hello world")
typeNoFind tasks by the following types: `Follow Up`, `Call`, `Email`, `Text`, `Appointment`, `Showing`, `Closing`, `Open House` or `Thank You`. (Note: A comma separated list of types is accepted.)
dueEndNoFind tasks that are due from this time and before.
dueStartNoFinds tasks that are due from this time forward.
personIdNoFind tasks by a person's id.
assignedToNoFind tasks assigned to a specific user using their full name.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
isCompletedNoFind tasks that have been completed or not completed.
assignedUserIdNoFind tasks assigned to a specific user by id.

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It indicates a read-only GET operation but does not mention whether all tasks are returned, pagination behavior, sorting defaults, or any rate limits. The behavioral traits are severely under-specified.

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, front-loaded sentence: 'Get a list of tasks. (GET /tasks)'. It is free of fluff and the HTTP endpoint is a useful supplementary detail. Every word earns its place.

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

Completeness2/5

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

This tool has 10 optional parameters, no output schema, and no annotations. The description fails to mention response structure, pagination, or how to combine filters. For a list endpoint with this many options, the description is too sparse to be fully 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?

The input schema covers 100% of the parameters with detailed descriptions for all 10 properties, so the schema does the heavy lifting. The tool description itself adds no parameter information, but the baseline of 3 is appropriate given the high schema coverage.

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 'Get a list of tasks' clearly states the verb and resource, making the core purpose obvious. It does not explicitly distinguish this from sibling tools like get_task, create_task, or update_task, but the plural 'list' provides implicit differentiation.

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 is provided on when to use this tool versus alternatives. There is no mention of filtering use cases, pagination, or contrast with get_task for a single task. The agent is left to infer appropriate usage from the schema alone.

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

list_team_inboxesC

Get a list of Team Inboxes (GET /teamInboxes)

ParametersJSON Schema
NameRequiredDescriptionDefault
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

C2.5/5.0
Behavior2/5

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

No annotations are provided, so the description carries the burden. It doesn't mention whether this is a read-only operation (it says GET, but that's not enough), whether it requires authentication, what fields are returned, or if there are any side effects. The description is minimal.

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

Conciseness3/5

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

Single sentence, no fluff. But it could be improved by front-loading the purpose more clearly and adding a note about the optional parameter. It's concise but under-specified.

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

Completeness2/5

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

Given the tool has only one optional parameter and no output schema, the description is too thin. It doesn't explain what data the response contains, any filtering options besides extraQuery, or typical usage scenarios. Incomplete 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?

Schema coverage is 100% with one optional parameter described clearly. The description doesn't add much beyond the schema, but since the schema is complete, baseline 3 is appropriate. It doesn't give examples of valid extraQuery values.

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

Purpose3/5

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

States it gets a list of Team Inboxes, but 'Team Inboxes' is a vague resource name. It doesn't define what a Team Inbox is or what data it returns. Could be confused with similar list tools like list_groups or list_teams, but the resource name is 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?

No guidance on when to use this tool versus siblings like list_groups or list_teams. It just says 'Get a list of Team Inboxes', with no context on typical use cases or criteria for selection.

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

list_teamsA

Get a list of teams. (GET /teams) Defaults to limit=100 (FUB's max per page) rather than its own default of 10 — bulk requests are the common case here. If the response's _metadata shows more results remain, keep paginating: use offset for offset-based endpoints, or the _metadata.next cursor value (as the next argument) for cursor-based endpoints like notes.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of results to return. Max 100.
offsetNoSpecifies the number of rows to skip before starting to return results.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden; it discloses the default limit override, max page size, and the _metadata/offset/next pagination contract. It doesn't mention auth or rate limits, but for a read-only list endpoint the key call-time 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.

Conciseness5/5

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

Three sentences, front-loaded with purpose, then default behavior, then pagination. No filler; each sentence adds usable detail, and the only minor extra is the notes example.

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 list tool with no output schema and no annotations, the description covers purpose, defaults, and pagination algorithm. It could be more explicit about which pagination style applies to teams, but the presence of an offset parameter in the schema makes it inferable.

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?

Input schema coverage is 100%, so baseline is 3; the description adds real value by explaining why limit defaults to 100 (FUB max) and how offset/next drive follow-up pagination. It doesn't elaborate on extraQuery, but the schema already documents that parameter.

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

Purpose4/5

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

The opening phrase 'Get a list of teams' names a specific verb and resource, and the endpoint 'GET /teams' reinforces scope. It is clear enough to distinguish from sibling get_team, though it doesn't explicitly call out that alternative.

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 practical when-to-use context: list endpoints for bulk requests, defaulting to max page size, with explicit pagination steps. It doesn't explicitly route to get_team for single-team lookups or say when not to use it, but the bulk-request framing is clear context.

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

list_templatesA

Lists all email templates. (GET /templates) Defaults to limit=100 (FUB's max per page) rather than its own default of 10 — bulk requests are the common case here. If the response's _metadata shows more results remain, keep paginating: use offset for offset-based endpoints, or the _metadata.next cursor value (as the next argument) for cursor-based endpoints like notes.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of results to return. Max 100.
offsetNoSpecifies the number of rows to skip before starting to return results.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral disclosure burden. It transparently explains the limit default deviation (100 vs 10) and the pagination contract via _metadata and offset/next. It does not discuss read-only guarantees or auth, but those are implicit for a list endpoint and the stated behaviors are valuable and concrete.

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 two sentences and front-loads the purpose and endpoint. The second sentence is dense but contains necessary behavioral context. No filler or repetition; it earns its length.

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 tool with no output schema, the description appropriately explains the response metadata and pagination flow, and the schema already documents all parameters. It does not explicitly state the return shape (array of template objects), but that is strongly implied by 'Lists all email templates' and the pagination discussion. Minor gap, but overall complete for the tool's complexity.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real value: it explains why limit defaults to 100 (FUB max, bulk case) and how offset or the _metadata.next cursor should be used with pagination. This goes beyond the raw schema definitions for limit and offset.

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 'Lists all email templates', a specific verb and resource, and identifies the HTTP endpoint. The word 'all' establishes scope and distinguishes it from the singular get_template sibling. An agent immediately knows what the tool does.

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 bulk requests ('bulk requests are the common case here') and gives pagination instructions, but it never explicitly says when to choose this tool over alternatives or when not to use it. No sibling is referenced, so usage context is largely inferred rather than stated.

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

list_text_messagesA

List text messages for a person or phone number. (GET /textMessages)

ParametersJSON Schema
NameRequiredDescriptionDefault
personIdNoFilter text messages for a specific person id only.
toNumberNoFilter text messages sent to a specific recipient's phone number.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
fromNumberNoFilter text messages sent from a specific sender's phone number.

TDQS

A3.5/5.0
Behavior2/5

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

No annotations exist to cover safety traits, and the description only says 'List' and the HTTP method. It lacks behavioral detail such as whether all messages are returned, pagination behavior, or any limits.

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 front-loads the purpose immediately and adds the GET endpoint as a useful technical signal. 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?

The description is enough to select the tool and understand its core purpose, but with no output schema and no behavioral annotations, the description could have added pagination or response expectations. This is adequate but has clear 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?

Schema description coverage is 100%, covering personId, toNumber, fromNumber, and extraQuery. The description's 'for a person or phone number' mirrors the schema without adding new semantic 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-resource pair ('List text messages'), specifies scope ('for a person or phone number'), and includes the HTTP endpoint, clearly distinguishing it from siblings like get_text_message.

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 retrieval/browse use case but never states when to choose this tool over alternatives like get_text_message. There is no explicit guidance on ordering, pagination, or exclusion conditions.

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

list_text_message_templatesA

Lists all text message templates. (GET /textMessageTemplates) Defaults to limit=100 (FUB's max per page) rather than its own default of 10 — bulk requests are the common case here. If the response's _metadata shows more results remain, keep paginating: use offset for offset-based endpoints, or the _metadata.next cursor value (as the next argument) for cursor-based endpoints like notes.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of results to return. Max 100.10
offsetNoSpecifies the number of rows to skip before starting to return results.0
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations provided, the description carries the full behavioral burden. It discloses the non-obvious default limit override (limit=100 instead of schema's 10) and explains pagination behavior via _metadata. It does not cover auth, rate limits, or return format, but for a read-only list operation, the key behaviors are transparently stated.

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 sentences, each earning its place: the first states purpose, the second explains the default override, and the third provides pagination guidance. The most important information is front-loaded, and there is 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 tool with no required parameters, no output schema, and no annotations, the description effectively covers purpose, default behavior, and pagination – the main things an agent needs to call it correctly. It could mention the return envelope or filtering options, but given the low complexity, the description is complete enough.

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 real value by clarifying that the actual default limit is 100 (not the schema's 10) and by contextualizing extraQuery with an example. This goes beyond the schema's raw descriptions and helps an agent decide how to set parameters.

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

Purpose5/5

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

The description clearly states the verb and resource: 'Lists all text message templates.' This is specific and distinguishes it from sibling tools like list_text_messages (messages, not templates) and list_templates (generic templates). Including the endpoint 'GET /textMessageTemplates' further anchors its 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?

The description provides clear context on when and how to use the tool: it notes that bulk requests are the common case, justifies the default limit override, and gives explicit pagination instructions with both offset and cursor examples ('use `offset` ... or `_metadata.next` cursor value'). It does not explicitly mention alternatives or exclusions, but the pagination guidance is practical and actionable.

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

list_timeframesC

Get a list of timeframes. (GET /timeframes)

ParametersJSON Schema
NameRequiredDescriptionDefault
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It only adds the GET endpoint, which weakly implies a read-only operation, but says nothing about auth requirements, pagination, ordering, or response behavior.

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 extremely short and front-loaded, with no filler. It is concise, though it trades completeness for brevity.

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

Completeness2/5

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

For a list operation with no annotations and no output schema, this description is under-specified: it does not explain what timeframes represent, whether results are paginated, or what the response contains. The optional extraQuery parameter is handled by the schema, but the overall tool context is lacking.

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% for the sole optional parameter, and the schema already describes extraQuery in detail. The description adds no additional meaning for parameters, so it meets the baseline but does not exceed it.

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

Purpose4/5

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

The description states a clear action (Get) and resource (list of timeframes) plus the HTTP endpoint, which makes the tool's purpose obvious. However, it does not elaborate on what a timeframe is or how this resource differs from other list_* siblings, and it largely restates the tool name.

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 is given on when to call this tool versus other list tools or related timeframe-specific operations. The description does not mention any context, prerequisites, or exclusions, so an agent must infer usage from the name alone.

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

list_usersA

Search for users. (GET /users) Defaults to limit=100 (FUB's max per page) rather than its own default of 10 — bulk requests are the common case here. If the response's _metadata shows more results remain, keep paginating: use offset for offset-based endpoints, or the _metadata.next cursor value (as the next argument) for cursor-based endpoints like notes. Use fields to request only what you need instead of full records when scanning many people. For custom fields, call list_custom_fields first to discover the exact field names/labels rather than guessing.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoFind a user by their full name. (Exact matches only, no partial matching available.)
roleNoFind users by a specific role. (e.g., "Broker", "Agent", "Lender")
sortNoField to sort by. (Currently only `id`, `name` and `created` are available.)
emailNoFind a user by their email.
limitNoNumber of results to return. Max 100.
fieldsNoComma separated list of fields (e.g., id,name,calling) to return or use allFields to return all fields (except for calling information, unless included like allFields,calling). <br><br> When using the fields parameter to filter the response, the id field will be included (even when not specified explicitly).
offsetNoSpecifies the number of rows to skip before starting to return results.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
includeDeletedNoSetting this to `true` will include users that have been deleted.

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden, and it discloses meaningful traits: the default limit is deliberately bumped to 100, _metadata signals remaining results, offset vs cursor pagination, and fields usage. It does not mention auth, rate limits, or return shape, but for a read/list endpoint the most important quirks 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.

Conciseness5/5

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

The description is information-dense with no filler: action line first, then defaults, pagination, field selection, and custom-field caveat in logical order. Every sentence contributes a distinct operational instruction.

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

Completeness4/5

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

For a read-only list tool with no output schema, the description covers the key operational concerns: pagination, defaults, filtering, and field projection. It omits nothing critical for a correct first call, though it does not describe the overall response envelope or error conditions, leaving a small gap.

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?

Despite 100% schema coverage, the description adds real semantic value: it explains why the limit default is 100, how to paginate with offset or _metadata.next, and how to use fields to trim payloads. It also connects extraQuery custom filters to list_custom_fields, which is exactly the kind of guidance the schema cannot provide.

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 verb-resource pair ('Search for users') and the HTTP endpoint, making the action unmistakable. It does not explicitly contrast with get_user or list_people, so it misses clear sibling differentiation and gets a 4 rather than a 5.

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

Usage Guidelines4/5

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

It clearly frames the common use case ('bulk requests'), explains the pagination strategy, and tells the agent to call list_custom_fields first before custom-field queries. It does not state when to prefer get_user or when not to use this tool, so there are no explicit exclusions.

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

list_webhooksA

Get a list of webhooks. (GET /webhooks) Defaults to limit=100 (FUB's max per page) rather than its own default of 10 — bulk requests are the common case here. If the response's _metadata shows more results remain, keep paginating: use offset for offset-based endpoints, or the _metadata.next cursor value (as the next argument) for cursor-based endpoints like notes.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoThe sort order. Can be one of the following: `id`, `created`, `updated`, `status` or `event`.created
eventNoSearch for webhooks by event. (e.g., `peopleCreated` or `peopleUpdated`)
limitNoNumber of results to return. Max 100.
offsetNoSpecifies the number of rows to skip before starting to return results.
statusNoSearch for webhooks by status. Status can be `Active` or `Disabled`.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations, the description carries the full burden. It discloses the default limit override and pagination requirements, which are critical behavioral traits. It does not explicitly state read-only, but that is inferable from 'get a list'. 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?

Three sentences with no redundancy; the main purpose is stated first, followed by practical usage details. The structure is efficient and front-loaded with the most important 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 list endpoint without an output schema, the description explains pagination and the default limit—the main non-obvious aspects. It could mention the response format, but that is often standard. It is sufficient for an agent 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?

The schema fully documents all six parameters, so the description adds limited extra value. It does explain the rationale for the limit default, but that is already present in the schema. The pagination guidance is contextual rather than parameter-specific.

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 retrieves a list of webhooks and includes the HTTP endpoint. It is distinct from get_webhook (singular) and preemptively explains the default limit, making its purpose unambiguous.

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 for bulk retrieval and explains pagination using offset or _metadata.next cursor. It implies when to use this tool versus get_webhook for single records, offering actionable selection criteria.

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

post_inbox_apps_conversations_participantsA

Adds a participant to an Inbox App conversation. (POST /inboxApps/{inboxAppId}/conversations/{extConversationId}/participants)

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoThe participant's name if you do not know the participant's Person or User ID.
emailNoThe participant's email address if you do not know the participant's Person or User ID.
phoneNoThe participant's phone number if you do not know the participant's Person or User ID.
userIdNoA FUB User ID. Mutually exclusive to other fields.
personIdNoA FUB Person ID. Mutually exclusive to other fields.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
inboxAppIdYes
isAutomationNoWhether the participant is an automated system. Defaults to false.
relationshipIdNoA FUB Relationship ID. Mutually exclusive to the other ID fields.
extConversationIdYes

TDQS

A3.6/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure, but it only restates the action and the HTTP endpoint. It does not mention side effects, return values, authentication requirements, idempotency, or behavior when the participant already exists.

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 action-focused sentence with the endpoint appended in parentheses. There is no filler, and the core operation is front-loaded.

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

Completeness2/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 annotations and no output schema, the description is too thin. It omits expected response or status information, guidance on choosing between the many identification fields, and any behavioral caveats. The schema compensates partially, but the tool description alone does not give the agent enough operational context.

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 describes most parameters with 82% coverage, including mutually exclusive fields like userId and personId. The description adds no parameter-level meaning beyond the schema, so the baseline score 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 begins with a specific verb and resource: 'Adds a participant to an Inbox App conversation.' It also includes the exact POST route, making the operation and scope explicit. This clearly distinguishes it from sibling tools like get_inbox_apps_conversations_participants or post_inbox_apps_message.

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 action statement provides clear context for when to use the tool: when a participant needs to be added to an Inbox App conversation. However, it does not explicitly name alternatives or exclusion criteria, such as using get_inbox_apps_conversations_participants to retrieve existing participants.

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

post_inbox_apps_installC

Installs your Inbox App for an account. (POST /inboxApps/install)

ParametersJSON Schema
NameRequiredDescriptionDefault
userIdYesThe User ID to scope the Inbox App to, or 0 for account-wide scope.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
subscriptionUrlYesThe webhook URL you will receive Inbox App replies at.
publishedInboxAppIdYesYour Published Inbox App ID.

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description must carry the behavioral burden. It only states the action without disclosing side effects, required permissions, or the outcome of installation. The POST method implies mutation, but nothing about reversibility, validation, or error conditions is mentioned.

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 sentence, highly concise and free of fluff. It is front-loaded with the core action and endpoint. However, it is so brief that it sacrifices useful context, but for sheer conciseness it scores high.

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

Completeness2/5

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

Given the tool has 5 parameters, no output schema, and no annotations, the description is far from complete. It does not explain what the installation entails, what a successful response looks like, or any constraints. An agent would need to infer significant context from parameter names and the sibling set.

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 each parameter having a description. The tool description adds nothing beyond the schema, so it meets the baseline. It doesn't clarify relationships between parameters (e.g., that userId=0 means account-wide) beyond what schema already 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 the action: 'Installs your Inbox App for an account.' It includes the HTTP endpoint, making the purpose unambiguous. While it doesn't explicitly differentiate from sibling inbox app tools like post_inbox_apps_message, the verb 'Installs' is specific enough to convey the primary function.

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 is given on when to use this tool versus the many sibling tools. There is no mention of prerequisites, such as needing a publishedInboxAppId first, or any conditions under which installation should be done. The agent is left to infer usage context.

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

post_inbox_apps_messageB

Adds a message to an existing or new Inbox App conversation. (POST /inboxApps/{inboxAppId}/message)

ParametersJSON Schema
NameRequiredDescriptionDefault
ownerNoThe owner of the conversation. Can be a FUB User or FUB Team Inbox. Required on the first message in a conversation.
personNoThe person associated with the conversation. A Person ID is preferred, but name, email, and/or phone are acceptable if the person does not exist in FUB yet. Required on the first message in a conversation.
senderYesWho sent the message. Can be a FUB User, a FUB Person, or an unrelated entity such as an AI bot.
sentAtNoThe timestamp the message was delivered at in ISO8601 UTC format. Defaults to current time if omitted.
messageYesA plaintext message body.
subjectNoSets or updates the subject of the conversation.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
inboxAppIdYes
isIncomingYesIndicates if the message was incoming to your system.
attachmentsNo
richObjectsNoList of Rich Object URLs.
isAutomationNoWhether the sender is an automated system. Defaults to false.
deliveryStatusNoThe message's delivery status.
externalMessageIdYesA unique identifier that references this message.
externalConversationIdYesA unique identifier that references this conversation.
replyToExternalMessageIdNoIf this message is a reply to a previous message, specify the external message ID of the message being replied to.
deliveryStatusErrorMessageNoOptional user-facing error message for Not Delivered statuses.

TDQS

B3.2/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It only states the core action and endpoint, but does not mention side effects, whether an existing conversation is updated, how new conversation creation is triggered, or any authorization or error behavior. This is a significant gap for a mutating 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?

The description is a single, focused sentence that states the action and the endpoint. It is front-loaded with the core purpose and contains no filler or redundant material.

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

Completeness2/5

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

Despite the tool having 18 parameters, nested objects, no output schema, and no annotations, the description gives no information about return values, expected behavior for new vs. existing conversations, or handling of required owner/person fields. It is too sparse to fully guide an agent in invoking this complex 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 description coverage is high at 89%, so the schema already documents most parameters. The description adds minimal extra meaning beyond identifying inboxAppId as a path parameter in the endpoint URL. This meets the baseline but does not compensate for the few undocumented fields.

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 uses a specific verb and resource: 'Adds a message to an existing or new Inbox App conversation.' It also includes the endpoint path, which clarifies the operation. It does not explicitly differentiate from sibling tools like put_inbox_apps_message or post_inbox_apps_system_message, 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?

The description implies when to use the tool by saying it adds a message, but it gives no guidance on when to prefer it over the closely related put_inbox_apps_message or post_inbox_apps_note. It provides no exclusions or alternative routing, so usage guidance is only implicit.

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

post_inbox_apps_noteB

Adds a note to an Inbox App conversation. (POST /inboxApps/{inboxAppId}/note)

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesThe plaintext body of the note.
userYesThe user adding the note.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
inboxAppIdYes
externalConversationIdYesThe unique identifier that references the conversation you are adding a note for.

TDQS

B3.4/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. 'Adds a note' indicates a mutation, but there is no mention of side effects, required permissions, idempotency, or response behavior. For a write operation, this is a notable gap, as an agent cannot infer whether the note is appended, replaces, or requires specific conversation state.

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 sentence that states the action and endpoint, with no filler. It is concise and front-loaded, but could include a hint about the user object or note formatting without becoming verbose. Slightly terse but efficient.

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 tool with 6 parameters (including nested objects) and no output schema, the description is minimal. The schema covers parameter details, but the description doesn't explain the overall flow, whether the note is appended to an existing thread, or how to handle errors. It's adequate for a basic understanding but lacks richer context that would help an agent call it correctly in varied scenarios.

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 83%, with descriptions for body, user, extraBody, extraQuery, and externalConversationId; inboxAppId is undocumented. The tool description adds no additional parameter meaning beyond the schema. It doesn't clarify the role of inboxAppId or provide format examples, so it stays at the baseline for high 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 resource and action: 'Adds a note to an Inbox App conversation.' It also provides the REST endpoint, which reinforces the specific resource. This distinguishes it from siblings like create_note (general notes) and post_inbox_apps_message (messages vs. notes).

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 when to use it (when adding a note to an Inbox App conversation), but it does not explicitly mention when not to use it or point to alternatives. Siblings like create_note exist, but there is no guidance on choosing between them. The usage context is implied but not explicitly contrasted.

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

post_inbox_apps_system_messageC

Adds a system confirmation message to an existing or new Inbox App conversation. (POST /inboxApps/{inboxAppId}/systemMessage)

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoThe system confirmation message type.
ownerNoThe owner of the conversation. Can be a FUB User or FUB Team Inbox. Required on the first message in a conversation.
personNoThe person associated with the conversation. A Person ID is preferred, but name, email, and/or phone are acceptable if the person does not exist in FUB yet. Required on the first message in a conversation.
messageYesA plaintext message body.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
inboxAppIdYes
externalMessageIdYesA unique identifier that references this message.
externalConversationIdYesA unique identifier that references this conversation.

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It reveals that the tool 'Adds' (a write operation) and works on 'existing or new' conversations, but it doesn't disclose idempotency behavior implied by externalMessageId, what is created when the conversation is new, permission/auth requirements, or error behavior. For a mutation endpoint with zero annotation coverage, this is a thin disclosure.

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 front-loaded sentence followed by the HTTP endpoint hint, with zero filler. It is efficient and immediately states the core action, though the endpoint hint is somewhat redundant given the tool name.

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

Completeness2/5

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

This is a 9-parameter tool with 4 required params, nested objects, no output schema, and no annotations — fairly complex. The description doesn't mention that owner/person are only required on the first message, doesn't address return value or what happens on a brand-new conversation, and doesn't position the tool relative to the many sibling inbox-app endpoints. Too much context is missing for correct invocation.

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

Parameters3/5

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

Schema description coverage is 89%, so the schema already documents required params, the type enum, and the nested owner/person semantics well, establishing a baseline of 3. The description itself adds no parameter-level detail, but it doesn't need to compensate since the structured schema carries that weight.

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

Purpose4/5

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

The description states a specific verb ('Adds'), resource ('system confirmation message'), and target ('Inbox App conversation'), which is clear on its own. The phrase 'system confirmation message' semantically distinguishes it from siblings like post_inbox_apps_message and post_inbox_apps_note, but it never explicitly names those alternatives, so it stops short of full sibling differentiation.

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

Usage 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 choose this tool over post_inbox_apps_message, put_inbox_apps_message, or post_inbox_apps_note, which are all present in the sibling list. 'System confirmation message' implies a distinct use case, but no when-to-use, when-not-to-use, or alternative routing is provided, leaving the agent to infer the difference.

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

post_people_claimB

Claim a lead. (POST /people/claim)

ParametersJSON Schema
NameRequiredDescriptionDefault
personIdNoInclude the person ID of the lead you want to claim either like this or as part of the path itself.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It only says 'Claim a lead' with no mention of side effects, ownership transfer, permissions, idempotency, or what happens if the lead is already claimed. The endpoint path adds minimal context but no behavioral detail.

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 extremely short and front-loaded with the core action. It earns its place, though it could add a sentence about prerequisites or effects without becoming bloated.

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

Completeness2/5

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

For a mutation tool with no annotations and no output schema, the description is too thin. It doesn't explain what 'claim' means operationally, whether it requires an unclaimed lead, or what the response contains. An agent would need to infer too much.

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. The description adds no parameter-level meaning beyond the schema, but the schema itself is clear about personId and the extraBody/extraQuery passthrough behavior. Baseline 3 is appropriate.

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

Purpose4/5

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

The description 'Claim a lead' uses a specific verb and resource, and the endpoint path clarifies the action. It distinguishes from siblings like post_people_ignore_unclaimed and get_people_unclaimed, though it doesn't explicitly name them.

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 tool is for claiming unclaimed leads, but it doesn't explicitly state when to use it versus alternatives like get_people_unclaimed or post_people_ignore_unclaimed. The context is inferable from the name and siblings, but no explicit guidance is given.

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

post_people_ignore_unclaimedC

Ignore a lead. (POST /people/ignoreUnclaimed)

ParametersJSON Schema
NameRequiredDescriptionDefault
personIdNoInclude the person ID of the lead you want to ignore either like this or as part of the path.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It says 'Ignore' but does not explain what ignoring a lead does—whether it is irreversible, whether it removes the lead from the unclaimed pool, or what side effects occur. This is thin for a state-changing operation.

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 extremely short and contains zero filler; the verb and endpoint are front-loaded. However, it is arguably too terse given the semantic ambiguity of 'ignore' in this domain.

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

Completeness2/5

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

For a state-changing operation with no annotations and no output schema, the description is incomplete. It omits when to use it, what happens to the ignored lead, and how it relates to the unclaimed/claim workflow, all of which an agent would need to call it 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?

Schema description coverage is 100%, so the parameters are already well-documented in the schema. The description adds no parameter-specific meaning, but the baseline of 3 applies because the schema does the heavy lifting.

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

Purpose4/5

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

The description names a specific verb ('Ignore') and resource ('a lead') and includes the exact endpoint, so an agent knows both the operation and the HTTP target. It is clear, though it does not explicitly say these are unclaimed leads, relying partly on the tool name and path.

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 alternatives such as post_people_claim or get_people_unclaimed. It never clarifies the workflow around unclaimed leads, so an agent is left to infer context from the endpoint path.

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

post_templates_mergeA

Merge an email template with multiple recipients. (POST /templates/merge) Despite the name, this almost certainly does NOT send anything — inferred from its identical-shaped sibling post_text_message_templates_merge, which was verified live 2026-09 (firing it at a real phone number produced no delivery and no new record in list_text_messages, only a rendered string back); the email variant itself wasn't separately fired to avoid sending an unwanted email. It's a preview/render utility for the edge case of one message greeting multiple recipients at once (e.g. "Hey Bob, Alice and Carol...") — useful for composing that combined greeting, not for actually delivering it.

ParametersJSON Schema
NameRequiredDescriptionDefault
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
recipientsNoList of recipients in the To: field of this email.
templateIdNoThe ID of the email template.
mergePersonIdNoPerson ID to use for merge fields like %contact_name%.

TDQS

A4.3/5.0
Behavior5/5

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

With no annotations, the description carries the full behavioral burden and does an exceptional job: it states the tool 'almost certainly does NOT send anything', explains the inference from a live-verified sibling, and describes the rendered-string output. This candidly discloses the most important behavioral nuance.

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

Conciseness4/5

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

The description is front-loaded with the core purpose and caveat, and every sentence earns its place. It is a bit verbose with the verification narrative, but that detail is valuable given the misleading name.

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 preview utility with no output schema and no annotations, the description covers the critical aspects: what it does, what it does not do, the edge case it serves, and a hint at the return value. It does not fully specify required inputs or auth expectations, but these are minor for this 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%, so the baseline is 3. The description adds overall context about multiple recipients and greeting composition but does not add per-parameter meaning beyond what the schema already 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 states a specific verb and resource ('Merge an email template with multiple recipients') and immediately clarifies the actual behavior: preview/render utility, not delivery. It differentiates from the sibling post_text_message_templates_merge and explicitly disambiguates the misleading name.

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 clearly explains when to use the tool: for composing a combined greeting to multiple recipients, and when not to use it: 'not for actually delivering it.' It provides a strong exclusion but does not explicitly name an alternative sending tool, so it stops short of a full 5.

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

post_text_message_templates_mergeA

Merge a text message template with multiple recipients. (POST /textMessageTemplates/merge) Despite the name, this does NOT send anything — verified live 2026-09: firing this at a real phone number produced no delivery and no new record in list_text_messages, only a rendered string back ({"mergedTemplate": "..."}). It's a preview/render utility for the edge case of one text greeting multiple recipients at once (e.g. "Hey Bob, Alice and Carol..."), not an actual send.

ParametersJSON Schema
NameRequiredDescriptionDefault
personIdNoPerson ID to use for merge fields like %contact_name%.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
recipientsNoList of recipients of this text message.
templateIdYesThe ID of the text message template.

TDQS

A4.4/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden and handles it exceptionally. It discloses the surprising non-sending behavior, cites live verification, notes that no delivery or record is created, and specifies the exact returned shape ({"mergedTemplate": "..."}). This goes well beyond the schema and corrects a misleading name.

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 warning and behavioral verification are front-loaded, making the most critical information immediate. The description is slightly longer than strictly necessary due to the live-verification anecdote, but that detail earns its place because it substantiates the surprising non-send behavior.

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 no annotations and no output schema, the description is remarkably complete: it explains what the tool actually does, what it does not do, the edge case it serves, and the exact return payload. An agent has enough to invoke it correctly and interpret the response without additional documentation.

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 documents all parameters with 100% coverage, so the description does not need to restate parameter meanings. The description adds overall context for recipients but provides no new parameter-level semantics beyond what the schema already gives.

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 a specific verb and resource ('Merge a text message template with multiple recipients') and supplies the endpoint. It immediately differentiates the tool from actual send operations by asserting 'this does NOT send anything,' so an agent can distinguish it from siblings like create_text_message or post_templates_merge.

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 an explicit when-to-use condition: 'the edge case of one text greeting multiple recipients at once' as a preview/render utility. It also clearly excludes actual sending behavior, though it does not name the alternative send tool explicitly or spell out 'use create_text_message if you want to send.'

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

put_inbox_apps_messageC

Update an Inbox App Message. (PUT /inboxApps/{inboxAppId}/message)

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoFUB ID of the Inbox App Message. Used to identify which message you are updating.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
inboxAppIdYes
deliveryStatusNoThe message's delivery status.
externalMessageIdNoYour unique identifier that represents this message. When provided by itself, it is used to identify which message you are updating. When provided alongside an "id", the message will be identified by its ID and the "externalMessageId" will be updated.
deliveryStatusErrorMessageNoOptional user-facing error message for Not Delivered statuses.

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description carries the full burden of behavioral disclosure, but it only says 'Update' and shows the HTTP method. It does not explain whether this is a partial update or full replacement, what happens to existing fields, whether it is idempotent, or what response to expect. This is a significant transparency gap for a mutating operation.

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 efficient sentence with the key action and endpoint front-loaded. It is appropriately compact, but it is minimal to the point of omitting important context, so it earns a 4 rather than a 5.

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

Completeness2/5

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

Despite the rich schema, the description lacks essential context for an agent to invoke this correctly: no explanation of the two message identification approaches, no indication of required permissions or auth, no note about the inboxAppId path parameter being required, and no behavioral or return-value information. For a tool with no annotations and no output schema, this is incomplete.

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 high (86%), and the schema explains most parameters well, including the dual identification behavior of id and externalMessageId. The description itself adds little parameter meaning beyond showing inboxAppId in the path. Baseline 3 is appropriate because the schema does the heavy lifting.

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 the action ('Update') and the resource ('an Inbox App Message'), and the HTTP endpoint adds precision. It distinguishes update from creation at a basic level, but it does not explicitly contrast with sibling tools like post_inbox_apps_message, 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 Guidelines2/5

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

There is no guidance on when to use this tool instead of related siblings such as post_inbox_apps_message or post_inbox_apps_note. The description gives no context about prerequisites, message identification modes, or scenarios that call for an update, so an agent must infer the intended usage.

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

update_action_plans_personA

Update the status of an Action Plan to Person relationship. (PUT /actionPlansPeople/{id}) ⚠️ Action Plans are a deprecated FUB feature — Automations are the current, recommended mechanism going forward. Unless the user specifically names an existing legacy Action Plan they already rely on, prefer the automationsPerson tools (create_automations_person to trigger one, update_automations_person to pause/unpause) over this one for new workflows.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
statusYesThe desired state of the applied action plan. Either `Running` or `Paused`.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

A4.2/5.0
Behavior3/5

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

Annotations are absent, so the description carries full burden. It usefully discloses the deprecated status of Action Plans and recommends Automations, but it does not describe side effects, reversibility, permissions, or response behavior of the PUT 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?

The description is compact and front-loaded with the action and endpoint, then delivers a high-value deprecation warning and alternative routing. Every sentence earns its place; there is 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 simple status-update operation, the description plus schema provides enough to select and invoke the tool correctly: the resource, HTTP method, required status values, and the deprecation fallback are all present. The only minor gap is that no return/output shape is mentioned, but the operation is simple enough that this is 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?

The schema already documents status values and the extraBody/extraQuery escape hatches, so the description need not repeat them. However, the required id parameter is only typed as a string with no semantic explanation, and the description adds no parameter-level detail.

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

Purpose5/5

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

The description states a specific action and resource: 'Update the status of an Action Plan to Person relationship,' backed by the exact PUT endpoint. It also clearly separates this tool from nearby siblings like create_action_plans_person and update_automations_person.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use guidance: because Action Plans are deprecated, agents should prefer create_automations_person and update_automations_person unless the user explicitly names an existing legacy Action Plan. This directly prevents incorrect tool selection.

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

update_appointmentC

Update an appointment. (PUT /appointments/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
endYesThe ending date and time of the appointment (in UTC, also supports time zone suffix).
startYesThe beginning date and time of the appointment (in UTC, also supports time zone suffix).
titleYesTitle of the appointment.
allDayNoSets whether the appointment is an all day event or not.
typeIdNoThe Follow Up Boss appointment type identifier.
inviteesNoArray of users and/or people to invite to the appointment. (e.g., User object: `{userId: 1, name: "Tom Minch"}`, People object: `{personId: "123", name: "John Q Customer", email: "johnq@example.com"}`)
locationNoThe location or address of the appointment.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
outcomeIdNoThe Follow Up Boss appointment outcome identifier.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
descriptionNoDescription of the appointment or event.
sendInvitationNoSend an invitation email to invitees. (Note: If the "appointment reminders" is enabled, an SMS reminder will also be sent.)

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It only conveys that the operation updates, but does not explain whether unspecified fields are reset, whether invitations are sent, what side effects occur, or what response to expect. This is a significant gap for a mutating endpoint.

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 one short sentence plus the endpoint, with no filler. It is front-loaded and economical, though the brevity contributes to missing behavioral and usage context.

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

Completeness2/5

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

This is a 13-parameter mutation tool with no annotations and no output schema, yet the description provides almost no additional context beyond the schema. An agent still lacks clarity on update semantics, return values, side effects, and how this endpoint relates to the many sibling appointment and event tools.

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 92%, so the parameters are already well documented in the schema. The description adds only the {id} path context, which is useful but minimal; most parameter meaning is carried by the input schema.

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 action ('Update') and resource ('an appointment'), and includes the HTTP method and path (PUT /appointments/{id}). It does not explicitly contrast itself with sibling tools like create_appointment or update_appointment_type, so it misses the differentiator 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 Guidelines2/5

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

There is no guidance about when to use this tool versus alternatives such as create_appointment or get_appointment. The endpoint path implies the resource, but the description does not state prerequisites, whether an existing appointment id is required, or when another tool should be preferred.

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

update_appointment_outcomeC

Update an appointment outcome. (PUT /appointmentOutcomes/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
nameNoThe name of the appointment outcome.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
orderWeightNoSet this value to enforce a specific sort order.

TDQS

C2.7/5.0
Behavior1/5

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

With no annotations, the description carries the full burden of behavioral disclosure, but it only restates the action 'Update' and provides a PUT path. It does not describe partial versus full update behavior, error cases, auth requirements, side effects, or reversibility.

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

Conciseness4/5

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

The description is a single short sentence plus an endpoint with no fluff or repetition of schema details. It is front-loaded and compact, but it is so terse that it contributes little beyond the purpose and endpoint.

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

Completeness2/5

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

For a mutation tool with no annotations, no output schema, five parameters including nested objects, and a large sibling family, this description is incomplete. It omits update semantics, error behavior, prerequisites, and any guidance about what the caller should expect.

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 80%, so the schema already documents name, extraBody, extraQuery, and orderWeight. The description adds no parameter-level meaning beyond that; the required id field remains undocumented in both the schema and description, but the high coverage baseline keeps this at 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 clearly names a specific verb and resource: 'Update an appointment outcome,' and the endpoint clarifies the target operation. It does not explicitly contrast with sibling tools like create_appointment_outcome or get_appointment_outcome, so it stops short of full sibling differentiation.

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

Usage Guidelines2/5

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

There is no guidance on when to use this tool versus alternatives such as create_appointment_outcome or get_appointment_outcome, nor any mention that an existing outcome id is required. The only hint is the verb 'Update,' which leaves selection decisions to inference.

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

update_appointment_typeC

Update an appointment type. (PUT /appointmentTypes/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
nameNoThe name of the appointment type.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
orderWeightNoSet this value to enforce a specific sort order.

TDQS

C2.6/5.0
Behavior1/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It only states 'Update', implying a mutation, but reveals nothing about side effects, required permissions, idempotency, or what happens on partial updates. The HTTP method 'PUT' is mentioned but adds no meaningful behavioral context beyond what the verb already implies.

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

Conciseness3/5

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

The description is extremely short (one sentence) and easy to parse, but it is under-specified rather than efficiently concise. It front-loads the endpoint but omits any substantive guidance. It is not verbose, but the brevity comes at the cost of usefulness.

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

Completeness2/5

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

The tool has 5 parameters including nested objects (extraBody, extraQuery) and no output schema. The description offers no explanation of how these parameters interact, what the update semantics are, or what the response might look like. Given the moderate complexity, the description is inadequate for an agent to confidently invoke 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?

The input schema already provides descriptions for 4 of 5 parameters (80% coverage), including details for extraBody and extraQuery. The tool description adds no additional parameter information, but the schema is sufficiently self-documenting. Baseline 3 is appropriate since the description does not need to compensate for a coverage gap.

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 the verb 'Update' and the resource 'appointment type', making the core purpose understandable. However, it does not differentiate this from sibling tools like update_appointment or update_appointment_outcome, which have similar update semantics. The HTTP endpoint mention adds minor specificity but does not distinguish the tool's unique role.

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 provides no guidance on when to use this tool versus alternatives. There is no mention of prerequisites, typical scenarios, or exclusions. An agent must infer from the name alone, which is insufficient given the large sibling set.

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

update_automations_personB

Pause or unpause an Automation for a Person. (PUT /automationsPeople/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
statusNoAutomation Status, i.e. "Paused" to pause the Automation or "Running" to unpause it
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

B3.4/5.0
Behavior2/5

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

With no annotations provided, the description must carry the full burden of behavioral disclosure. It only states the action (pause/unpause) but gives no information about side effects, permissions required, reversibility, response format, or what happens to associated automation runs. This is a significant gap for a mutation tool.

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

Conciseness5/5

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

The description is a single efficient sentence that front-loads the core action ('Pause or unpause') and includes the endpoint for reference. Every word contributes; there is no fluff or repetition.

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

Completeness2/5

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

With no output schema, no annotations, 4 params (one undocumented), and a relatively narrow action, the description is too minimal. It does not explain what an 'Automation for a Person' represents, how extraBody/extraQuery are used, or any error/return behavior. An agent would need to infer a lot from the schema and sibling tools.

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 75% (status, extraBody, extraQuery have descriptions; id lacks one). The description does not add any detail beyond what the schema already provides for status. It doesn't elaborate on the meaning of id, extraBody, or extraQuery, and fails to compensate for the undocumented id parameter. Basis score of 3 is appropriate given the high schema coverage, but no extra value 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 states a specific action ('Pause or unpause') on a clear resource ('an Automation for a Person') and also provides the HTTP endpoint. This precisely distinguishes it from sibling tools like get_automations_person (retrieval) or create_automations_person (creation).

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 implicitly indicates it is used for pausing/unpausing automations for a person, but it does not explicitly state when to use this over alternatives, nor any excluded scenarios (e.g., other automation updates). No guidance is given about prerequisites or when to resort to list_automations_people or other tools.

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

update_callC

Update a call. (PUT /calls/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
noteNoThe log message entered for this call.
phoneNoThe phone number this call was made to or from.
userIdNoThe ID of the user that made or received a call. (This can only be set by administrators, otherwise the currently logged in user's ID is used.)
outcomeNoThe outcome of the call, which can be one of `Interested`, `Not Interested`, `Left Message`, `No Answer`, `Busy` or `Bad Number`.
durationNoLength of the call in seconds.
personIdNoThe ID of a person associated with this call.
toNumberNoThe phone number this call was made to.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
fromNumberNoThe phone number this call was made from.
isIncomingNoSets this as an incoming or outgoing call.
recordingUrlNoThe URL for the call recording.

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are present, so the description carries the full burden. It only reveals that this is a PUT mutation; it does not disclose auth requirements, partial vs. full replacement semantics, response shape, error behavior, or side effects.

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

Conciseness4/5

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

The description is one concise sentence plus the endpoint, with no filler and the action front-loaded. However, it is so terse that it may be under-specified for a 13-parameter operation, so it does not earn a 5.

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

Completeness2/5

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

Although the input schema is rich, there are no annotations and no output schema. The description provides no usage context, behavioral details, return value, authentication notes, or error semantics. For a complex mutation tool, this is a significant 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 92%, and the schema already provides detailed parameter documentation including outcome enum values, the userId admin restriction, and extraBody/extraQuery behavior. The description itself adds no parameter meaning, 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?

The description clearly states a specific verb ('Update') and resource ('a call'), and gives the HTTP endpoint. This distinguishes it from create_call, get_call, and list_calls. It is minimal but not a tautology, so it earns a 4 rather than 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 Guidelines2/5

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

There is no guidance on when to use this tool versus create_call, get_call, or list_calls. It does not mention that an existing call is required, nor does it discuss the admin-only userId behavior. Usage is only implied by the verb 'Update'.

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

update_conversationB

Updates an Inbox App conversation. (PUT /inboxApps/{inboxAppId}/conversations/{extConversationId})

ParametersJSON Schema
NameRequiredDescriptionDefault
personNoUpdates the person associated with the conversation. Can only be changed if a Person ID has not been set.
subjectNoSets or updates the subject of the conversation if included.
archivedNoArchives or unarchives the conversation if included.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
inboxAppIdYes
assignedUserIdNoThe User ID to reassign the conversation to. Set to 0 to revert back to the conversation owner.
assignedInboxIdNoThe Team Inbox ID to reassign the conversation to. Set to 0 to revert back to the conversation owner.
extConversationIdYes
permanentlyArchivedNoDisables replies/notes and does not allow users to un-archive the conversation.

TDQS

B3.1/5.0
Behavior2/5

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

With no annotations, the description carries the full burden, but it only says 'Updates an Inbox App conversation.' It does not disclose side effects, whether changes are reversible, permission requirements, or the fact that some fields (like person) are conditionally editable (though some of this appears in the schema). The PUT method implies idempotency but that's not stated explicitly.

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 action and resource. Including the endpoint is useful for precise identification. It could add a little more detail (e.g., list of updatable fields) without becoming verbose, but it earns its place.

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

Completeness2/5

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

For a tool with 10 parameters, two required, and no annotations or output schema, the description is too sparse. It gives no summary of what aspects of a conversation can be updated (subject, archived, assignment, etc.), which is important for an agent to know before opening the schema. The schema compensates but the description is not complete enough on its own.

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 description does not mention any parameters, but the input schema already describes 8 of 10 parameters (80% coverage). The description adds no meaning beyond what the schema provides, so it meets the baseline of 3 for 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 states a specific action ('Updates') and resource ('Inbox App conversation'), and includes the HTTP PUT endpoint, which makes it clear this is the updating tool for conversations. It is distinct from sibling tools that handle messages or notes, though it doesn't explicitly name an alternative.

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?

There is no guidance on when to use this tool versus alternatives. The description simply states what it does, with no mention of prerequisites, use cases, or conditions. An agent cannot tell when to pick this over post_inbox_apps_message or other conversation-related tools.

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

update_custom_fieldC

Update a custom field. (PUT /customFields/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
labelNoThe user-friendly name of the custom field (e.g., "Anniversary").
choicesNoArray of options related to a custom field of type `dropdown`.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
hideIfEmptyNoWhen viewing a person, we will hide this field if it is empty.
isRecurringNoSets whether a date field occurs every year (e.g., birthdays, anniversaries, etc.). (Note: This is only set and returned for `date` custom fields.)
orderWeightNoA weighted integer for the field to assign values for custom sorting.
dropdownChoiceMapNoAn optional mapping that points previous dropdown choices (keys) to their new positions (values). This is used to track when options get moved or renamed. If items are missing from the keys, they will be removed. If the mapping is not supplied, then this endpoint will try to determine if items have been moved or renamed on its own.

TDQS

C2.6/5.0
Behavior1/5

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

With no annotations, the description carries the full burden of behavioral disclosure, but it only says 'Update a custom field'—a near-tautology. It does not reveal whether the update is partial or full, how type-specific flags behave, what happens to existing values, or whether any permissions are required.

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

Conciseness4/5

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

The description is one sentence with the action front-loaded and no filler. It is appropriately sized for stating the core purpose, though it sacrifices valuable context for brevity.

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

Completeness1/5

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

For a 9-parameter, nested-object mutation tool with no annotations and no output schema, this description is completely inadequate. It does not explain return values, update behavior, type-specific constraints, or how it relates to sibling tools. The schema helps with parameters, but the tool-level context 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 89%, so the individual parameters are already well documented in the schema. The description itself adds no parameter meaning, but the high coverage makes the baseline score of 3 appropriate.

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

Purpose4/5

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

The description states a specific verb and resource ('Update a custom field') and includes the HTTP method/path, making the core purpose clear. However, it does not differentiate this from sibling tools like create_custom_field or update_deal_custom_field, relying entirely on the name for distinction.

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 is provided about when to use this tool versus alternatives such as create_custom_field, update_deal_custom_field, or the list/get variants. There is no mention of prerequisites, partial-update semantics, or scenarios where another tool would be more appropriate.

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

update_dealC

Update a deal. (PUT /deals/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
nameNoName of the deal.
priceNoThe price associated with this deal.
stageIdNoThe stage that this deal should be assigned to.
userIdsNoA list of user ids that should be part of this deal.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
peopleIdsNoA list of person ids that should be part of this deal.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
descriptionNoDescription of the deal.
teamComissionNoCommission value for a team split.
agentCommisionNoCommission value for an agent split.
possessionDateNoPossession Date for this deal.
commissionValueNoCommission value to assign to this deal.
dueDiligenceDateNoDue Diligence Date for this deal.
projectedCloseDateNoProjected close date of this deal.
earnestMoneyDueDateNoEarnest Money Due Date for this deal.
finalWalkThroughDateNoFinal Walk Through Date for this deal.
mutualAcceptanceDateNoMutual Acceptance Date for this deal.

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries full behavioral disclosure burden. It only restates the mutation and HTTP method, omitting important behavior such as partial vs full replacement, required fields, auth needs, side effects, or response shape.

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 extremely short and front-loaded, with no filler. It is concise, though the wording largely restates the tool name, and the endpoint is the only added structural detail.

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

Completeness2/5

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

Given 18 parameters, no output schema, and no annotations, a two-sentence description is far from complete. It does not explain update semantics, whether all fields are patchable, or what the agent can expect after the call, leaving operational 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?

Schema coverage is 94%, so the schema already documents nearly all 18 parameters, including nested objects like extraBody and extraQuery. The description contributes no parameter-specific meaning, but the high schema coverage keeps this at the 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 a specific verb (Update) and resource (a deal), and the HTTP endpoint PUT /deals/{id} confirms the operation. This is enough to tell it apart from create_deal, get_deal, and list_deals by action, but it does not explicitly call out sibling differences.

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 is given about when to use this tool versus alternatives such as create_deal, get_deal, or update_deal_custom_field. It does not mention prerequisites, when not to use it, or what distinguishes updating a deal from related operations.

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

update_deal_attachmentB

Update a deal attachment. (PUT /dealAttachments/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
uriYesThe URI of an **externally** hosted file.
dealIdYesThe id of the deal you want to update the attachment to.
fileNameYesName of the file.
fileSizeNoSize of the file in bytes.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

B3.1/5.0
Behavior2/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It only reveals that this is a PUT update, implying mutation, but does not explain whether fields are partially or fully replaced, what happens to omitted fields, required permissions, or side effects. This is a significant gap for a mutation tool.

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

Conciseness4/5

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

The description is very concise, with no wasted words, and front-loads the action and endpoint. It is appropriately brief for a tool whose parameter semantics are mostly covered by the schema, though it sacrifices behavioral and usage context for brevity.

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

Completeness2/5

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

For a 7-parameter mutation tool with no annotations and no output schema, the description is too sparse. It does not clarify whether the update is partial or full, what constraints apply to the URI or filename, or any operational caveats. The schema covers parameters but not the overall operation semantics.

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 86%, which is high, so the baseline is 3. The description itself adds no parameter detail, but the schema already documents most parameters clearly, including the externally hosted URI and custom body/query behavior. The only undocumented parameter is id, which is minor given overall 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 action ('Update') and resource ('deal attachment') and includes the HTTP endpoint, which disambiguates it from sibling tools like create_deal_attachment and get_deal_attachment. The verb plus resource is specific and immediately understandable.

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 is provided on when to use this tool versus alternatives such as create_deal_attachment or update_person_attachment. There are no prerequisites, conditions, or exclusions mentioned, so the agent must infer usage solely from the tool name.

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

update_deal_custom_fieldB

Update a deals custom field. (PUT /dealCustomFields/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
typeYesThe type of deals custom field.
labelYesThe user-friendly name of the custom field (e.g., "Anniversary").
choicesNoArray of options related to a deals custom field of type `Dropdown`.
readOnlyNoSets whether the field is read only or not.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
hideIfEmptyNoSets whether we will hide this field if it is empty.
isRecurringNoWhether a date field occurs every year (e.g. birthdays, anniversaries, etc.).
orderWeightNoA weighted integer for the field to assign values for custom sorting.
dropdownChoiceMapNoAn optional mapping that points previous dropdown choices (keys) to their new positions (values). This is used to track when options get moved or renamed. If items are missing from the keys, they will be removed. If the mapping is not supplied, then this endpoint will try to determine if items have been moved or renamed on its own.

TDQS

B3.4/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It merely restates 'Update' and the PUT route but does not disclose whether changes are propagated, whether type changes are destructive, whether choices are validated, or what permissions are required.

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

Conciseness5/5

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

The description is a single clause plus a path reference, with no filler. It is front-loaded with the operation and resource, and the endpoint reference is a useful, non-redundant addition.

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

Completeness2/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, no annotations, and no output schema, an 8-word description is insufficient. It identifies the resource correctly but leaves out high-level usage context and expected behavior, making it incomplete for reliable 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 91%, so the input schema already documents most parameters thoroughly, including edge cases like dropdownChoiceMap and extraBody. The tool description adds no parameter-level semantics, but the schema handles the heavy lifting.

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 the specific operation ('Update') and the exact resource ('deals custom field'), reinforced by the PUT /dealCustomFields/{id} endpoint. This differentiates it from generic update_custom_field and from create_deal_custom_field/get_deal_custom_field.

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 intended use is implied: modify an existing deal custom field. However, it does not explicitly state when to use this tool versus alternatives like update_custom_field or create_deal_custom_field, and there are no exclusions or prerequisites.

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

update_em_campaignC

Update an email marketing campaign. (PUT /emCampaigns/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
nameNoName of the email campaign or template.
subjectNoEmail subject line.
bodyHtmlNoEmail body in HTML.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It only says 'Update' and gives the HTTP method, but does not mention whether it is a partial or full replacement, what fields are updatable, whether the operation is reversible, or what happens to unspecified fields.

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 sentence with no filler. Both the action and the endpoint earn their place, and the most important information is front-loaded.

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

Completeness2/5

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

For a mutating tool with no annotations and no output schema, the description is too sparse. It does not clarify update semantics, required preconditions, or expected behavior beyond the HTTP method, leaving an agent to guess at important invocation details.

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 83%, so the schema already documents most parameters. The description adds no additional parameter context beyond the endpoint's {id} path variable, which is also listed in the schema. Baseline 3 is appropriate.

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

Purpose4/5

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

The description clearly states the verb ('Update') and resource ('email marketing campaign') and includes the exact endpoint (PUT /emCampaigns/{id}). It is immediately distinguishable from create_em_campaign and list_em_campaigns, though it does not explicitly name any sibling as an alternative.

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?

There is no guidance on when to use this tool versus alternatives like update_template or create_em_campaign. The verb 'Update' implies an existing campaign, but the description does not state prerequisites, exclusions, or selection criteria.

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

update_groupB

Update a group. (PUT /groups/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
nameYesThe name of the group.
typeNo`Agent` groups allow admins and agents and `Lender` groups allow lender role users.Agent
usersYesAn array of user IDs that will be members of this group.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
claimWindowNoNumber of seconds to allow someone to claim a lead in a first-to-claim group before reassigning. The default is 30 minutes (1800 seconds) with a minimum of 1 minute and maximum of 30 minutes.
distributionNoThe distribution model to utilize. Lender groups cannot be set to `first-to-claim`.round-robin
defaultPondIdNoThe ID of the pond to assign unclaimed first-to-claim leads to after the claim window expires.
defaultUserIdNoThe ID of the user to assign unclaimed first-to-claim leads to after the claim window expires.
defaultGroupIdNoThe ID of the group to assign unclaimed first-to-claim leads to after the claim window expires.

TDQS

B3/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. The HTTP verb 'PUT' hints at replacement-style semantics, but the description does not mention idempotency, effects on existing group memberships, authentication requirements, or whether this is a full update versus a partial update. For a mutating tool, that is a significant omission.

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 sentence plus an endpoint, with no filler and the core verb front-loaded. It is appropriately brief, though so terse that it omits usage context. On the conciseness/structure axis this brevity is a strength, not a weakness.

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

Completeness2/5

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

Given 11 parameters, nested objects, and no annotations or output schema, the description should at least explain update semantics, required fields, and likely return behavior. None of that is present. The rich schema explains parameter meanings, but the tool's overall behavior is under-specified for an agent to invoke it confidently.

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 describes 91% of parameters, including enum constraints, defaults, and meanings, so the description's job here is mostly to add context beyond the schema. The one valuable addition is 'PUT /groups/{id}', which clarifies that id goes into the URL path rather than only into the request body. This pushes it slightly above the 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 is short but does give a clear verb ('Update') and resource ('group'), and the HTTP endpoint helps an agent tell it apart from create_group, get_group, and list_groups at a basic level. However, it never specifies what aspects of the group can be updated—membership, distribution, claim window, etc.—so it is clear but not fully specific.

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?

There is no when-to-use guidance at all. The description never contrasts this tool with create_group, get_group, or list_groups, nor does it state that the id must refer to an existing group. An agent is left to infer the intended use from the tool name alone.

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

update_noteB

Edit a note. (PUT /notes/{id}) If body contains HTML markup, you must also pass isHtml=true.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
bodyNoThe content of the note.
isHtmlNoIf enabled, will render the HTML tags contained within the body on the Follow Up Boss user interface.
subjectNoYou can give a note a title or subject using this field.
personIdNoThe ID of a person associated with this note.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It mentions the HTTP method (PUT) which implies idempotent update semantics, and the HTML rendering behavior is disclosed. However, it doesn't state whether the update is partial or full replacement, what happens to omitted fields, whether personId association is required, or what the response looks like. For a mutation tool with zero annotation coverage, this is a significant gap.

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

Conciseness4/5

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

Two sentences with no waste. The core action is front-loaded, and the critical conditional (isHtml) is stated immediately. The HTTP method/path is a useful addition. It earns a 4 because it's efficient and well-ordered, though it could have added a bit more behavioral context without becoming bloated.

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

Completeness2/5

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

For a mutation tool with no annotations and no output schema, the description is thin. It doesn't explain update semantics (partial vs full), whether the note must exist, what happens to omitted fields, or the response format. The schema covers parameters well, but the behavioral context around the update operation is missing. An agent would need to infer too much about how this tool behaves.

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 86%, so the schema already documents most parameters well. The description adds one meaningful semantic detail beyond the schema: the isHtml=true requirement when body contains HTML. However, it doesn't clarify the relationship between body and extraBody, or whether subject is optional, but the schema covers those adequately. Baseline 3 is appropriate since the schema does most of the heavy lifting.

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 and resource: 'Edit a note.' It also includes the HTTP method and path (PUT /notes/{id}), which helps distinguish it from create_note and get_note. However, it doesn't explicitly contrast with sibling tools like create_note or update_person, so it's clear but not fully differentiated.

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 gives one specific usage condition: if body contains HTML markup, isHtml=true must be passed. This is useful guidance for when to set a parameter, but it doesn't say when to use this tool versus alternatives like create_note or update_person. The context is implied by the tool name and sibling list, but no explicit when/when-not guidance is provided.

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

update_people_relationshipC

Update details of a specific relationship. (PUT /peopleRelationships/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
typeNoThe type of relationship. (e.g., `Spouse`, `Brother`, `Partner` , etc.)
emailsNoA list of email addresses associated with the relationship. (Specify type and value, `isPrimary` is not expected. The first email in the list will be the primary email address for the relationship.)
phonesNoA list of phone numbers associated with the relationship. (Specify type and value, `isPrimary` is not expected. The first phone in the list will be the primary phone number for the relationship.)
lastNameNoThe last/family name of the relationship.
addressesNoA list of addresses associated with the relationship. (This is the address where this person can be contacted, it is not the address of a property this person may be interested in selling or buying).
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
firstNameNoThe first/given name of the relationship.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description bears the full burden. It discloses little beyond the PUT method and path: it does not describe whether unspecified fields are preserved or overwritten, whether nested email/phone/address arrays replace the full set, or any required permissions. This is minimal for a mutation tool.

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

Conciseness4/5

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

A single short sentence conveys the operation and endpoint without wasted words. It is well-structured but terse to the point of omitting behavioral guidance.

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

Completeness2/5

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

For a nine-parameter update with nested object arrays and no output schema or annotations, a one-line description is insufficient. The rich schema mitigates only parameter meaning, not usage context, effects on existing data, or return expectations.

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 documents all parameters in detail (89% coverage), so the description need not repeat them. The description adds no parameter-level meaning beyond the endpoint path; baseline 3 is appropriate.

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

Purpose4/5

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

The description states a clear verb and resource: 'Update details of a specific relationship' with the PUT /peopleRelationships/{id} endpoint. It is identifiable as an update operation against one relationship, though it does not explicitly contrast with create/get/list 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 explicit when-to-use guidance or alternative routing is given. Although the verb 'Update' implies modification of an existing resource, the description does not mention that it requires an existing relationship id or that create_people_relationship should be used for new relationships.

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

update_personA

Update a person by id. (PUT /people/{id}) FUB's docs also list a wildcard "custom*" field here for reading/writing custom fields directly (e.g. a "Closing Date" field as custom.ClosingDate) — that's not a literal field name, so it's not in this tool's fixed schema. Pass custom. entries via extraBody instead. Call list_custom_fields first to get exact names. Tag removal has no dedicated endpoint: to remove a tag, first GET this person, filter the tag out of their current tags array yourself, then PUT the full filtered array back (with mergeTags left at its default of false so it replaces rather than merges). To add tags, just pass the new tags with mergeTags=true (this tool's default) so they're unioned with the person's existing tags. ⚠️ DATA LOSS RISK, confirmed against the live API: emails, phones, and addresses are REPLACED wholesale if you include them — there is no merge flag for these like there is for tags. Sending a single new phone number wipes out every other phone number the person had. To add one without losing the rest, GET the person first, append to their existing emails/phones/addresses array yourself, and PUT the complete merged array back. Never send a partial list unless the user explicitly wants everything else removed. collaborators is also settable here even though FUB's own docs don't list it on this endpoint (confirmed working in practice) — it has the same replace-not-merge behavior as tags/phones: omitting an existing collaborator's user id removes them, so GET the person first and merge if you only want to add one. Pass it via extraBody. Setting stage to "Trash" hides the person from default list views (FUB excludes trashed people from GET /people unless includeTrash is set) — it's reversible, but feels like the contact vanished to someone who isn't expecting it, so this requires confirm=true just like a delete, even though it isn't one.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
tagsNoA list of tags applied to the person. **This list will overwrite any existing tags for the person.** (To merge the tags passed with any existing tags,set the `mergeTags` query parameter in your request to true.)
priceNoThe price of the property of the person's first inquiry, or the estimated sell/buy price for this person.
stageNoThe stage the person is in. (e.g., "Lead" or "Trash". See [stage API endpoint](ref:stages-get) for more options.)Lead
emailsNoA list of email addresses associated with the person.
phonesNoA list of phone numbers associated with the person.
confirmNoOnly needed if `stage` is being set to "Trash" — must be true in that case, confirmed with the user first (it hides the contact from default views). Not needed for any other update.
lastNameNoThe last/family name of the person.
addressesNoA list of addresses associated with the person. (This is the address where this person can be contacted, it is not the address of a property this person may be interested in selling or buying).
contactedNoWhether the person has been contacted. (**Note**: Changing the `contacted` field to `true` will pause action plans.)
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
firstNameNoThe first/given name of the person.
mergeTagsNoIf set to true, this will merge the tags sent in the `tags` argument with the current list of tags. By default, it overwrites the existing tags.
assignedToNoFull name of the agent assigned to this person.
backgroundNoBackground information on the person. (Can be a multi-line string.)
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
timeframeIdNoID of the timeframe to move (Refer to the /timeframes endpoint for valid values of timeframeId.)
assignedPondIdNoID of the pond assigned to this person.
assignedUserIdNoID of the agent assigned to this person.
assignedLenderIdNoID of the lender assigned to this person.
assignedLenderNameNoFull name of the lender assigned to this person.

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description carries the full burden, and it is unusually transparent: it warns about wholesale replacement of emails/phones/addresses, explains collaborator replace-not-merge behavior, and discloses that Trash hides the person from default list views. The main flaw is that mergeTags is described both as having a 'default of false' and as defaulting to true, which undermines the operational clarity.

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 long, but the tool has 21 parameters, nested objects, and severe data-loss risks, so most sentences earn their place. The warning-heavy structure and upfront 'Update a person by id' help orientation, though the repeated and contradictory mergeTags guidance could have been tightened.

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 no annotations, a complex mutation endpoint, and high-stakes replace semantics, the description covers remarkably well: custom field handling, tag removal, partial-array danger, collaborator behavior, and Trash confirmation. The absence of an output schema is mitigated by the rich operational context; the internal mergeTags default discrepancy keeps it from being fully complete.

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 95%, so the schema already handles most parameter documentation; the description adds genuinely useful beyond-schema meaning: custom.* fields belong in extraBody, collaborators are passed via extraBody, confirm is only needed for Trash, and emails/phones/addresses replace rather than merge. The value is reduced by the contradictory default statements about mergeTags, but it still meaningfully exceeds the baseline.

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

Purpose5/5

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

The description opens with 'Update a person by id' and names the endpoint PUT /people/{id}, giving a specific verb, resource, and identifier. This clearly distinguishes the tool from create_person, get_person, and list_people, and its scope 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?

The description provides concrete guidance: call list_custom_fields first, GET the person before tag removal or before merging emails/phones/addresses/collaborators, and require confirm=true when setting stage to Trash. It does not explicitly contrast with create/get tools, but it gives enough context that an agent can tell when update_person is the right call.

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

update_person_attachmentC

Update an attachment by ID. (PUT /personAttachments/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
uriYesURI of an externally hosted file.
fileNameYesName of the file.
fileSizeNoSize of the file in bytes.
personIdYesID of the person.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description carries the full burden and only states 'Update' plus the HTTP method. It does not disclose whether this is a full replacement, whether missing fields are cleared, idempotency, permission requirements, or side effects.

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

Conciseness4/5

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

The description is a single short sentence with the endpoint immediately available. It is front-loaded and free of filler, though it is minimal to the point of underspecification.

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

Completeness2/5

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

For a mutation tool with no annotations and no output schema, the description is too sparse. It does not explain required fields, update semantics, error behavior, or return value, leaving an agent without enough context to call it confidently.

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 high at 86%, so the schema already documents most parameters. The description adds only that the ID is part of the PUT endpoint path and does not provide additional meaning beyond the schema.

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

Purpose4/5

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

The description states a specific verb and resource: 'Update an attachment by ID.' The endpoint reference clarifies the target. It does not explicitly differentiate from sibling update tools, but the resource is clearly specified.

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 is provided about when to use this tool versus alternatives like create_person_attachment or update_deal_attachment. There are no context cues, prerequisites, or exclusions.

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

update_pipelineC

Update a pipeline. (PUT /pipelines/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
nameNoName of the pipeline.
stagesNoAn array of stage objects that should be associated with the pipeline.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
descriptionNoDescription of the pipeline.
orderWeightNoSet this value to enforce a specific sort order.

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It only says 'Update' and shows PUT, but does not explain whether the update is a full replacement or partial merge, whether stages are replaced as a whole, what side effects occur, or what the response will be. This is a significant gap for a mutation tool.

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

Conciseness4/5

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

The description is extremely short and contains no filler, and the HTTP method and path are useful context. However, it is so minimal that it borders on under-specification; there is room for one or two more sentences about update behavior without sacrificing conciseness.

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

Completeness2/5

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

For a tool with seven parameters, nested stages objects, extraBody/extraQuery, no annotations, and no output schema, this description is incomplete. An agent cannot know whether stages should be fully specified, how extraBody interacts with named fields, or what a successful update returns. Sibling tools like create_pipeline and get_pipeline are not referenced either.

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 86%, so the schema already documents most parameters. The description itself adds no parameter-level meaning, but with high schema coverage a baseline of 3 is appropriate. The remaining undocumented detail, such as the semantics of the required id, is not compensated for by the description.

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 and resource: 'Update a pipeline.' The HTTP method PUT and path '/pipelines/{id}' reinforce that this acts on an existing pipeline, distinguishing it from create_pipeline and get_pipeline by name. It does not explicitly contrast with siblings, but the purpose is not vague.

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?

There is no guidance on when to use this tool versus create_pipeline, get_pipeline, or list_pipelines. The description only repeats the action; it does not mention prerequisites, whether the pipeline must already exist, or when a different sibling would be appropriate.

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

update_pondB

Update a pond by id. (PUT /ponds/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
nameNoSet this value to change the name of the Pond
userIdNoSet this value to change the Pond Lead Agent
userIdsNoSet this value to add or remove members from the pond
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

B3.2/5.0
Behavior2/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It only says 'Update' and notes the PUT verb; it does not mention whether updates are partial or full replacement, auth requirements, side effects, or what is returned.

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

Conciseness5/5

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

The description is two short clauses with no filler: 'Update a pond by id. (PUT /ponds/{id})'. Every word earns its place and the core purpose is front-loaded.

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

Completeness2/5

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

This is a mutation tool with no annotations and no output schema, yet the description omits usage context, behavioral details, and response expectations. The schema covers parameters, but the description alone is too thin for an agent to fully understand the operation's implications.

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 83%, and the schema already describes most parameters, including extraBody and extraQuery. The tool description adds no parameter-level meaning beyond the schema, so the baseline of 3 applies.

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

Purpose5/5

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

The description states the action ('Update') and the resource ('a pond by id') explicitly, and includes the HTTP endpoint. This clearly distinguishes it from sibling tools like create_pond, get_pond, and list_ponds.

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 is provided on when to use this tool versus create_pond, get_pond, or list_ponds. The phrase 'by id' implies an existing pond, but there is no explicit context, prerequisite, or exclusion.

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

update_stageC

Update a stage. (PUT /stages/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
nameNoName of the stage
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
orderWeightNoHelps to set a specific sort order.

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description carries the full behavioral disclosure burden. It only says 'Update a stage' and gives the HTTP method, which implies mutation but does not explain whether the update is partial or full, what effects it has on existing stage data, or the response shape. This is a meaningful transparency gap for a mutating 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 a single front-loaded sentence with no filler; the action and endpoint are stated efficiently. However, it is terse to the point of omitting useful behavioral context, so it is not maximally effective despite being concise.

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

Completeness2/5

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

For a 5-parameter update tool with no annotations and no output schema, the description is far from complete. It lacks update semantics, usage context, and any indication of response behavior. The agent would need to infer most practical details from the schema and endpoint.

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 80%, and the schema already documents name, extraBody, extraQuery, and orderWeight. The description adds no parameter-level meaning, so the baseline score of 3 applies. The description provides no extra context about how these parameters interact with the update operation.

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 and resource: 'Update a stage', which distinguishes it from create, get, and list operations on stages. Including the HTTP endpoint adds precision. It is not a 5 because it gives no indication of which stage attributes are updatable, though the schema partially covers that.

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?

There is no guidance on when to use this tool versus create_stage, get_stage, or list_stages. The description only names the action, leaving the agent to infer that it should be used to modify an existing stage. No prerequisites, exclusions, or alternative conditions are mentioned.

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

update_taskC

Update a task. (PUT /tasks/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
nameNoThe name of the task.
typeNoType can be one of the following: `Follow Up`, `Call`, `Email`, `Appointment`, `Showing`, `Closing`, `Open House` or `Thank You`
personIdNoThe id of the person this task is related to.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
assignedToNoThe full name of the agent to assign to this task.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.
isCompletedNoSets whether the task is completed or not.
assignedUserIdNoThe id of the user to assign to this task.

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations provided, the description carries the burden of behavioral disclosure. It only states that it updates a task via PUT, which implies mutation but does not clarify whether it is a partial or full replacement, side effects, required permissions, or what happens to unspecified fields.

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

Conciseness4/5

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

The description is very short with no filler words, and the core action is front-loaded. It is efficient, though it sacrifices useful contextual detail for brevity.

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

Completeness2/5

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

For a tool with 9 parameters, nested objects, no annotations, and no output schema, this description is underdeveloped. It does not explain update semantics, which fields are updatable, how id is used, or how extraBody/extraQuery interact with the update 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?

Schema description coverage is 89%, so the parameters are already well-documented in the schema. The description adds no additional meaning beyond the schema, landing at the baseline for high coverage.

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

Purpose4/5

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

The description states a specific verb ('Update') and resource ('a task'), and the endpoint 'PUT /tasks/{id}' reinforces the action. It is clear enough to identify the tool's core function, though it does not articulate scope or distinguish it from create_task/get_task in explicit terms.

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 is provided about when to use this tool versus alternatives such as create_task, get_task, or list_tasks. The description implies 'update existing task' but gives no context around prerequisites, completion, or conditions for use.

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

update_teamB

Update a team by id. (PUT /teams/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
nameNoThe team name.
userIdsNoThe complete list of members of this team.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
leaderIdsNoThe complete list of team leaders.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

B3.2/5.0
Behavior2/5

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

With no annotations, the description carries the full burden of behavioral disclosure, but it only says 'Update a team by id' and mentions the PUT method. It does not disclose whether this is a partial or full replacement, whether userIds is a complete-list replacement, or any side effects or permission requirements. The PUT verb hints at replacement semantics but does not explicitly communicate 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?

The description is a single sentence that front-loads the core action and targeting mechanism, followed by the HTTP method in parentheses. There is no wasted text or redundant information.

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

Completeness2/5

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

Despite having 6 parameters, nested objects, and no output schema or annotations, the description is extremely minimal. It omits behavioral details like replacement semantics, which fields are mutable, and what happens to unspecified fields. An agent would need to infer too much from parameter names and descriptions alone.

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 high (83%), and the schema already documents fields like userIds as 'The complete list of members of this team.' The description itself adds no parameter-level meaning, so it neither compensates for gaps nor improves on the schema. A baseline of 3 is appropriate because the schema carries the parameter documentation burden.

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

Purpose4/5

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

The description states a specific verb ('Update'), a resource ('team'), and the targeting mechanism ('by id'), making it clear what the tool does. It is distinguishable from siblings like get_team and list_teams, though it does not explicitly contrast itself against them.

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?

Usage is implied by 'Update a team by id' and the PUT method, which signals this is for modifying an existing team rather than creating one. However, there is no explicit when-to-use guidance, no exclusion of alternatives, and no mention that this should be chosen when a team already exists.

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

update_templateA

Update an email template. (PUT /templates/{id}) FUB templates support %merge_field% placeholders that FUB substitutes when a human actually sends the template (not by this tool — this just saves the template text as-is). Reference: Contact: %contact_name% (full), %contact_first_name%, %contact_last_name%, %contact_email%, %contact_phone%, %contact_address%, %contact_street%, %contact_city%, %contact_state%, %contact_zipcode%, %contact_country%, %contact_rels_first_name% (first names of the contact's linked relationships, e.g. spouse/family added via peopleRelationships). Company (from Admin > Company settings): %company_name%, %company_phone%. Agent / Lender / Sender — same field set, swap the prefix (agent = assigned agent, lender = assigned lender, sender = whoever is actually sending this particular message, which may be neither): %agent_name%, %agent_first_name%, %agent_last_name%, %agent_email%, %agent_phone% (the FUB-assigned calling/texting number), %agent_mobile_phone% (their real/personal number), %agent_merge_field_1% (one free-form field each user sets in My Settings > Other Settings > Edit User Merge Field — commonly a booking link or social profile). ⚠️ %_phone% vs %mobile_phone% is genuinely ambiguous — always confirm with the user which one they mean before using either; picking wrong sends the recipient the wrong callback number. Inquiry (how the contact became a lead, e.g. clicking "Get more info" on a listing site): %inquiry_address%, %inquiry_address_url% (only if the lead source provided one), %inquiry_address_preview% (renders an HTML photo+link box — email only, meaningless in a plain-text SMS template). Recently viewed (populated only when synced with a provider that shares property views): %viewed_address%, %viewed_address_url%, %viewed_address_preview%, %last_5_preview% (up to 5 as HTML boxes, email only). Other: %source_name% (lead source, e.g. "Zillow" — "I saw your inquiry on %source_name%"), %greeting_time% ("Morning"/"Afternoon"/"Evening" based on send time — "Good %greeting_time%, %contact_first_name%"), %tour_time% (populated if the contact scheduled a tour via Zillow). Custom fields: %custom% (e.g. %custom_website%, %custom_birthday%, %custom_spouse_name%). Call list_custom_fields to confirm a field exists — but note its API name (e.g. customBirthday, camelCase) and its merge-field name (%custom_birthday%, snake_case) are different spellings of the same field, and there's no API that returns the merge-field spelling directly, so confirm the exact form with the user (or FUB's own Merge Fields dropdown in the template composer) if it's not obvious from the label. A merge field with no value for a given contact is simply left blank when the template is used — not an error, not a visible placeholder.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
bodyYesThe new body for the email template.
nameYesThe new name for the email template.
subjectYesThe new subject for the email template.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

A3.6/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and it does important work: it explicitly states that FUB substitutes merge fields only when a human sends the template, 'not by this tool,' and that empty merge fields are left blank rather than causing errors. It omits details like overwrite semantics or return value, but the core no-side-effect behavior is clearly disclosed.

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

Conciseness4/5

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

The description is long, but it is front-loaded with the core purpose and then organized into clear categories: contact, company, agent, inquiry, viewed, other, and custom fields. Each section is directly relevant to constructing valid template content, so the length is justified rather than padding.

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 complexity of FUB merge fields and the absence of both annotations and an output schema, the description covers the hardest part comprehensively: the full merge-field catalog, the custom-field naming mismatch, and a pointer to list_custom_fields. It does not cover return values or explicit alternative routing, but an agent has enough to invoke the tool 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 high at 83%, so the baseline is 3. The description adds real value by enumerating valid merge-field syntax for the body and subject parameters and warning about the ambiguous %*_phone% vs %*_mobile_phone% distinction. It does not add meaning to id, extraBody, or extraQuery, but the schema already describes those well enough.

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

Purpose4/5

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

The opening sentence names a specific verb and resource: 'Update an email template.' It also identifies the HTTP endpoint and clarifies that this tool only saves template text, not sends messages, which helps distinguish it from send/merge operations. It does not explicitly name sibling alternatives, so it falls just 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 Guidelines2/5

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

The description never says when to use update_template instead of create_template, update_text_message_template, or post_templates_merge. It gives useful content-level guidance around merge fields, but that is about what to put in the body/subject, not about tool selection.

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

update_text_message_templateA

Update a text message template. (PUT /textMessageTemplates/{id}) FUB templates support %merge_field% placeholders that FUB substitutes when a human actually sends the template (not by this tool — this just saves the template text as-is). Reference: Contact: %contact_name% (full), %contact_first_name%, %contact_last_name%, %contact_email%, %contact_phone%, %contact_address%, %contact_street%, %contact_city%, %contact_state%, %contact_zipcode%, %contact_country%, %contact_rels_first_name% (first names of the contact's linked relationships, e.g. spouse/family added via peopleRelationships). Company (from Admin > Company settings): %company_name%, %company_phone%. Agent / Lender / Sender — same field set, swap the prefix (agent = assigned agent, lender = assigned lender, sender = whoever is actually sending this particular message, which may be neither): %agent_name%, %agent_first_name%, %agent_last_name%, %agent_email%, %agent_phone% (the FUB-assigned calling/texting number), %agent_mobile_phone% (their real/personal number), %agent_merge_field_1% (one free-form field each user sets in My Settings > Other Settings > Edit User Merge Field — commonly a booking link or social profile). ⚠️ %_phone% vs %mobile_phone% is genuinely ambiguous — always confirm with the user which one they mean before using either; picking wrong sends the recipient the wrong callback number. Inquiry (how the contact became a lead, e.g. clicking "Get more info" on a listing site): %inquiry_address%, %inquiry_address_url% (only if the lead source provided one), %inquiry_address_preview% (renders an HTML photo+link box — email only, meaningless in a plain-text SMS template). Recently viewed (populated only when synced with a provider that shares property views): %viewed_address%, %viewed_address_url%, %viewed_address_preview%, %last_5_preview% (up to 5 as HTML boxes, email only). Other: %source_name% (lead source, e.g. "Zillow" — "I saw your inquiry on %source_name%"), %greeting_time% ("Morning"/"Afternoon"/"Evening" based on send time — "Good %greeting_time%, %contact_first_name%"), %tour_time% (populated if the contact scheduled a tour via Zillow). Custom fields: %custom% (e.g. %custom_website%, %custom_birthday%, %custom_spouse_name%). Call list_custom_fields to confirm a field exists — but note its API name (e.g. customBirthday, camelCase) and its merge-field name (%custom_birthday%, snake_case) are different spellings of the same field, and there's no API that returns the merge-field spelling directly, so confirm the exact form with the user (or FUB's own Merge Fields dropdown in the template composer) if it's not obvious from the label. A merge field with no value for a given contact is simply left blank when the template is used — not an error, not a visible placeholder. Texting-specific, per FUB's own Compliance/Carrier Filtering guidance: initial/first-outreach text templates should include opt-out language ("Reply STOP to unsubscribe") and introduce the sender/company by name. Avoid designing a template purely for identical mass-blasting — carriers filter messages that look like spam, personalization (via merge fields) reduces that risk. If the template includes a URL, use the full URL rather than a shortened link, since shorteners are more likely to get carrier-filtered.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
nameYesThe name of your text message template.
messageYesThe body of your text message template.
isSharedNoSet to true if this template should be shared with other users in the same Follow Up Boss account.
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

A3.7/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden and provides substantial context: it clarifies that merge fields are saved as-is and only substituted when a human sends the template, and that empty merge fields are left blank. It also warns about the ambiguous phone/mobile_phone fields and carrier filtering. It does not mention permissions or response shape, but it adds meaningful non-obvious behavior.

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

Conciseness2/5

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

The first sentence is appropriately front-loaded, but the rest is a lengthy, multi-section reference manual and compliance essay. While the merge-field details are useful, their density makes the description unwieldy for tool selection and invocation. It should be condensed or relocated to separate documentation.

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 no annotations or output schema, the description covers the hardest contextual parts: how merge fields behave, blank-value handling, ambiguous phone fields, and compliance considerations. It omits a few operational details like return value and permission requirements, but it is sufficient for correctly composing and invoking an update.

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 83%, so the baseline is 3, and the description adds real value for the message parameter by enumerating the full merge-field vocabulary with examples. The id parameter remains undocumented and the reference is not explicitly tied to input properties, but this goes 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 opens with 'Update a text message template' and gives the exact PUT endpoint, making the verb and resource explicit. This clearly distinguishes it from create_text_message_template, get_text_message_template, and the generic update_template.

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 states when to use this tool versus creating a new template or listing existing templates. The note that merge fields are not substituted by this tool is behavioral, not a usage guideline. Selection is left to inference from the tool name.

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

update_webhookC

Update a webhook. (PUT /webhooks/{id})

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes
urlNoThe url of the webhook. Must be a secure endpoint (https).
eventNoThe event the webook responds to. Should be one of the following: `peopleCreated`, `peopleUpdated`, `peopleDeleted`, `notesCreated`, `notesUpdated`, `notesDeleted`, `emEventsOpened`, `emEventsClicked`, `emEventsUnsubscribed`, `tasksCreated`, `tasksUpdated`, `tasksDeleted`, `appointmentsCreated`, `appointmentsUpdated`, `appointmentsDeleted`, `textMessagesCreated`, `textMessagesUpdated`, `textMessagesDeleted`, `callsCreated`, `callsUpdated`, `callsDeleted`, `emailsCreated`, `emailsUpdated`, `emailsDeleted` or `eventsCreated`
statusNoThe status of the webhook. Can be `Active` or `Disabled`
extraBodyNoExtra raw JSON body fields not explicitly listed above — e.g. custom.* fields when creating/updating people or deals. Keys and values are sent as-is.
extraQueryNoExtra raw query parameters not explicitly listed above — e.g. FUB custom field filters like custom.ClosingDate on /people or /deals. Keys and values are sent as-is.

TDQS

C2.9/5.0
Behavior2/5

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

There are no annotations, so the description carries the full behavioral disclosure burden. It only reveals that this is a PUT update; it does not explain whether it is a partial or full update, whether disabling is reversible, or what side effects occur. This is insufficient for a mutating webhook endpoint.

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 very short and puts the endpoint upfront, with no filler. 'Update a webhook' is somewhat redundant with the tool name, but the description earns its conciseness by adding the HTTP method and path.

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

Completeness2/5

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

For a tool with 6 parameters, no output schema, no annotations, and many webhook-related siblings, the description is incomplete. It lacks usage context, behavioral expectations, and any response or error information, leaving the agent to rely almost entirely on the schema and surrounding context.

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 83%, and most parameters (url, event, status, extraBody, extraQuery) have meaningful descriptions already. The tool description adds no parameter semantics of its own, so the baseline score of 3 applies given the high schema coverage.

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 mutation verb and resource ('Update a webhook') and gives the HTTP endpoint, which distinguishes it from sibling tools like create_webhook and get_webhook. It is clear but minimal, offering no detail on what aspects of the webhook can be updated.

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 is provided on when to use this tool versus create_webhook, get_webhook, or list_webhooks. The only signal is the verb 'Update' and the PUT method, which the agent must infer on its own.

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. 133 tool updatesv0.1.0
    • First observedcreate_action_plans_person
    • First observedcreate_appointment
    • First observedcreate_appointment_outcome
    • First observedcreate_appointment_type
    • First observedcreate_automations_person
    • First observedcreate_call
    • First observedcreate_custom_field
    • First observedcreate_deal
    • First observedcreate_deal_attachment
    • First observedcreate_deal_custom_field
    • First observedcreate_em_campaign
    • First observedcreate_em_event
    • First observedcreate_event
    • First observedcreate_group
    • First observedcreate_note
    • First observedcreate_people_relationship
    • First observedcreate_person
    • First observedcreate_person_attachment
    • First observedcreate_pipeline
    • First observedcreate_pond
    • First observedcreate_reaction
    • First observedcreate_stage
    • First observedcreate_task
    • First observedcreate_team
    • First observedcreate_template
    • First observedcreate_text_message
    • First observedcreate_text_message_template
    • First observedcreate_webhook
    • First observedget_appointment
    • First observedget_appointment_outcome
    • First observedget_appointment_type
    • First observedget_automation
    • First observedget_automations_person
    • First observedget_call
    • First observedget_custom_field
    • First observedget_deal
    • First observedget_deal_attachment
    • First observedget_deal_custom_field
    • First observedget_event
    • First observedget_group
    • First observedget_groups_round_robin
    • First observedget_identity
    • First observedget_inbox_apps_conversations_participants
    • First observedget_installed_app
    • First observedget_me
    • First observedget_note
    • First observedget_people_check_duplicate
    • First observedget_people_relationship
    • First observedget_people_unclaimed
    • First observedget_person
    • First observedget_person_attachment
    • First observedget_pipeline
    • First observedget_pond
    • First observedget_rate_limit_limits
    • First observedget_rate_limit_usage
    • First observedget_reaction
    • First observedget_smart_list
    • First observedget_stage
    • First observedget_task
    • First observedget_team
    • First observedget_template
    • First observedget_text_message
    • First observedget_text_message_template
    • First observedget_threaded_reply
    • First observedget_user
    • First observedget_webhook
    • First observedget_webhook_event
    • First observedlist_action_plans
    • First observedlist_action_plans_people
    • First observedlist_appointment_outcomes
    • First observedlist_appointment_types
    • First observedlist_appointments
    • First observedlist_automations
    • First observedlist_automations_people
    • First observedlist_calls
    • First observedlist_custom_fields
    • First observedlist_deal_custom_fields
    • First observedlist_deals
    • First observedlist_em_campaigns
    • First observedlist_em_events
    • First observedlist_events
    • First observedlist_groups
    • First observedlist_notes
    • First observedlist_people
    • First observedlist_people_relationships
    • First observedlist_pipelines
    • First observedlist_ponds
    • First observedlist_smart_lists
    • First observedlist_stages
    • First observedlist_tasks
    • First observedlist_team_inboxes
    • First observedlist_teams
    • First observedlist_templates
    • First observedlist_text_message_templates
    • First observedlist_text_messages
    • First observedlist_timeframes
    • First observedlist_users
    • First observedlist_webhooks
    • First observedpost_inbox_apps_conversations_participants
    • First observedpost_inbox_apps_install
    • First observedpost_inbox_apps_message
    • First observedpost_inbox_apps_note
    • First observedpost_inbox_apps_system_message
    • First observedpost_people_claim
    • First observedpost_people_ignore_unclaimed
    • First observedpost_templates_merge
    • First observedpost_text_message_templates_merge
    • First observedput_inbox_apps_message
    • First observedupdate_action_plans_person
    • First observedupdate_appointment
    • First observedupdate_appointment_outcome
    • First observedupdate_appointment_type
    • First observedupdate_automations_person
    • First observedupdate_call
    • First observedupdate_conversation
    • First observedupdate_custom_field
    • First observedupdate_deal
    • First observedupdate_deal_attachment
    • First observedupdate_deal_custom_field
    • First observedupdate_em_campaign
    • First observedupdate_group
    • First observedupdate_note
    • First observedupdate_people_relationship
    • First observedupdate_person
    • First observedupdate_person_attachment
    • First observedupdate_pipeline
    • First observedupdate_pond
    • First observedupdate_stage
    • First observedupdate_task
    • First observedupdate_team
    • First observedupdate_template
    • First observedupdate_text_message_template
    • First observedupdate_webhook

TDQS

C2.7/5.0

Scored across 133 tools

Disambiguation3/5

Most tools map cleanly to a resource+action, but the sheer number (133) and similar names create real ambiguity: create_event vs. create_person, list_events vs. list_em_events, and the people/claim/ignore_unclaimed cluster are easy to confuse. Descriptions help, but the boundaries are not immediately evident from the names alone.

Naming Consistency2/5

The dominant list_/get_/create_/update_ pattern is undermined by several post_/put_ prefixed tools (post_people_claim, put_inbox_apps_message) and inconsistent singular/plural forms (create_automations_person vs. list_automations_people). This mixes verb styles and noun forms within the same resource families, making the naming pattern unreliable.

Tool Count1/5

133 tools is an extreme count for any MCP server; it far exceeds the 50+ threshold for a severe mismatch. While a full CRM API is inherently large, exposing every endpoint as a separate tool creates a heavy, unwieldy surface that is hard for agents to navigate.

Completeness3/5

The surface is remarkably broad, covering people, deals, pipelines, stages, notes, calls, tasks, appointments, templates, webhooks, teams, automations, and custom fields. However, there are notable gaps: no delete operation exists for any resource, events lack update, and there is no actual send capability for emails/texts (only template merge/render utilities).

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI assistants to directly interact with the entire GoHighLevel CRM via 563+ tools across 44 categories, allowing natural language control for contacts, messaging, opportunities, calendars, and more.
    17 npm
    1
    ISC
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables Claude to interact with Follow Up Boss CRM, allowing lead management, task scheduling, and pipeline tracking through natural language.
    -