Skip to main content
Glama

Server Details

Warm-intro paths and relationship intelligence for B2B sales teams. Ask Rudy who you know at any account, find the strongest path to a buyer through employees, investors, champions and partners, and draft the intro request — plus accounts, contacts and CRM data.

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

TDQS

B3.4/5.0

Scored across 74 tools

Disambiguation2/5

With 74 tools spanning accounts, contacts, tags, roles, CRM specs, intro requests, referrer requests, memory, files, workflow triggers, and searches, several clusters overlap dangerously: search_people_by_location_and_seniority vs search_people_in_companies vs search_contacts vs find_companies; add_role vs add_super_connector vs create_workspace_member vs start_super_connector_activation; get_super_connector_metadata vs get_super_connector_metadata_bulk; intro_request_get_current_state vs search_intro_request. Descriptions are long and try to disambiguate, but the sheer density of near-duplicate surfaces (deprecated variants still present) means an agent will often choose wrong.

Naming Consistency3/5

Predominantly snake_case verb_noun (create_accounts, search_contacts, add_role, get_draft_by_type), but there are clear breakouts: camelCase tools (createWorkflowTrigger, listWorkflowTriggers, listTriggerTemplates, submitEmailExtractionJob, getEmailExtractionJobStatus), bare-noun mixed with verbs (bulk_set_account_category, file_manager), and inconsistent prefixes across intro_request_*/referrer_request_* families. Readable but not a predictable pattern throughout.

Tool Count2/5

74 tools for a relationship-intelligence workspace is heavy. Several clusters are bloated with deprecated or near-duplicate tools (get_super_connector_metadata marked deprecated alongside its _bulk successor, search_people_in_companies deprecated, plus parallel intro_request_* and referrer_request_* state-machine triples). It exceeds the sensible upper bound and complicates tool selection.

Completeness4/5

Coverage of the domain is broad: account/contact CRUD and search, tagging, roles and membership lifecycle, super-connector onboarding and activation, warm-intro discovery and state machine, draft editing and send, CRM specification setup, memory, files, and workflow triggers. Gaps are minor — no account delete/update in the listed surface and drafts are get/update-only — so most workflows terminate cleanly.

Available Tools

74 tools
add_roleAdd roleAInspect

Assign one or more workspace roles to an existing user by user_id (internal keycloak UUID — never say this to the user). Existing roles are preserved — new roles are added incrementally. Valid roles: OWNER, ADMIN, SUPER_CONNECTOR, SUPER_CONNECTOR_ADMIN, REQUESTER, TECHNICAL_ADMIN. Does NOT set email, name, phone, LinkedIn, or Super Connector category. ACTIVATE A DORMANT SUPER CONNECTOR: pass role [SUPER_CONNECTOR] and super_connector_state ACTIVE for a member search_workspace_members shows as a Super Connector with super_connector_state DORMANT; this starts their automations and uses a plan seat. A Super Connector cannot be moved back to DORMANT. Do NOT use to onboard new Super Connectors — add_super_connector creates the user, assigns the Super Connector role, and places them in a category in one call. USER-FACING COPY after success: e.g. 'Requester role has been assigned to Manthan.' — never say 'add_role', 'tool call', or enum strings like REQUESTER in user messages; use 'Requester', 'Admin', 'Super Connector'.

Use when: Use ONLY after the person exists in the workspace (typically after create_workspace_member for non-SC members). Do NOT call on add-member form submit. Do NOT use for new Super Connector onboarding — use add_super_connector instead. Do NOT assign SUPER_CONNECTOR via add_role when adding a new Super Connector. After assigning, confirm in plain language only — do not explain internal steps or tool names to the user.

workspace_id / user_id are injected from request headers.

Prerequisites (check before calling this tool): [REQUIRED] user_id (keycloak_user_id) must be known — typically from create_workspace_member response or search_workspace_members. Verify: For new members: call create_workspace_member first and use keycloak_user_id from the response. Do not call add_role with only a role and no user_id. Do not call add_role instead of create_workspace_member when the add-member form was submitted with email. [optional] Do not use add_role with SUPER_CONNECTOR to onboard a new Super Connector. Verify: If the user wants to add a Super Connector, use add_super_connector on form submit instead — it handles user creation, role assignment, and category placement.

NameRequiredDescriptionDefault
roleNo
user_idNo
super_connector_stateNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Adds substantial behavior beyond the annotations: roles are additive ('Existing roles are preserved — new roles are added incrementally'), and the dormant-Super-Connector path discloses a consequential side effect ('starts their automations and uses a plan seat', irreversible back to DORMANT) plus user-facing copy constraints. Minor deduction because the irreversibility notice sits next to destructiveHint=false, which an agent could read as low-stakes; a one-line warning would sharpen that contrast.

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

Conciseness3/5

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

Front-loaded with the core action, but the Super Connector onboarding exclusion is restated three separate times (main paragraph, 'When to use', and the optional prerequisite), and the user-facing copy rule appears twice. The signal is strong but the redundancy inflates length notably.

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?

Output schema exists so return values need no explanation, and prerequisites, valid enums, and mutation semantics are all covered. Slight gap: the description says workspace_id/user_id are injected from headers while user_id is also an explicit schema parameter with default null — an agent could be unsure whether to pass user_id or rely on injection.

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 0% and the raw schema is untyped ('role' is an untyped array, no enum, no descriptions), so the description carries the full burden — and it does: it enumerates all six valid role values, explains user_id is an internal keycloak UUID, and clarifies super_connector_state=ACTIVE usage. This is exactly the compensation the low coverage requires.

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 ('Assign one or more workspace roles to an existing user by user_id') and immediately scopes what it does NOT do (profile fields, Super Connector category). It explicitly distinguishes itself from add_super_connector and create_workspace_member, so an agent can route correctly without opening sibling schemas.

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

Usage Guidelines5/5

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

Provides explicit when-to-use ('ONLY after the person exists in the workspace'), when-not-to-use ('Do NOT call on add-member form submit', 'Do NOT use for new Super Connector onboarding'), and names the correct alternative (add_super_connector). Prerequisites section adds a verification path via create_workspace_member response.

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

add_super_connectorAdd super connectorA
Idempotent
Inspect

Add a Super Connector to the workspace in one step — creates the platform user if needed, assigns the Super Connector role, and places them in the selected category (provisions category ledgers). Do NOT call create_workspace_member or add_role for this flow. For new Super Connectors: (1) call get_workspace_categories to populate a required Category dropdown (filter relationship_type SUPER_CONNECTORS), (2) render an add–Super Connector form with required fields Email, First Name, Last Name, LinkedIn ID, and Category — do NOT label any field optional, (3) on Submit call THIS tool with email, first_name, last_name, linkedin_id, and category_ids. first_name and last_name are ALWAYS required, even when promoting from an existing LinkedIn connection record — that record's name is not auto-filled server-side, so if you don't already have the person's first and last name, ask the user for them before calling; do not call this tool speculatively with required fields missing or blank. USER-FACING COPY after success: e.g. 'Jane has been added as a Super Connector.' — never expose tool or API names.

Use when: Use whenever an admin adds a new Super Connector. This is the ONLY tool for Super Connector onboarding — do NOT use create_workspace_member or add_role. Call get_workspace_categories first to load the Category dropdown. On form submit, call add_super_connector with all form values in a single call.

Behavior: idempotent

workspace_id / user_id are injected from request headers.

Prerequisites (check before calling this tool): [REQUIRED] Super Connector category options must be loaded before rendering the form. Verify: Call get_workspace_categories and filter to relationship_type SUPER_CONNECTORS. User must select at least one category before submit.

Returns category_ledger_results[] with fields: category_id ledger_id ledger_created

IMPORTANT: If the response contains more than one record, always present the options to the user and ask them to choose before taking any follow-up action. Do not act on all results automatically.

NameRequiredDescriptionDefault
emailNo
notesNo
last_nameNo
first_nameNo
linkedin_idNo
category_idsNo
super_connector_tierNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare idempotent/non-destructive/non-open-world, but the description adds substantial behavior beyond them: side effects (platform user creation, role assignment, ledger provisioning), a required prerequisite check, the ALWAYS-required name rule that is not auto-filled, and a warning not to call speculatively with blank fields.

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

Conciseness4/5

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

Front-loaded with the core effect and structured into Use when / Behavior / Prerequisites / Returns sections, which is easy to scan. It loses a point for redundancy: the 'do NOT call create_workspace_member or add_role' prohibition appears twice, and the numbered form steps restate earlier content.

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

Completeness5/5

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

An output schema exists, so return values need not be explained, and the description still summarizes category_ledger_results. Combined with annotations, prerequisite instructions, and the multiple-result handling rule, an agent has everything needed to invoke and follow up 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?

With 0% schema description coverage, the description carries the burden and does document five of seven params (email, first_name, last_name, linkedin_id, category_ids) including their required status and a warning about naming. However, notes and super_connector_tier are never mentioned, leaving two params completely uninterpretable.

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

Purpose5/5

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

Names a specific verb+resource and elaborates the compound effect: 'Add a Super Connector... creates the platform user if needed, assigns the Super Connector role, and places them in the selected category'. It explicitly distinguishes itself from create_workspace_member and add_role, so an agent can route without opening sibling schemas.

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

Usage Guidelines5/5

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

Explicit when-to-use ('Use whenever an admin adds a new Super Connector'), explicit when-not ('This is the ONLY tool... do NOT use create_workspace_member or add_role'), and an ordered pre-requisite (call get_workspace_categories first). Nothing is left to inference.

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

aggregateAggregateA
Read-only
Inspect

Group, count, and rank records across any Boomerang entity. group_by and metrics use typed enums — only supported groupings are expressed, backend maps each to the right DB column. Supports OR/AND filter composition via FilterGroups, having clauses for threshold filtering ('accounts with 3+ paths'), anti-joins for NOT EXISTS queries ('accounts with no intro request'), and cursor pagination for large result sets. COUNTING RULE: for 'number of paths' questions always use AGG_OP_COUNT_DISTINCT on REL_METRIC_RELATIONSHIP_ID — never AGG_OP_COUNT on REL_METRIC_STAR, which inflates counts when rows join-duplicate across categories or path types. GROUP-BY HYGIENE: always include the _ID group field alongside _NAME for accounts/users/contacts (e.g. both REL_GROUP_TARGET_ACCOUNT_ID and REL_GROUP_TARGET_ACCOUNT_NAME) — this surfaces name-casing duplicates ('IBM' vs 'ibm') as distinct IDs rather than silently merging or confusingly splitting them. QUALITY vs VOLUME: raw path counts include weak/unlikely connections that inflate rankings. When ranking without a strength filter, proactively note that results include low-confidence paths and offer to re-run filtered to CONFIRMED/STRONG strength for a quality-adjusted ranking.

Use when: Use for counting, ranking, grouping, breakdowns, and threshold questions. TRIGGER PHRASES: 'top N', 'most', 'how many', 'group by', 'breakdown by', 'which has the most', 'accounts with 3+', 'leaderboard', 'rank the connectors/accounts', 'best path to X', 'strongest connections to X', 'who can introduce me to X', 'who knows someone at X', 'which connector/account has the most/strongest paths to X'. KEY PATTERN — ranked-by-source filtered-to-one-target: a question like 'top 5 connectors who can reach Salesforce' reads like a lookup but is really group ENTITY_RELATIONSHIP by source user, filtered to target account — always use Aggregate for this, never page through raw relationship rows. Set limit for top-N. Use having for post-aggregation thresholds (e.g. 'accounts with 3+ paths'). For OR filters (e.g. 'ICP match OR CONFIRMED strength') pass multiple FilterGroups. Use page_token + next_page_token to paginate large result sets.

Behavior: read_only

workspace_id / user_id are injected from request headers.

Returns rows[] with fields: fields

IMPORTANT: If the response contains more than one record, always present the options to the user and ask them to choose before taking any follow-up action. Do not act on all results automatically.

NameRequiredDescriptionDefault
sortNoSort order on aggregated results. Use metric_alias to sort by a computed metric (most common for top-N), or group_field to sort alphabetically by a group key.
joinsNoOptional cross-entity joins. For ENTITY_RELATIONSHIP prefer REL_FILTER_HAS_INTRO_REQUEST instead. Use JoinClause with JOIN_TYPE_ANTI when querying ENTITY_ACCOUNT and need to exclude accounts with existing intro requests.
limitNo
entityNo
havingNoPost-aggregation filters applied after GROUP BY. AND-combined. Use for threshold questions: 'accounts with 3+ paths' → having path_count GTE 3.
metricsNoOne or more aggregation metrics per group. At least one required.
group_byNo
page_tokenNo
filter_groupsNoPre-aggregation filters applied before GROUP BY. Groups are OR-combined; filters within each group are AND-combined. For a pure AND query pass a single FilterGroup. For OR: pass multiple groups — e.g. [{strength=CONFIRMED}, {icp=MATCH}] matches rows where strength is CONFIRMED OR icp is MATCH. Omit for no filtering.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only cover read-only safety; the description adds substantial behavioral context beyond them: the COUNTING RULE (COUNT_DISTINCT vs COUNT inflation), GROUP-BY HYGIENE (ID+NAME to surface name-casing duplicates), a QUALITY vs VOLUME caveat about low-confidence paths, and a required user-confirmation step when multiple records return. These are real gotchas an agent could not infer from annotations.

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

Conciseness4/5

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

Well front-loaded with 'Group, count, and rank' and section labels ('Use when', 'Behavior'), and the high-value rules are called out in caps so they are scannable. It is dense and long, but for a 9-parameter aggregation endpoint most sentences earn their place; a few phrases overlap between the COUNTING rule and QUALITY vs VOLUME sections.

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 a complex 9-param tool with nested filter/metric objects and an output schema, the description covers the counting rule, filter composition semantics, threshold clauses, pagination, sorting intent, and a follow-up safety instruction. Since an output schema exists, it correctly does not need to enumerate return fields.

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 moderate (56%), and the description compensates by explaining the semantic use of several parameters: having for post-aggregation thresholds, multiple FilterGroups for OR, page_token + next_page_token for pagination, and limit for top-N. Some fields (entity, sort, joins, metrics) remain largely delegated to the schema, so it adds meaningful but not exhaustive parameter guidance.

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

Purpose5/5

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

States specific verbs and resource: 'Group, count, and rank records across any Boomerang entity', and repeatedly distinguishes this aggregation role from lookup/paging behavior ('never page through raw relationship rows', 'reads like a lookup but is really group ENTITY_RELATIONSHIP by source user'). An agent can tell it apart from search_warm_intro_relationships or search_accounts_with_filters without opening other schemas.

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

Usage Guidelines5/5

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

Explicit when-to-use ('counting, ranking, grouping, breakdowns, and threshold questions'), an extensive TRIGGER PHRASES list, and a concrete KEY PATTERN for the ranked-by-source-filtered-to-one-target case. It also names when-not ('always use Aggregate for this, never page through raw relationship rows') and routes sub-cases to the right parameters (having, multiple FilterGroups, page_token).

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

assign_tags_by_nameAssign tags by nameAInspect

Attach tags by name to one or more entities (accounts, contacts, workspace members). Tag names that do not exist yet are created automatically; matching is case-insensitive. Additive — tags already on an entity are kept. Single assignment = one entity id and one name.

Use when: Preferred way to tag entities. Use for both single and bulk tagging; no need to call CreateTag first.

workspace_id / user_id are injected from request headers.

Returns entities[] with fields:

entity_id tags Returns created_tags[] with fields: id name entity_type

IMPORTANT: If the response contains more than one record, always present the options to the user and ask them to choose before taking any follow-up action. Do not act on all results automatically.
NameRequiredDescriptionDefault
tag_namesNo
entity_idsNo
entity_typeNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior5/5

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

Adds substantial behavior beyond the annotations (readOnly=false, openWorld=false, idempotent=false, destructive=false): non-existent tag names are auto-created, matching is case-insensitive, and assignment is additive so existing tags are preserved. It also discloses that workspace_id/user_id are injected from headers, which the schema never shows.

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

Conciseness3/5

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

Front-loaded with the core action and behavior, which is good, but it then spends lines spelling out the return fields ('Returns entities[] with fields: entity_id, tags...') that an output schema already covers, adding redundancy rather than value.

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

Completeness4/5

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

Given the output schema exists, the description doesn't need to explain return values (though it redundantly does). For a mutation tool it adequately covers auto-creation, case-insensitivity, additive behavior, and header-injected context, leaving only the parameter format gap.

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 0%, so the description carries the full burden, yet it barely explains the three parameters. It only offers 'Single assignment = one entity id and one name' and mentions entity types informally; it never clarifies the accepted entity_type values or the array semantics of tag_names/entity_ids.

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

Purpose5/5

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

States a specific verb and resource: 'Attach tags by name to one or more entities (accounts, contacts, workspace members).' It distinguishes itself from the tagging siblings (create_tag, get_entity_tags, remove_entity_tags) by declaring itself the preferred tagging path and noting CreateTag is unnecessary.

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

Usage Guidelines4/5

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

Explicit 'Use when: Preferred way to tag entities' guidance, and it names the alternative it replaces ('no need to call CreateTag first'). It covers single vs bulk but does not state when NOT to use it (e.g., switching to remove_entity_tags for removal), so it stops short of a full when/when-not treatment.

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

bulk_add_account_categoriesBulk add account categoriesAInspect

Add one or more categories to one or more accounts, keeping the categories they already have. Valid categories: CUSTOMER, PROSPECT, OPEN_OPPORTUNITY, CLOSED_LOST, CHURNED, PARTNER, COMPETITOR, OTHER. Adding a category an account already has is a no-op for that account. Adding CUSTOMER removes PROSPECT from the account (unless PROSPECT is in the same call). Accounts are identified by internal UUID. Returns updated_count plus skipped_account_ids: an account is skipped when the id does not exist in this workspace.

Use when: Use when the user asks to also mark accounts with a category — 'Acme is a Partner too', 'tag these as Competitor as well'. Resolve account UUIDs first via search_accounts_with_filters or get_accounts_by_ids; never guess them.

workspace_id / user_id are injected from request headers.

NameRequiredDescriptionDefault
categoriesNo
account_idsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing side effects annotations cannot express: adding CUSTOMER removes PROSPECT unless PROSPECT is in the same call, re-adding an existing category is a no-op, and accounts with unknown UUIDs are skipped and surfaced in skipped_account_ids. Return shape and skip conditions are stated outright.

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?

Front-loads the core behavior, then rules, then return contract, then a separate 'Use when' block. Dense but every sentence carries distinct information — no restatement of the name or filler.

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

Completeness5/5

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

For a two-parameter bulk mutation with an output schema, the description still covers inputs, side effects, skip semantics, and call prerequisites. Nothing material to invoking it correctly is left to inference.

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 description coverage is 0% and neither parameter has a description, so the description must compensate entirely — and it does: it enumerates the legal category values and states that account_ids are internal UUIDs. It also explains that workspace_id/user_id come from request headers, which clarifies why only two params exist.

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 ('Add one or more categories to one or more accounts') plus the key distinguishing modifier 'keeping the categories they already have', which separates it from bulk_set_account_category and bulk_remove_account_categories. The valid category vocabulary is spelled out, so the resource is fully concrete.

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

Usage Guidelines5/5

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

Explicit 'Use when' section with natural-language triggers ('Acme is a Partner too', 'tag these as Competitor as well') and an explicit prerequisite workflow: resolve account UUIDs first via search_accounts_with_filters or get_accounts_by_ids, never guess them. The additive-vs-replace distinction from the bulk_set sibling is implied by the first sentence.

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

bulk_remove_account_categoriesBulk remove account categoriesA
Destructive
Inspect

Remove one or more categories from one or more accounts, keeping their other categories. Removing every category leaves the account uncategorised. Accounts are identified by internal UUID. Returns updated_count plus skipped_account_ids: an account is skipped when the id does not exist in this workspace.

Use when: Use when the user asks to take a category off accounts — 'Acme is no longer a Customer', 'remove Competitor from these'. Resolve account UUIDs first via search_accounts_with_filters or get_accounts_by_ids; never guess them.

Behavior: destructive

workspace_id / user_id are injected from request headers.

NameRequiredDescriptionDefault
categoriesNo
account_idsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true, but the description adds genuinely new behavior: the updated_count/skipped_account_ids return contract, the precise skip rule (id not in workspace), the uncategorised edge case when all categories are removed, and the header-injected workspace_id/user_id. This is exactly the context an agent needs beyond the annotation.

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

Conciseness4/5

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

Front-loaded with the core action, then cleanly sectioned into 'Use when' and 'Behavior'. Every sentence carries information, though the standalone 'Behavior: destructive' line merely restates the destructiveHint annotation.

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?

Output schema exists so return values needn't be explained, yet the description helpfully names updated_count and skipped_account_ids. Coverage is strong for a destructive mutation; the only real gap is the identifier type for the categories parameter and the effective requirement that both arrays be supplied.

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 0% and both parameters are bare untyped anyOf arrays with null defaults and no required fields, so the description has to carry the load. It clarifies that account_ids are internal UUIDs, but never states whether categories are names or IDs, nor that both arrays are effectively required despite the schema showing no required parameters.

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

Purpose5/5

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

States a specific verb and resource ('Remove one or more categories from one or more accounts') plus the crucial scope nuance that other categories are preserved and accounts are identified by internal UUID. This clearly separates it from bulk_add_account_categories and bulk_set_account_category.

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

Usage Guidelines5/5

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

Has an explicit 'Use when' clause with two concrete user utterance examples ('Acme is no longer a Customer', 'remove Competitor from these'), plus a directive to resolve UUIDs first via search_accounts_with_filters or get_accounts_by_ids and 'never guess them'. Both the trigger condition and the prerequisite are stated.

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

bulk_set_account_categoryBulk set account categoryA
Destructive
Inspect

Replace the categories on one or more accounts. Valid categories: CUSTOMER, PROSPECT, OPEN_OPPORTUNITY, CLOSED_LOST, CHURNED, PARTNER, COMPETITOR, OTHER. An account can carry several; this call removes every category not listed, so each account ends up with exactly the given ones. Pass the full set in categories; category is the older single-value form, used only when categories is empty. To clear an account's categories use BulkRemoveAccountCategories. Accounts are identified by internal UUID, not name or CRM id. Returns updated_count plus skipped_account_ids: an account is skipped when the id does not exist in this workspace, so a non-empty skipped list means those ids were wrong, not that the write failed. To attach tags use the Tagging service instead.

Use when: Use when the user asks to re-classify accounts outright — 'move Acme to Prospect', 'these are only Partners'. To add a category while keeping the existing ones ('also mark Acme as a Partner') use BulkAddAccountCategories; to drop one use BulkRemoveAccountCategories. Resolve account UUIDs first via search_accounts_with_filters or get_accounts_by_ids; never guess them. This writes to the workspace and is visible to every user in it, so confirm the account list with the user before calling when the selection came from an ambiguous search.

Behavior: destructive

workspace_id / user_id are injected from request headers.

NameRequiredDescriptionDefault
categoryNo
categoriesNo
account_idsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

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

Goes well beyond the destructive annotation by explaining that this is a replacement operation that removes every category not listed, describes the legacy single-value fallback behavior, and clarifies that skipped_account_ids indicate bad ids rather than write failure. It also notes workspace visibility and that the write is visible to every user, which is valuable behavioral context for a destructive tool.

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

Conciseness5/5

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

Despite being detailed, the description is front-loaded with the core replacement semantics and structured into behavior, alternatives, prerequisites, and confirmation guidance. Every sentence contributes useful information for a destructive bulk operation.

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?

Complete for a complex destructive tool: it explains replacement semantics, valid categories, parameter fallback behavior, UUID resolution, skipped-id meaning, workspace visibility, and sibling alternatives. The output schema exists, and the description still helpfully clarifies updated_count and skipped_account_ids.

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 description coverage is 0%, the description fully compensates: it explains that categories is the full set, category is the older single-value form used only when categories is empty, and accounts are identified by internal UUID rather than name or CRM id. This gives clear semantics for all three parameters.

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

Purpose5/5

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

States a specific verb (replace) and resource (account categories) and precisely describes the resulting state: each account ends up with exactly the listed categories. It also distinguishes itself from the add/remove category siblings, so an agent can select it without opening another schema.

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

Usage Guidelines5/5

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

Gives explicit when-to-use guidance with examples ('move Acme to Prospect'), names the sibling alternatives for adding or removing categories, and instructs how to resolve account UUIDs first. It also adds a confirmation safeguard for ambiguous searches, which is highly actionable.

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

create_accountsCreate accountsA
Destructive
Inspect

Create one or more accounts in bulk. Each account carries its own optional category and category_source — a batch can mix a CSV upload row (LEDGER_IMPORT), a publicly-researched company (PUBLIC_RESEARCH), and a manually-entered one (MANUAL) in the same call. Accounts are deduplicated against existing ones by CRM reference id, LinkedIn company id, then LinkedIn handle — a match returns the existing account rather than creating a duplicate. Leaving category unset defaults the account to Prospect with source DEFAULT. Returns one entry per resulting account (created or matched), in no particular correspondence to input order — a batch of 10 inputs can return fewer than 10 rows when some dedup to the same existing account.

Use when: Use when the user wants to add accounts in bulk, e.g. from a CSV or a list of company names. Setting category requires setting category_source alongside it.

Behavior: destructive

workspace_id / user_id are injected from request headers.

Returns accounts[] with fields: id name reference_id category categories

IMPORTANT: If the response contains more than one record, always present the options to the user and ask them to choose before taking any follow-up action. Do not act on all results automatically.

NameRequiredDescriptionDefault
accountsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior5/5

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

Goes well past the annotations: discloses the dedup precedence chain (CRM reference id, then LinkedIn company id, then LinkedIn handle), that a match returns the existing account instead of erroring, that category defaults to Prospect/DEFAULT, and that output rows may not correspond to input order and may be fewer than inputs. Also states header-injected workspace_id/user_id and adds an explicit multi-result handling instruction.

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

Conciseness4/5

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

Well front-loaded with scannable 'Use when' / 'Behavior' / 'Returns' sections and no filler prose. The inline return-field list is partly redundant given an output schema exists, and the trailing IMPORTANT paragraph is long, but each block carries distinct 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 bulk mutation with no required params, the description covers the hard parts: dedup resolution, partial-result rows, ordering guarantee, and default fan-out. What's missing is failure behavior for invalid rows or partial-batch failures, which matters for a destructive, non-idempotent bulk write.

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 0% and the single parameter is an array of objects with ~11 nested fields, so the description must compensate. It explains category/category_source semantics, the DEFAULT-to-Prospect fallback, and hints at the role of reference_id/linkedin_url via the dedup rules, but leaves name, website, city, state, country, and linkedin_url format completely undocumented.

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

Purpose4/5

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

States a specific verb and resource with scope: 'Create one or more accounts in bulk', then pins down the batch semantics (mixed category_source per row). An agent can tell this is the bulk-creation path rather than a category-mutation path, though it never names a sibling explicitly to close the loop.

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

Usage Guidelines4/5

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

Explicit 'Use when' clause with concrete triggers (CSV upload, list of company names), plus one hard constraint: 'Setting category requires setting category_source alongside it.' No when-not guidance or pointer to search_accounts_with_filters for accounts that already exist, so it falls short of a 5.

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

create_crm_field_mappingCreate crm field mappingAInspect

Map a Boomerang canonical field to the connected CRM's own field/property name, for a given CRM object type.

Use when: Use after create_crm_specification, when a prepared statement's SELECT/properties needs to reference a CRM-native field name that differs from Boomerang's canonical name (e.g. Salesforce's "Type" vs HubSpot's own property key).

workspace_id / user_id are injected from request headers.

NameRequiredDescriptionDefault
data_typeNo
object_nameNo
external_field_nameNo
canonical_field_nameNo
crm_specification_idNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

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

Annotations declare a non-readOnly, non-idempotent, non-destructive write, and the description notes header-injected workspace_id/user_id. It does not explain whether re-mapping an existing field overwrites it, how conflicts are resolved, or what the response contains. With annotations covering the mutation profile, this is adequate 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.

Conciseness4/5

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

Tightly front-loaded: one sentence of purpose, one 'Use when' sentence with an example, one note on injected params. No waste, though the injected-header note is terse.

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?

Output schema exists so return values needn't be explained, and annotations cover the write profile. But with 0% schema description coverage on five parameters, the description leaves key inputs (data_type, crm_specification_id, requiredness) undefined, which is thin for a creation tool.

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 0%, so the description must compensate, but it only mentions canonical vs external field names and object type. It does not explain data_type, crm_specification_id, or that all 5 params default to null and are effectively required in practice — a significant gap for a 0% coverage schema.

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

Purpose5/5

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

States a specific verb+resource and scope: mapping a Boomerang canonical field to the connected CRM's field name for a given object type. This is clearly distinguishable from sibling create_crm_prepared_statement and create_crm_specification.

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

Usage Guidelines5/5

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

Explicit 'Use when' section names the prerequisite (after create_crm_specification) and the exact trigger condition (when a prepared statement's SELECT needs to reference a CRM-native field name that differs from the canonical name), with a concrete example.

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

create_crm_prepared_statementCreate crm prepared statementAInspect

Define a named CRM query/mutation (statement_key) for a registered CRM specification, in the connection's native format (SOQL, REST_JSON, etc). The chosen statement_key enforces a hardcoded required variable server-side — see the StatementKey enum docs.

Use when: Use after create_crm_specification to define how to run a specific check (e.g. GET_CUSTOMER_ACCOUNTS_BY_IDS) against the connected CRM. Include every variable the chosen statement_key requires in variables; if the call fails with FAILED_PRECONDITION naming a missing variable, add it and retry.

workspace_id / user_id are injected from request headers.

Returns variables[] with fields: name: Variable name as referenced in statement_text (e.g. "domain"). data_type required default_value description

IMPORTANT: If the response contains more than one record, always present the options to the user and ask them to choose before taking any follow-up action. Do not act on all results automatically.

NameRequiredDescriptionDefault
variablesNoList of variable definitions this statement references, e.g. [{"name": "domain", "data_type": "STRING", "required": true}]. Must include every variable a given statement_key hardcodes as required (see StatementKey enum_doc).
descriptionNo
object_nameNo
statement_keyNo
statement_textNo
statement_formatNo
crm_specification_idNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

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

Beyond the annotations (readOnly=false, destructive=false, idempotent=false, openWorld=false), it discloses real behavior: the statement_key enforces a hardcoded required variable server-side, missing-variable failures surface as FAILED_PRECONDITION and should be retried, and workspace_id/user_id are injected from request headers. It also adds the multi-record handling rule requiring the user to choose.

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

Conciseness4/5

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

Front-loads purpose, then usage, then failure handling, which is a sensible order. The 'Returns variables[] with fields' block largely duplicates the input schema and the existing output schema, making it the one section that does not fully earn 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 7-parameter create with an output schema present, it covers sequencing, header injection, the required-variable contract, retry on failure, and multi-result handling. The main gap is the undocumented object_name/description/crm_specification_id parameters.

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 only 14% across 7 parameters, so the description must compensate. It documents the variables[] item shape (name, data_type, required, default_value, description), statement_key, statement_text, and statement_format, but leaves object_name, description, and crm_specification_id semantics unexplained. Partial compensation only.

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 (Define) and resource (a named CRM query/mutation keyed by statement_key) for a registered CRM specification, and names the native formats (SOQL, REST_JSON). It also distinguishes itself from the sibling create_crm_specification by positioning this as the follow-up that defines how a specific check runs.

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

Usage Guidelines4/5

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

Explicitly says to use it after create_crm_specification and gives a concrete example (GET_CUSTOMER_ACCOUNTS_BY_IDS). It also documents the retry path when FAILED_PRECONDITION names a missing variable. It stops short of naming when NOT to use it or an alternative tool.

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

create_crm_specificationCreate crm specificationAInspect

Register a CRM connection (Salesforce/HubSpot) for a workspace. Returns a CrmSpecificationResponse whose id is required by create_crm_prepared_statement and create_crm_field_mapping.

Use when: Use once per CRM connection, before defining any prepared statements or field mappings for it. connected_user_id is the Boomerang user who owns the integration, not a CRM record id.

workspace_id / user_id are injected from request headers.

NameRequiredDescriptionDefault
connected_user_idNo
connection_sourceNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false and idempotentHint=false; the description reinforces this by saying to register 'once per CRM connection' and that it returns an id consumed downstream. It also clarifies the ownership semantics of connected_user_id and that workspace_id/user_id come from headers. Good added context, though it doesn't state auth requirements or failure 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?

Purpose and its downstream id dependency are front-loaded, followed by a clearly delimited 'Use when' block. Efficient and scannable; the header-injection note is slightly tangential but still 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?

An output schema exists, so return values needn't be explained, and the description still notes the id it returns. Ordering/usage and one parameter are covered; the missing piece is the meaning of connection_source, keeping it just short of 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 0%, so the description must compensate. It usefully disambiguates connected_user_id ('the Boomerang user who owns the integration, not a CRM record id') and clarifies that workspace_id/user_id are header-injected (not schema params), but connection_source is never explained. Partial compensation for two undocumented parameters.

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

Purpose5/5

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

States a specific verb+resource ('Register a CRM connection (Salesforce/HubSpot) for a workspace') and names the exact sibling tools that depend on its returned id (create_crm_prepared_statement, create_crm_field_mapping), distinguishing it from get_crm_specification and the other CRM 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?

The 'Use when' block is explicit: once per CRM connection, and before defining any prepared statements or field mappings for it. It gives both the frequency constraint and the ordering dependency, leaving nothing to inference.

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

create_self_declared_relationshipCreate self declared relationshipAInspect

Create one or more self-declared relationship paths. A super connector manually asserts they know a target account or contact, which is stored as a SELF_DECLARED_ACCOUNT or SELF_DECLARED_CONTACT path and used to surface warm intro opportunities.

Use when: Use when a team member (super connector) wants to declare that they personally know a contact or have a relationship with an account, and this relationship was not automatically detected via calendar or LinkedIn signals.

workspace_id / user_id are injected from request headers.

Returns items[] with fields:

relationship_path validation_errors success Also returns pagination info (type, message, status).

IMPORTANT: If the response contains more than one record, always present the options to the user and ask them to choose before taking any follow-up action. Do not act on all results automatically.
NameRequiredDescriptionDefault
itemsNoOne or more self-declared relationships to create in a single call.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

Annotations declare readOnly=false, destructive=false, idempotent=false, openWorld=false, so the write/safety profile is already covered. The description adds real value beyond that: workspace_id/user_id are injected from headers, and the IMPORTANT block instructs the agent to present multiple records as options and not auto-act. It does not warn about duplicate creation despite idempotentHint=false.

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

Conciseness4/5

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

Front-loaded with purpose, then usage, then delivery guidance in a logical order; the multi-result caution is correctly placed last. The middle "Returns items[] with fields" block is redundant with the existing output schema and its formatting is noisy, which keeps it from a 5.

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

Completeness4/5

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

With an output schema present and annotations covering safety, the description only needs to fill contextual gaps — and it does: header-injected identifiers, the semantics of the created path, and the human-in-the-loop rule for multi-record responses. The one missing piece is any note on duplicate/dedup behavior given idempotentHint=false.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3 and the schema already documents each nested field including the relationship_type-conditional requirements for target_account_id/target_contact_id. The description only adds that workspace_id/user_id come from headers, which is context not tied to a declared 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?

States a specific verb+resource (create self-declared relationship paths) and immediately names the two concrete artifact types produced (SELF_DECLARED_ACCOUNT / SELF_DECLARED_CONTACT) and their downstream use (surfacing warm intros). This lets an agent distinguish it from siblings like search_warm_intro_relationships or add_super_connector without opening the schema.

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

Usage Guidelines4/5

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

An explicit "Use when:" block scopes the tool to a super connector asserting a personal relationship, and crucially names the exclusion condition — relationships not auto-detected via calendar or LinkedIn. It stops short of naming a concrete alternative tool to reach for instead, so it is clear but not fully routing-aware.

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

create_tagCreate tagAInspect

Create a workspace tag for an entity type. Names are unique per entity type, case-insensitively.

Use when: Use when the user asks for a label that does not exist yet and you are not attaching it to anything. To create and attach in one step, prefer AssignTagsByName.

workspace_id / user_id are injected from request headers.

Also returns pagination info (id, name, entity_type).

NameRequiredDescriptionDefault
nameNo
entity_typeNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly=false, destructive=false, idempotent=false and openWorld=false, so safety is covered. The description adds genuinely new behavioral context: the case-insensitive uniqueness constraint per entity type and the fact that workspace_id/user_id come from request headers rather than arguments.

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

Conciseness4/5

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

Front-loaded with purpose, then usage, then mechanics. The closing sentence about 'pagination info' is extraneous and awkward for a create operation, costing it a point.

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?

A mutation tool with annotations and an output schema, so safety and return shape are largely covered elsewhere. The description handles the routing question and header-injection mechanics well; only entity_type semantics remain thin, which is a minor gap.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must compensate. It explains name uniqueness and that workspace/user identity is header-injected, but says nothing about accepted entity_type values or name format constraints, leaving half the parameters under-specified.

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

Purpose5/5

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

States a specific verb and resource ('Create a workspace tag for an entity type') plus a scoping rule (unique per entity type, case-insensitively) that separates it from the sibling assign_tags_by_name. An agent can identify the tool's job without opening any schema.

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

Usage Guidelines5/5

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

Contains an explicit 'Use when' clause with a negative condition ('you are not attaching it to anything') and names the preferred alternative (AssignTagsByName) for the other case. Routing is unambiguous.

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

createWorkflowTriggerCreate workflow triggerAInspect

Create a workflow trigger for a recipient. Two kinds: (1) SCHEDULED — Temporal cron or one_time_fire_at in absolute UTC (default); (2) WEBHOOK — Composio inbound CRM event, no cron. Always set name, ≤100-char description (never copy the prompt), prompt, channels, scope (USER|WORKSPACE), and draft metadata.preview per channel. For WORKSPACE also set activation_mode: WORKSPACE_MANDATORY (runs for everyone in the audience; no per-user opt-in) or WORKSPACE_OPT_IN (shared template teammates enable individually). For WEBHOOK also set trigger_kind=WEBHOOK and metadata.supported_events (or pass template_id from an admin WEBHOOK trigger_template so the backend inherits kind + supported_events). For SCHEDULED provide exactly one of cron or one_time_fire_at. When creating from an admin template seed, copy template_id, trigger_kind, and metadata.supported_events verbatim from the seed JSON — never invent event slugs.

Use when: Use for a new reminder/schedule OR a new event-driven HubSpot/Salesforce notification, OR to opt-in/activate an existing WORKSPACE_OPT_IN catalog template for the requesting user (pass catalog_id from create/list — that creates a USER activation; do not use updateWorkflowTrigger for first-time opt-in). Ask scope=USER vs WORKSPACE before free-form creates. If WORKSPACE, ask whether it must run for everyone with no opt-in (activation_mode=WORKSPACE_MANDATORY, workspace admin) or be a template teammates enable (WORKSPACE_OPT_IN). If the conversation seed includes a workflow_trigger_template_context JSON block, this is a template create: pass template_id + trigger_kind + metadata from that block, put template instructions into prompt (customize with the user), omit cron for WEBHOOK, and do not invent supported_events. If there is no seed but the user wants an admin template, call listTriggerTemplates first and copy id → template_id. Call list_workflow_triggers first to avoid duplicates. Always draft metadata.preview for the channel(s) in use.

workspace_id / user_id are injected from request headers.

NameRequiredDescriptionDefault
cronNo
nameNo
planNo
scopeNo
promptNo
channelsNo
metadataNo
catalog_idNo
descriptionNo
template_idNo
trigger_kindNo
audience_typeNo
activation_modeNo
agent_thread_idNo
audience_filterNo
channel_metadataNo
one_time_fire_atNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already signal a non-idempotent, non-destructive write, but the description adds substantial behavioral context beyond them: the WORKSPACE_MANDATORY vs WORKSPACE_OPT_IN activation semantics (runs for everyone, no per-user opt-in), the requirement to copy template_id/trigger_kind/metadata verbatim and never invent event slugs, and the note that workspace_id/user_id are injected from request headers.

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 purpose and the two kinds are front-loaded, and the 'Use when:' block is clearly delimited. It is long and occasionally repetitive ('draft metadata.preview' appears twice, template instructions are restated), but for a 17-param tool with two modes and several creation flows most sentences carry necessary conditional logic.

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

Completeness5/5

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

Given the tool's complexity (17 params, two trigger kinds, template inheritance and opt-in flows), the description is complete: an output schema exists so return values needn't be covered, and the mutation/safety profile is already carried by annotations. Nothing an agent needs to invoke it correctly across the enumerated paths is missing.

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

Parameters4/5

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

Schema description coverage is 0%, so the description carries the full burden across 17 params. It explains the meaning of most of them (cron vs one_time_fire_at mutual exclusivity, scope USER|WORKSPACE, activation_mode values, trigger_kind, template_id, catalog_id creating a USER activation, metadata.preview/supported_events, description length cap and 'never copy the prompt'). A few params (plan, audience_type, audience_filter, agent_thread_id, channel_metadata) go unmentioned, hence not a 5.

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

Purpose5/5

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

Opens with a specific verb+resource ('Create a workflow trigger for a recipient') and immediately partitions the tool into its two operating kinds (SCHEDULED vs WEBHOOK), which lets an agent distinguish it from updateWorkflowTrigger and the list tools. The scope is precise enough that no schema inspection is needed to know what the tool produces.

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

Usage Guidelines5/5

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

Has an explicit 'Use when:' block covering three concrete scenarios (new reminder/schedule, event-driven notification, opt-in activation of a WORKSPACE_OPT_IN template). Names alternatives and their boundaries: it says to call listTriggerTemplates first, list_workflow_triggers first to avoid duplicates, and explicitly warns 'do not use updateWorkflowTrigger for first-time opt-in'.

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

create_workspace_memberCreate workspace memberA
Idempotent
Inspect

Add or update a non–Super Connector workspace member. Email is required — this tool upserts by email. Do NOT use for new Super Connectors — use add_super_connector instead (it creates the user, assigns the Super Connector role, and places them in a category in one step). For new members (Requester, Admin, etc.): present an interactive add-member form UI with required fields Email, First Name, Last Name, plus optional Phone and LinkedIn URL. Never block submit on the optional fields. The form has NO role field — roles are assigned separately via add_role after this call succeeds. On form Submit: call THIS tool with all submitted identity fields. NEVER call add_role on form submit. Do not ask for identity fields in plain chat when a form is shown. For updates: if email was not provided, ask the user to supply it. If they do not know the email, collect other identifiers, call search_workspace_members to find matches, present the best match with name and email, and ask 'Is this the person you want to update?' — only call this tool after the target member is confirmed and email is known. Creates the platform User if needed, then creates or updates the workspace membership. Returns keycloak_user_id (internal — never say this to the user). Does NOT assign workspace roles. USER-FACING COPY after success: e.g. 'I've added Manthan to the workspace.' If a role was discussed earlier: 'Would you like me to assign the Requester role?' — never say 'create_workspace_member', 'membership created', 'no role assigned', or explain which tool ran.

Use when: Use to add or update workspace members who are NOT Super Connectors. If the user wants to add a Super Connector, use add_super_connector instead — do NOT call create_workspace_member or add_role for that flow. ADD flow (non-SC): (1) render add-member form → (2) user submits → (3) call create_workspace_member with all identity fields — NOT add_role. (4) If a role was discussed (e.g. Requester, Admin), call add_role after success using keycloak_user_id from the response. UPDATE flow without email: search via search_workspace_members, confirm identity, then call with resolved email.

Behavior: idempotent

workspace_id / user_id are injected from request headers.

Prerequisites (check before calling this tool): [REQUIRED] Email must be known and the target member confirmed before calling. Verify: If email was not provided, ask the user for it. If unavailable, collect name, LinkedIn URL, and/or phone, call search_workspace_members, show the top match(es) with name and email, and get explicit user confirmation ('Is this the person you want to update?') before proceeding. For new members, render the add-member form UI and wait for submit — do not call with guessed values.

Next steps (after this tool succeeds): [optional] [SUGGESTION] → call add_role: Tell the user they were added successfully (use their name). If a non–Super Connector role was discussed earlier, assign it via add_role (plain language confirmation only). Never mention tool names, API calls, membership records, or internal IDs.

Also returns pagination info (created_at, updated_at, created_by, updated_by, deleted_at, deleted_by).

NameRequiredDescriptionDefault
emailNo
phoneNo
last_nameNo
first_nameNo
linkedin_idNo
member_profileNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations: discloses upsert-by-email semantics, that it creates the platform User if needed, that it does NOT assign roles, that it returns an internal keycloak_user_id (and warns never to expose it), and confirms idempotency. Annotations only cover the safety profile; the description adds the operation's real behavior.

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

Conciseness3/5

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

Purpose and constraints are front-loaded, but the text is heavily bloated with duplicated directives (the Super Connector exclusion and the 'never call add_role on form submit' rule each appear multiple times) and with extensive user-facing copy scripting that crowds out the operational essentials.

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 multi-step tool with an output schema present, the description covers prerequisites, the confirm-before-call requirement, and post-success next steps. Minor noise such as 'returns pagination info' on a single-member create is odd but does not block 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 0% and the schema types are unusual (first_name/last_name as objects, no required fields), so the description carries the burden and does so for most parameters — email as the required upsert key, and First/Last Name, Phone, LinkedIn URL as identity fields. It omits member_profile and conflicts slightly with the schema by calling fields 'required' when none are, but overall it adds substantial meaning.

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

Purpose5/5

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

States a specific verb+resource ('Add or update a ... workspace member') and immediately differentiates itself from siblings by scope ('non–Super Connector', upserts by email). An agent can distinguish it from add_super_connector, add_role, and update_workspace_member 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 Guidelines5/5

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

Gives explicit when-to-use and when-NOT-to-use conditions (Super Connectors → add_super_connector), plus concrete step-by-step ADD and UPDATE flows with the alternative search_workspace_members named for the no-email case. Nothing is left to inference.

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

delete_scoped_memoryDelete scoped memoryA
Destructive
Inspect

Delete the single MEMORY document for a USER or WORKSPACE scope. Soft-deletes the row (audit history preserved). Idempotent — a missing row returns deleted=false.

Use when: Use when the user explicitly asks to clear their scoped memory. Prefer UpsertScopedMemory to update, not delete-then-recreate.

Behavior: destructive

workspace_id / user_id are injected from request headers.

NameRequiredDescriptionDefault
scopeNo
scope_idNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior1/5

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

The description asserts 'Idempotent — a missing row returns deleted=false,' but the annotations declare idempotentHint: false. That is a direct contradiction on a named behavioral hint and will give the agent conflicting signals about safe retry behavior. (The other content — soft-delete with audit history preserved, header-injected identifiers — is genuinely useful, but the contradiction dominates.)

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

Conciseness4/5

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

Front-loaded with the action and scope, then organized under 'Use when' and 'Behavior' labels. Slightly fragmented into stubs, but every line carries information and nothing is wasted.

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

Completeness4/5

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

With an output schema present, return details need not be explained, and the destructive nature is covered by both annotations and the 'Behavior: destructive' line. The description adds soft-delete/audit context and the header-injection note, leaving only the meaning of scope/scope_id under-specified.

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 0% and neither of the two parameters (scope, scope_id) is documented in the schema; there are no enums to infer from. The description only gestures at the concept ('USER or WORKSPACE scope') and mentions that workspace_id/user_id are injected from headers, but never states the accepted scope values or what scope_id refers to, so it does not compensate for the coverage 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?

States a specific verb and resource with its exact scope: 'Delete the single MEMORY document for a USER or WORKSPACE scope.' It names the sibling it is not (UpsertScopedMemory) and is immediately distinguishable from get_scoped_memory and upsert_scoped_memory.

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

Usage Guidelines5/5

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

Gives an explicit trigger ('Use when the user explicitly asks to clear their scoped memory') plus an exclusion and alternative ('Prefer UpsertScopedMemory to update, not delete-then-recreate'). Both when-to-use and when-not-to-use are covered.

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

describe_schemaDescribe schemaA
Read-only
Inspect

Return live enum values for every FilterableField, GroupByField, and MetricField per entity — generated from real workspace data, not hand-maintained lists. Use to discover which strength values, path_types, or categories exist before filtering on them.

Use when: Call when unsure which enum values are valid for a field in the current workspace (e.g. which relationship categories exist, which path_types are populated). Response is workspace-specific.

Behavior: read_only

workspace_id / user_id are injected from request headers.

Returns entities[] with fields: entity filterable_fields: All FilterableField values valid for this entity, with enum values and supported ops. supported_group_by: All GroupByField values valid for this entity. supported_metrics: All MetricField values valid for this entity. supported_columns: All ResponseColumn values valid for this entity.

IMPORTANT: If the response contains more than one record, always present the options to the user and ask them to choose before taking any follow-up action. Do not act on all results automatically.

NameRequiredDescriptionDefault
entitiesNo
include_population_statsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful behavior: that the response is workspace-specific, that workspace_id/user_id are injected from headers (no auth params needed), and the multi-record handling rule to present options to the user before acting.

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

Conciseness4/5

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

It is well-structured with labeled 'Use when', 'Behavior', and 'Returns' sections and front-loads the core purpose. There is some redundancy in restating the live/not-hand-maintained point, but overall it is appropriately sized and each section carries meaning.

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

Completeness4/5

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

With an output schema present, the return-value detail is partly redundant, but annotations cover the safety profile and the description covers when-to-use and header injection. The notable gap is the absence of any input-parameter explanation, which matters given the tool has two optional params.

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 0% and neither of the two input parameters (entities, include_population_stats) is explained anywhere in the description. The description instead documents the output shape, leaving the input parameters undocumented and forcing the agent to infer their meaning.

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

Purpose4/5

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

The opening sentence states a specific verb and resource: returns live enum values for FilterableField, GroupByField, and MetricField per entity, generated from real workspace data. It is clear and self-contained, but it does not explicitly distinguish itself from the similar sibling get_unique_filter_options, so sibling differentiation is only implied.

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 'Use when' section gives a clear trigger: call when unsure which enum values are valid for a field in the current workspace. It states context well but names no alternative tools (e.g. get_unique_filter_options) or when-not-to-use conditions.

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

evaluate_work_overlap_contactsEvaluate work overlap contactsA
Destructive
Inspect

For a list of target accounts, find the current buying committee at each account that a super connector can warmly reach (they overlapped in tenure at that account), then create the contacts and WORK_OVERLAP relationship paths. Returns each contact with the connecting super connector, title, tenure overlap, and — when relevance ran — an assistant relevance verdict. This WRITES data: it creates contacts and relationship paths. Only accounts that carry a super-connector relationship and whose workspace has a buying_committee_regex produce results.

Use when: Use when a rep or admin wants to surface (and materialize) the warm buying committee for specific target accounts on demand, rather than waiting for the background automation. Pass the target account ids. Leave run_relevance false unless the caller explicitly wants the slower LLM relevance filter for very large companies.

Behavior: destructive

workspace_id / user_id are injected from request headers.

Returns contacts[] with fields: account_id account_linkedin_id account_name super_connector_keycloak_user_id super_connector_linkedin_id contact_id contact_linkedin_id contact_first_name contact_last_name contact_title connecting_company_size overlap_months relevance_evaluated relevance_decision_yes relevance_score path_created

IMPORTANT: If the response contains more than one record, always present the options to the user and ask them to choose before taking any follow-up action. Do not act on all results automatically.

NameRequiredDescriptionDefault
account_idsNo
run_relevanceNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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

Annotations declare destructiveHint=true and the description corroborates and enriches it: it states exactly what is written (contacts and relationship paths), the precondition for any result (account must carry a super-connector relationship and the workspace must have buying_committee_regex), how workspace_id/user_id are supplied, and the cost profile of the relevance LLM. It also discloses the multi-record handling expectation, well beyond what the annotations convey.

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

Conciseness3/5

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

Purpose and when-to-use are front-loaded, which is good, but the description then re-lists 15 return fields verbatim even though an output schema exists, and restates 'Behavior: destructive' that the annotations already declare. Roughly a third of the text is redundant with structured fields.

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 destructive, side-effecting tool with two loose parameters, the description covers preconditions, side effects, parameter intent, and result handling, and the output schema covers return shape. The only shortfall is that the duplicated return-field list is the kind of detail the schema should own, leaving less room for missing detail such as what happens on partial failure.

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 0%, so the description must carry parameter meaning, and it does: 'Pass the target account ids' for account_ids and an explicit cost-based rule for run_relevance. It stops short of clarifying the expected id format (internal ids vs linkedin ids) or that account_ids may be null/empty.

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 concrete verb chain (find the buying committee a super connector can warm-reach, then create contacts and WORK_OVERLAP relationship paths) and a specific input set (target accounts). It is clearly distinguishable from read-only siblings like search_warm_intro_relationships because it states it materializes data.

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 'Use when' block explicitly covers the on-demand-vs-background-automation tradeoff and gives a clear default for run_relevance ('leave false unless the caller explicitly wants the slower LLM filter'). It does not name the read-only alternative (search_warm_intro_relationships) for agents who only want to inspect without writing, which is the one missing routing cue.

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

file_managerFile managerCInspect

Upload and manage files. Drop files here to send them to the server.

NameRequiredDescriptionDefault

No parameters

TDQS

C2.8/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false and openWorldHint=false, so the safety profile is largely covered structurally. The description adds no behavioral context beyond a UI drag-and-drop hint: it says nothing about what happens on upload, whether files are persisted, size limits, or auth requirements. Minimal value added.

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 sentences, no filler, front-loaded with the action. It is efficient, though the second sentence is targeted at a human dragging files in an interface rather than at an agent, so it does not fully earn 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?

With zero parameters and no output schema, the description carries the whole burden of explaining how a call should be made, and it does not. It never says how files are conveyed to the tool or what the result is, leaving an agent with no actionable model of 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?

The tool takes zero parameters, so per the baseline this scores 4. There is nothing for the description to document or to compensate for, and the schema is explicitly closed with additionalProperties=false.

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?

It names verbs (upload, manage) and a resource (files), so the purpose is broadly identifiable. But 'manage' is a catch-all that does not distinguish this tool from siblings like list_files and read_file, and the second sentence is a UI affordance rather than a scope statement. Vague-but-present, which lands at 3.

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 and no routing away from the obvious alternatives (list_files, read_file). 'Drop files here to send them to the server' describes a widget interaction, not an agent decision rule. An agent cannot tell from this text when this tool is the right choice.

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

find_companiesFind companiesA
Read-onlyIdempotent
Inspect

Find candidate companies by name, region(s), industry list, and/or employee-count band. Returns ranked CompanyCandidate entries (social_id, name, industry, company_size, employees_num, country_code, match_score) plus total_matched and truncated. Use the returned social_id as company_social_ids input to search_people_by_location_and_seniority.

Use when: Use BEFORE any company-anchored people search, including when the user named a company by name rather than by LinkedIn id — resolving a name here (rather than passing company_name straight to the people-search tool) avoids an ambiguous-match rejection. Also use directly for 'find companies like X' or 'companies in Ohio, industrials, 200-1000 employees' style requests that are themselves the goal (e.g. before an ICP sweep).

Behavior: read_only, idempotent

Returns candidates[] with fields: social_id name industry company_size employees_num country_code match_score icp_industry icp_industry_categories

IMPORTANT: If the response contains more than one record, always present the options to the user and ask them to choose before taking any follow-up action. Do not act on all results automatically.

NameRequiredDescriptionDefault
nameNo
pageNo
limitNo
regionsNo
industryNo
industriesNo
company_sizeNo
country_codeNoUS
icp_industriesNo
icp_industry_categoriesNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the 'Behavior: read_only, idempotent' line is partly redundant, but the description adds real value: a truncation signal (truncated), pagination via page/limit, and a hard rule to surface multiple candidates instead of auto-acting. That multi-record discipline is behavior no annotation could convey.

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

Conciseness4/5

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

Well front-loaded: purpose, then 'Use when', 'Behavior', and an IMPORTANT action rule. However, the Returns field listing duplicates the existing output schema and the Behavior line repeats the annotations, so a few sentences do little work. Still tight and scannable.

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?

Since an output schema exists, the description needn't document return shape, yet it does; the real gaps are the undocumented pagination/default parameters. Routing, prerequisites, and the multi-candidate handling rule are all present, so it is close to complete for a 10-param read tool.

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 0% across 10 parameters, so the description carries the full burden. It maps name/regions/industry/company_size conceptually but never explains the industry vs industries vs icp_industries split, page, limit, the country_code='US' default, or icp_industry_categories — leaving roughly half the parameters undocumented anywhere.

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 plus the exact filter dimensions (name, regions, industry, employee band) and names the downstream sibling it feeds (search_people_by_location_and_seniority). An agent can distinguish it from search_accounts_with_filters and the people-search tools without opening any schema.

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

Usage Guidelines5/5

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

Has an explicit 'Use when' section covering both the routing case (resolve a company name here rather than passing company_name to the people-search tool, to avoid ambiguous-match rejection) and the direct-goal case ('find companies like X', Ohio industrials 200-1000 employees). It also states the required post-call workflow (present multiple candidates and let the user choose).

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

get_account_categoriesGet account categoriesA
Read-only
Inspect

List the account categories: the fixed vocabulary (Customer, Prospect, …) with display labels.

Use when: Use to populate a category picker before calling BulkSetAccountCategory, BulkAddAccountCategories or BulkRemoveAccountCategories.

Behavior: read_only

workspace_id / user_id are injected from request headers.

Returns categories[] with fields: category label

IMPORTANT: If the response contains more than one record, always present the options to the user and ask them to choose before taking any follow-up action. Do not act on all results automatically.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/destructiveHint/openWorldHint, so 'Behavior: read_only' is redundant, but the description adds genuinely non-obvious context: workspace_id/user_id are injected from request headers, and a directive about presenting options when multiple records come back rather than acting on all of them. That multi-result handling guidance is behavior the annotations cannot convey.

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

Conciseness4/5

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

Front-loaded with the resource definition and organized into labeled Use when / Behavior / Returns sections, so an agent can scan it fast. Slightly inflated by the redundant 'Behavior: read_only' line (already in annotations) and a returns block that duplicates the output schema.

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

Completeness5/5

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

Despite being a trivial zero-param read, the description covers everything an agent needs: what the vocabulary is, when to call it, that scoping is implicit via headers, the return shape, and how to handle multi-record results. An output schema exists, so the extra returns detail is bonus rather than a crutch.

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

Parameters4/5

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

Zero parameters, so the schema baseline of 4 applies. The description still adds value by explaining that workspace_id/user_id come from request headers, pre-empting an agent's question about why no scoping parameter exists.

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

Purpose5/5

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

States a specific verb and resource ('List the account categories') and immediately qualifies it as the fixed vocabulary with display labels, even giving example values (Customer, Prospect). This clearly separates it from the similarly named sibling get_workspace_categories and from the bulk_* mutation 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?

Gives an explicit use case (populate a category picker) and names the three follow-up tools it precedes (BulkSetAccountCategory, BulkAddAccountCategories, BulkRemoveAccountCategories), which is strong routing. It stops short of stating exclusions against the confusingly similar get_workspace_categories sibling or any when-not condition.

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

get_company_profileGet company profileA
Read-only
Inspect

Retrieve the stored company profile (research document) for the workspace. Returns a structured object with sections: one_line_summary, value_proposition, pain_points, proof_points, competitors, customer_industry_category, customer_industry, departments, seniority, title_keywords, title_regex, buying_committee, buying_committee_regex, extended_buying_committee, extended_buying_committee_regex, company_size, named_customers, named_investors. IMPORTANT — rendering instructions: do NOT dump raw JSON, bullet lists of keys, or plain text paragraphs in chat. After fetching, render the full document as a self-contained editable UI (React or HTML artifact) — the user must review and edit each section inline.

Use when: Use when the user wants to view or edit the company profile / company research for the workspace. After the tool returns, IMMEDIATELY render the editable artifact UI in the same turn — do not summarize the JSON in prose. If the response contains no document or all sections are empty/null, tell the user 'No company profile has been generated yet' and prompt them to generate one from the app — do NOT render an empty artifact. GenerateCompanyResearch is not an exposed MCP tool so it cannot be called directly; direct the user to trigger generation from the Boomerang app, then call get_company_profile again once they confirm it is ready.

Behavior: read_only

workspace_id / user_id are injected from request headers.

Next steps (after this tool succeeds): [REQUIRED] [ACTION] → call update_company_profile: MANDATORY same turn: render the returned data as an editable company profile artifact UI with labeled sections and a Save button wired to update_company_profile. Do NOT echo JSON or field values as chat text.

Also returns pagination info (researched_on, company_name, company_url, one_line_summary, value_proposition, pain_points, proof_points, competitors, customer_industry_category, departments, seniority, title_keywords, company_size, named_customers, named_investors, title_regex, buying_committee, buying_committee_regex, customer_industry, extended_buying_committee, extended_buying_committee_regex).

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered; the description goes further with the empty/null response behavior and the mandatory rendering contract (no raw JSON, render an editable artifact). It adds real workflow context beyond annotations, though most of the added text is presentation policy rather than tool behavior.

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 verb and usage guidance are front-loaded and clear, but the definition is bloated: the full field list appears twice (once in the opening sentence, again in the closing 'Also returns pagination info' sentence), and rendering instructions are restated in three places. Roughly a third of the text is repetitive.

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

Completeness5/5

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

With annotations covering safety and an output schema present, the description need only cover invocation context — and it does: trigger conditions, the empty-document fallback, the generation dependency, and the update_company_profile next step are all present. Nothing an agent needs to call this correctly is missing.

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

Parameters4/5

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

The tool takes zero parameters and the description correctly notes workspace_id/user_id are injected from request headers, which is useful context. With no parameters to document, the baseline of 4 applies; there is nothing more to add.

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: 'Retrieve the stored company profile (research document) for the workspace.' The scoping phrase 'for the workspace' plus the enumerated return sections make it unmistakable against siblings like get_user_profile or get_current_workspace, which 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 Guidelines5/5

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

Gives explicit when-to-use ('when the user wants to view or edit the company profile / company research'), names the required follow-up (update_company_profile), and closes off a plausible alternative by explaining GenerateCompanyResearch is not an exposed MCP tool and must be triggered in the app. Error paths and re-invocation conditions are also specified.

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

get_crm_specificationGet crm specificationA
Read-only
Inspect

Fetch a previously-registered CRM specification by its own id.

Use when: Use when you already have a CrmSpecification id (from create_crm_specification's response) and need to confirm its connection_source or check is_deleted.

Behavior: read_only

workspace_id / user_id are injected from request headers.

NameRequiredDescriptionDefault
idNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so 'Behavior: read_only' is largely redundant. However, the description adds genuinely useful operational context not in annotations: workspace_id and user_id are injected from request headers, so the caller need not supply them. That auth/implicit-parameter disclosure is the value-add here.

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

Conciseness4/5

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

Front-loaded with clear labels ('Use when:', 'Behavior:') and no wasted sentences. Minor blemish: the redundant 'Use when: Use when' stutter, but otherwise tight 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?

An output schema exists, so return values need not be described, and annotations carry the safety profile. The definition covers id sourcing and the read-only nature well; the remaining gap is the unexplained optionality of 'id', which leaves a small ambiguity 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 0% and the single 'id' param is only typed as string with a null default, so the description must compensate. It does add provenance (the id comes from create_crm_specification's response), which is meaningful, but it never states the id's format or addresses why the param is optional despite being a get-by-id lookup.

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

Purpose5/5

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

States a specific verb and resource ('Fetch a previously-registered CRM specification by its own id') and implicitly distinguishes itself from the sibling create_crm_specification by scoping to already-registered records. An agent can tell what this does without opening the schema.

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

Usage Guidelines5/5

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

The 'Use when' clause gives an explicit precondition (you already hold a CrmSpecification id from create_crm_specification's response) and the goal (confirm connection_source or check is_deleted). This routes the agent precisely and names the sibling that produces the required id.

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

get_current_userGet current userA
Read-onlyIdempotent
Inspect

Get the logged-in user (requestor) for this MCP session.

Call this when you need to know who is authenticated — for example when the user asks "who am I?", when a workflow needs the current user's ID, or before calling tools that act on behalf of the requestor (intro requests, relationship actions, workspace membership checks, etc.).

The returned user_id is the Keycloak subject (sub claim). This is the same identifier injected as user_id on workspace-scoped tool calls via request context.

Returns: The requestor's user_id plus basic profile fields from the access token when available (email, name).

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description adds real value beyond that: the returned user_id is the Keycloak 'sub' claim and the same identifier injected as user_id on workspace-scoped tool calls via request context — a non-obvious cross-tool invariant. It does not cover failure modes (e.g., unauthenticated session), which keeps it from a 5.

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

Conciseness4/5

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

Front-loaded with the core purpose in the first sentence, then when-to-use, then identity semantics. The trailing 'Returns' block partially restates what the output schema already provides, which is slight redundancy, but no sentence is truly wasted.

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

Completeness5/5

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

For a zero-param, read-only tool with an output schema and full annotation coverage, the description supplies everything an agent needs: purpose, trigger conditions, and the meaning/linkage of the returned identifier. Return-value detail is arguably redundant given the output schema, so nothing is missing.

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

Parameters4/5

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

Zero parameters, so the baseline is 4. The description usefully explains the semantics of the value involved (requestor identity as Keycloak subject), which is more than the empty schema can convey, though there are no parameter names or formats to document.

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 (get the logged-in/requestor user for this MCP session) and immediately clarifies scope as 'requestor' rather than an arbitrary user, which separates it from siblings like get_user_by_email, get_user_profile, and get_current_workspace. An agent can select it without opening the schema.

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

Usage Guidelines5/5

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

Explicitly enumerates when to call: the user asks 'who am I?', a workflow needs the current user's ID, or before tools that act on behalf of the requestor (intro requests, relationship actions, workspace membership checks). This is a genuine when-to-use list with concrete examples naming downstream sibling tool families.

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

get_current_workspaceGet current workspaceA
Read-onlyIdempotent
Inspect

Get information about the workspace you are currently working in.

Call this when the user asks which workspace they are in, or wants details about their active workspace (name, type, description, contact stats, etc.).

Returns: Workspace details for the active session workspace, or an error if none is selected.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so the safety profile is covered. The description adds real context beyond that: it enumerates the returned facets (name, type, description, contact stats) and discloses the failure mode ('an error if none is selected'), which is not derivable from the annotations.

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

Conciseness4/5

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

Front-loaded purpose followed by a usage condition and a Returns block; short and skimmable. The phrase 'workspace you are currently working in' is slightly restated as 'active session workspace', and the Returns block partially overlaps the output schema, but no sentence is pure filler.

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

Completeness5/5

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

For a simple zero-parameter read tool with full annotation coverage and an existing output schema, the description supplies everything needed: purpose, trigger condition, and the empty-selection error case. Nothing required to call it correctly is missing.

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

Parameters4/5

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

The tool takes zero parameters, so the description carries no parameter-documentation burden; the baseline for a 0-param tool is 4. Nothing here misleads about inputs.

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 ('Get information about the workspace you are currently working in'), and the scope word 'current'/'active session workspace' cleanly separates it from search_workspaces and switch_workspace. An agent can identify the tool without opening the schema.

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

Usage Guidelines4/5

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

It gives an explicit trigger: 'Call this when the user asks which workspace they are in, or wants details about their active workspace.' That is clear when-to-use guidance, though it never names the neighboring alternatives (e.g. search_workspaces, switch_workspace) or states 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_draft_by_typeGet draft by typeA
Read-only
Inspect

Fetch the latest AI-generated draft of a specific type for an intro request. After request_intro, this is an automatic mandatory follow-up — call without asking the user. Call once per draft type: GHOSTWRITTEN_EMAIL (email the requester sends directly), FORWARDABLE_EMAIL (email the referrer / SUPER_CONNECTOR workspace member forwards), and TEXT (plain-text message). Returns the draft content so the user can review and edit it before the intro request is submitted. IMPORTANT — rendering instructions: do NOT dump raw JSON or plain text. After fetching drafts, render each one in an editable UI matched to its type — the user must be able to change fields inline and save. For GHOSTWRITTEN_EMAIL and FORWARDABLE_EMAIL: render a self-contained editable email composer (React or HTML artifact) styled like an email client — editable inputs for From, To, CC, and Subject; an editable textarea or rich-text area for Body. Label each card with its draft type (e.g. 'Ghostwritten Email', 'Forwardable Email'). Include a Save button per draft that calls update_draft with is_manually_edited=true and the edited email_content. For TEXT: render an editable textarea pre-filled with the message and a Save button that calls update_draft with the edited text_content. Use tabs or cards when showing multiple drafts. Render as an artifact so the user can review, edit, and save outreach copy before submitting the intro request.

Use when: Call automatically in the same turn immediately after request_intro succeeds — do NOT ask 'Want me to pull those up?' Call three times — GHOSTWRITTEN_EMAIL, FORWARDABLE_EMAIL, TEXT — using intro_request_id from the request_intro response, then render all results in editable email/text UI with Save wired to update_draft. Only proceed to intro_request_send_state_change_event (INTRO_REQUESTED_EVENT) after the user has reviewed (and optionally saved edits to) the drafts.

Behavior: read_only

workspace_id / user_id are injected from request headers.

Next steps (after this tool succeeds): [optional] [ACTION] → call update_draft: When the user edits a draft in the UI and clicks Save, call update_draft with is_manually_edited=true and the full edited email_content or text_content. [optional] [SUGGESTION] → call intro_request_send_state_change_event: After the user has reviewed and saved any draft edits, submit the intro request for admin review.

Also returns pagination info (request_context).

NameRequiredDescriptionDefault
draft_typeNo
intro_request_idNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Beyond the annotations (readOnlyHint=true, destructiveHint=false, idempotentHint=false), the description discloses that this is a mandatory automatic follow-up, that it returns editable draft content per type, and how results must be consumed. It does not discuss auth beyond the header-injected workspace_id/user_id note, nor rate/limit behavior, but the added workflow semantics are substantial.

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

Conciseness3/5

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

Purpose is front-loaded, but the rendering/persistence instructions are long and largely restated in both the body and the 'Use when' section, which doubles the length. A large fraction of the text is UI-composition guidance rather than tool-selection signal.

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 high-complexity multi-step workflow with an output schema present, the description supplies purpose, sequencing, per-type call pattern, rendering expectations, and follow-up wiring to update_draft and the state-change event. Nothing needed to invoke it correctly is missing.

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

Parameters4/5

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

Schema description coverage is 0% and draft_type has no enum in the schema, yet the description compensates by naming and explaining all three valid values (GHOSTWRITTEN_EMAIL, FORWARDABLE_EMAIL, TEXT) and by saying intro_request_id comes from the request_intro response. It stops short of flagging that neither parameter is schema-required, which is a residual 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?

States a specific verb and resource ('Fetch the latest AI-generated draft of a specific type for an intro request') and enumerates the three draft types with parenthetical definitions. An agent can distinguish this from update_draft (write) and intro_request_send_state_change_event (submit) purely from the text.

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

Usage Guidelines5/5

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

Gives explicit when-to-call instructions ('automatically in the same turn immediately after request_intro succeeds — do NOT ask'), an explicit count and argument list for the three calls, and an explicit when-not-to-proceed condition gating the next tool. Alternatives and ordering are fully specified.

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

getEmailExtractionJobStatusGet email extraction job statusA
Read-only
Inspect

Poll an email extraction job. Returns status and progress counters. When status is COMPLETED, PARTIALLY_COMPLETED, or FAILED, also returns results[] with each contact's email (if found), email_status, resolved_vendor, and row status. Poll until terminal; do not invent emails.

Use when: Use after submitEmailExtractionJob (or any flow that returned a job_id) to check whether extraction finished. Read results from this response when the job is terminal — no separate results call is needed.

Behavior: read_only

Returns results[] with fields:

row_id first_name last_name company_name company_domain email email_status confidence resolved_vendor status boomerang_identity_id Also returns pagination info (seconds, nanos).

IMPORTANT: If the response contains more than one record, always present the options to the user and ask them to choose before taking any follow-up action. Do not act on all results automatically.
NameRequiredDescriptionDefault
job_idNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds real value beyond them: the terminal statuses (COMPLETED, PARTIALLY_COMPLETED, FAILED), the 'poll until terminal' loop, the 'do not invent emails' guardrail, and the multi-record handling rule. It stops short of describing pagination semantics beyond noting seconds/nanos.

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

Conciseness3/5

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

Purpose is front-loaded and the Use when/Behavior blocks are well structured. However, the lengthy results[] field listing duplicates the output schema (has output schema = true), which is redundant bulk that dilutes the useful 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?

With an output schema present, the description is not obligated to enumerate return fields, and its real gaps (job_id format, pagination behavior) are minor. Purpose, trigger, terminal states, and the multi-record caution give an agent everything needed to call it correctly.

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

Parameters3/5

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

The single job_id parameter has 0% schema description coverage, and the description only hints at its origin ('any flow that returned a job_id') without giving format or expected value. That partial compensation is better than nothing but leaves the one parameter under-specified.

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 (poll) and resource (email extraction job) and describes the returned status/progress. It explicitly ties itself to the sibling submitEmailExtractionJob, so an agent can distinguish it from unrelated job/status tools without opening the schema.

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

Usage Guidelines5/5

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

The 'Use when' block names the exact trigger (after submitEmailExtractionJob or any flow returning a job_id) and states the alternative that is NOT needed ('no separate results call is needed'). It also instructs polling until terminal, leaving little to inference.

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

get_entity_tagsGet entity tagsA
Read-only
Inspect

Fetch the tags attached to specific entities, keyed by entity id. Entities are addressed by internal UUID.

Use when: Use when you already have entity ids and need their tags — e.g. showing why an account was grouped a certain way.

Behavior: read_only

workspace_id / user_id are injected from request headers.

Returns entities[] with fields: entity_id tags

IMPORTANT: If the response contains more than one record, always present the options to the user and ask them to choose before taking any follow-up action. Do not act on all results automatically.

NameRequiredDescriptionDefault
entity_idsNo
entity_typeNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, but the description adds real context beyond them: workspace_id/user_id are injected from request headers, the return shape, and a notable multi-record handling rule requiring the agent to present options before acting. This is meaningful guidance the annotations do not carry.

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

Conciseness4/5

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

Front-loaded and clearly sectioned with 'Use when', 'Behavior', and 'Returns' labels, so an agent can scan it fast. The trailing IMPORTANT block is somewhat verbose but functionally justified.

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

Completeness4/5

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

Covers auth injection, usage context, and multi-record behavior, and an output schema exists so return details are already handled. The only gap is the undocumented entity_type parameter, which is minor for a low-complexity read tool.

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

Parameters3/5

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

Schema description coverage is 0%, so the description must carry parameter meaning. It explains that entities are addressed by internal UUID, which adds value for entity_ids, but the entity_type parameter is never mentioned, leaving one of two params undocumented.

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

Purpose4/5

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

States a specific verb and resource ('Fetch the tags attached to specific entities, keyed by entity id') and clarifies entities are addressed by internal UUID. An agent can distinguish it from list_tags and remove_entity_tags, though no sibling is named explicitly.

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

Usage Guidelines4/5

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

Has an explicit 'Use when' section: 'when you already have entity ids and need their tags', with a concrete example (showing why an account was grouped). No when-not condition or named alternative, so it stops short of a 5.

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

get_person_by_linkedin_handleGet person by linkedin handleA
Read-onlyIdempotent
Inspect

Exact lookup of a single person by LinkedIn handle/vanity name (or full LinkedIn URL), returning their profile and full work-experience history. Use this instead of search_people when the user gives you a specific LinkedIn profile URL or handle.

Use when: User supplies a LinkedIn URL or bare handle and wants that specific person's profile and/or career history — not a filtered search.

Behavior: read_only, idempotent

Returns experiences[] with fields:

title company_name company_social_id start_date end_date is_current Also returns pagination info (full_name, current_title, current_company, location, country_code, linkedin_url, social_followers, person_social_id).

IMPORTANT: If the response contains more than one record, always present the options to the user and ask them to choose before taking any follow-up action. Do not act on all results automatically.
NameRequiredDescriptionDefault
linkedin_handleNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

The 'Behavior: read_only, idempotent' line merely restates the annotations, earning no credit. However, the IMPORTANT clause about multi-record responses and presenting options to the user before follow-up is genuine behavioral guidance not captured by any structured field. It adds real value beyond annotations, though the annotation echo dilutes it.

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

Conciseness3/5

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

Purpose and routing are front-loaded, which is good. But the description then enumerates experiences[] return fields and pagination fields that an output schema already documents, adding bulk without added value. That block should be trimmed.

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

Completeness4/5

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

For a single-parameter read tool with annotations covering safety and an output schema covering return values, the description is largely complete. The multi-record handling caveat covers the main ambiguity an agent would face. Minor gap: it never states the input is optional.

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 0% for the single parameter, so the description carries the full burden. It specifies that the parameter accepts a bare handle/vanity name OR a full LinkedIn URL, which is materially more than the schema's bare 'string' type. It does not note that the field is optional (default null), leaving a small 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?

States a specific verb and resource ('Exact lookup of a single person by LinkedIn handle/vanity name') and explicitly distinguishes itself from search_people. An agent can differentiate this from the many search_* siblings without opening the schema.

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

Usage Guidelines5/5

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

Names the alternative (search_people) and the exact condition that selects this tool ('user gives you a specific LinkedIn profile URL or handle'), then reinforces it with a 'Use when:' clause and an implicit when-not ('not a filtered search'). Nothing is left to inference.

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

get_power_user_job_changesGet power user job changesA
Read-only
Inspect

Find Power Users in this workspace who appear to have left the employer originally declared for them on import, detected in the last 30 days. Not scoped to any notion of account ownership — returns every matching Power User workspace-wide (optionally filtered to one account). Returns, per person, a LinkedIn profile URL, which account they're associated with (the account itself IS their new/current employer), their past/declared company and (best-effort) title, their current title/tenure as last resolved from profile data, and an approximate job-change-detected timestamp.

Use when: Use when you need to check whether any Power User in this workspace has moved to a new employer in roughly the last month. Only job changes detected within the trailing 30 days (as of the call) are returned — there's no way to widen or shift this window via the request. Omit account_id to search the whole workspace; pass account_id to scope to one specific account (a plain filter, not an ownership check). Workspace is taken from session context.

Behavior: read_only

workspace_id / user_id are injected from request headers.

Prerequisites (check before calling this tool):
  [optional] Do not treat left_provided_company as a confirmed job change — it is a signal derived from resolved company records, which can be stale or wrong.
    Verify: N/A — this is a standing caveat on every result this tool returns, not a precondition to check beforehand.

Next steps (after this tool succeeds):
  [REQUIRED] [ACTION]: Before acting on any result (e.g. drafting outreach, notifying a rep), independently verify the job change is genuine — e.g. a web search or LinkedIn lookup for the person's current role.
  [optional] [SUGGESTION]: If page_info.total_pages is greater than page_info.current_page_number + 1, call this tool again with page_number incremented by 1 to retrieve the remaining results.

Internal fields — available for follow-up tool calls but do NOT display to the user: `relationship_path_id`, `power_user_id`

Returns results[] with fields:

relationship_path_id account_id: CRM account UUID this Power User is associated with. account_name: Name of the CRM account this Power User is associated with. account_owner_email: [redacted] power_user_id user_linkedin_id power_user_linkedin_url: Full LinkedIn profile URL for this Power User — use this to look up their current role and verify the job change before acting on it. first_name last_name connector_email: [redacted] provided_company_name provided_company_domain provided_company_linkedin_id resolved_provided_company_linkedin_id past_title current_company_name current_company_linkedin_id current_title current_company_start_date current_company_end_date is_current left_provided_company job_change_detected_at import_extras Also returns pagination info (total_pages, current_page_number, page_size, total_count).

IMPORTANT: If the response contains more than one record, always present the options to the user and ask them to choose before taking any follow-up action. Do not act on all results automatically.
NameRequiredDescriptionDefault
page_sizeNo
account_idNo
page_numberNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already establish the read-only profile, but the description adds substantial non-obvious behavior: the hard 30-day window that cannot be adjusted, header-injected workspace/user IDs, the caveat that left_provided_company is an unreliable derived signal, the required independent verification before acting, and pagination semantics. This is well beyond what the annotations convey.

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

Conciseness4/5

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

Front-loaded purpose, then clearly labeled sections (Use when / Behavior / Prerequisites / Next steps), which makes the length navigable. It loses a point for restating 'Behavior: read_only' (already an annotation) and enumerating ~25 return fields despite an output schema being present.

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 read-only, paginated list tool this covers everything an agent needs: the result window, scoping behavior, prerequisite caveat, post-call verification, pagination handling, hidden internal fields, and a multi-record presentation rule. With an output schema present, no return-value explanation is owed, and none 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 0%, so the description must carry the load. It does explain account_id thoroughly (plain filter, not an ownership check; omit = workspace-wide) and implies page_number via the pagination next-step. However page_size is never described, leaving one of three parameters fully undocumented.

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

Purpose5/5

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

Names a specific verb+resource (find Power Users who left their import-declared employer) plus the scope and the window ('detected in the last 30 days'). Explicitly distinguishes itself from ownership-scoped siblings ('Not scoped to any notion of account ownership'), so an agent can separate it from the other get_/search_ tools without opening any schema.

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

Usage Guidelines4/5

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

Gives a clear 'Use when' trigger, explains the account_id omit-vs-pass decision, and closes off an inferred alternative ('no way to widen or shift this window'). It does not name a concrete sibling tool to use instead in adjacent cases (e.g. the ownership-scoped account tools), so it stops just short of full routing guidance.

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

get_referrer_request_for_referrer_by_idGet referrer request for referrer by idA
Read-only
Inspect

Fetch a single referrer request by its UUID for a specific referrer (workspace member with SUPER_CONNECTOR role). Returns full details including current state, decline reason, reason text, and timestamps.

Use when: Use when you have referrer_request_id and referrer_id (the workspace member with SUPER_CONNECTOR role) and need full details of that connector leg — status, decline reason, or timestamps before SendStateChangeEvent.

Behavior: read_only

workspace_id / user_id are injected from request headers.

Internal fields — available for follow-up tool calls but do NOT display to the user: actor_id

Also returns pagination info (reason, declined_reason, acted_on_behalf_of_referrer, new_holder_id).

NameRequiredDescriptionDefault
referrer_idNo
referrer_request_idNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already cover read-only/non-destructive, but the description adds non-obvious operational context: workspace_id and user_id are injected from request headers rather than passed as arguments, and actor_id is an internal field that must not be surfaced to users. The 'Behavior: read_only' line merely restates the annotation, but the injection and redaction notes are genuine value-adds.

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

Conciseness3/5

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

Front-loaded with the core purpose and reasonably tight, but it wastes a line on 'Behavior: read_only' which duplicates the annotation, and the closing sentence labels reason/declined_reason/acted_on_behalf_of_referrer/new_holder_id as 'pagination info', which is misleading framing for return fields already covered by the output 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?

An output schema exists, so the description need not enumerate return values, and it correctly focuses on preconditions, implicit header-derived parameters, and the internal-field redaction rule. What is missing is only differential guidance against the sibling state/transition tools, which is a modest gap for a straightforward single-record read.

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 0% with no descriptions on either parameter, so the description has to carry the load and largely does: referrer_id is defined as the workspace member holding the SUPER_CONNECTOR role and referrer_request_id is identified as a UUID. Type/format detail beyond 'UUID' and any error behavior for unknown IDs are absent.

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

Purpose4/5

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

States a specific verb and resource: fetch a single referrer request by UUID scoped to a given referrer, with a short list of what the payload contains (state, decline reason, reason text, timestamps). It is clear what the tool does, though it never explicitly contrasts itself with the closely-named siblings referrer_request_get_current_state or referrer_request_get_state_machine_transitions.

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 'Use when' sentence gives concrete preconditions (you hold referrer_request_id and referrer_id) and a motivating scenario (need status/decline reason/timestamps before SendStateChangeEvent). It lacks a when-not-to-use clause or a pointer to the narrower state-only siblings, so the boundary against alternatives remains implicit.

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

get_scoped_memoryGet scoped memoryA
Read-only
Inspect

Load the single MEMORY document for a USER or WORKSPACE scope (full markdown_body).

Use when: Use before maintaining memory: retrieve the existing scoped memory document to merge an observation into it.

Behavior: read_only

workspace_id / user_id are injected from request headers.

Also returns pagination info (id, slug, family, scope, workspace_id, user_id, display_name, description, injection_strategy, priority, enabled, publish_status, tags, tool_binding_key, activation_conditions_json, visibility_conditions_json, metadata_json, published_version, created_at, updated_at, created_by, updated_by, latest_version, session_id, entity_type, entity_id).

NameRequiredDescriptionDefault
scopeNo
scope_idNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered; the description usefully adds that workspace_id/user_id are injected from request headers (the agent cannot pass them) and that the full markdown_body is returned. It does not explain what scope/scope_id resolve to when omitted. Note idempotentHint=false on a read, which the description neither confirms nor contradicts.

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 purpose and usage lines are front-loaded and efficient, but the trailing dump of ~25 return fields duplicates the existing output schema and pads the definition. The 'Behavior: read_only' line also restates the readOnlyHint annotation.

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?

An output schema exists, so the long return-field list is unnecessary, and the real gap is the undocumented scope/scope_id semantics. For a low-complexity 2-param read tool the description is largely sufficient, but the parameter ambiguity 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.

Parameters3/5

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

Schema coverage is 0% and neither param has a description, so the description must carry the load. It implies scope selects USER vs WORKSPACE and scope_id is the identifying value, but it never states valid values, format, or what happens when both are null, leaving the two params 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?

States a specific verb ('Load') and resource ('the single MEMORY document'), scoped to USER or WORKSPACE, and notes it returns the full markdown_body. It does not explicitly name the siblings upsert_scoped_memory or delete_scoped_memory, so an agent distinguishes it by verb semantics rather than explicit routing.

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 'Use when' clause gives a concrete workflow: retrieve the existing scoped memory document before merging an observation into it (read-before-write). It gives clear context but never states exclusions or names the write/delete alternatives it should be preferred over.

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

get_super_connector_metadataGet super connector metadataA
Read-onlyIdempotent
Inspect

Fetch how and why a super connector was provisioned (roles, qualifying company, investor / public-research / calendar evidence, and a human-readable notes summary) so closeness to the workspace can be judged.

Use when: When assessing how strong or close a specific super connector's relationship to the workspace is, given who provisioned them and why.

Behavior: read_only, idempotent

DEPRECATED.

workspace_id / user_id are injected from request headers.

Also returns pagination info (roles, reason, qualifying_company_name, qualifying_company_linkedin_id, producer, investor_evidence, public_research_evidence, calendar_evidence, notes, summary, relevance_score, relevance_band, relevance_scored_at).

NameRequiredDescriptionDefault
keycloak_user_idNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/destructive=false, and the description redundantly restates read_only/idempotent. What it genuinely adds is auth context (workspace_id/user_id injected from request headers) and the DEPRECATED status, which annotations do not convey.

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

Conciseness3/5

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

The critical DEPRECATED notice is buried mid-description rather than front-loaded, and 'Behavior: read_only, idempotent' merely duplicates the annotations. It also enumerates return fields despite an output schema existing, adding noise.

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?

An output schema exists so return values needn't be explained, yet the description lists them anyway. Useful context on deprecation and header injection is present, but the sole input parameter is left undocumented, leaving a real gap for a metadata-fetch tool.

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?

One parameter (keycloak_user_id) with 0% schema description coverage, and the description never explains it. It discusses injected header fields (workspace_id/user_id) instead, which actually raises confusion rather than clarifying the declared keycloak_user_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?

States a specific verb (fetch) and resource (super connector metadata) with concrete scope: how/why it was provisioned, including roles, qualifying company, and evidence types. However it does not distinguish itself from the sibling get_super_connector_metadata_bulk, leaving an agent to guess which of the two to pick.

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 a clear 'Use when' clause tied to assessing relationship closeness, plus a high-value DEPRECATED flag. It gives no when-not guidance and never names the bulk alternative as the preferred route, so the routing decision between the two metadata tools is left to inference.

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

get_super_connector_metadata_bulkGet super connector metadata bulkA
Read-onlyIdempotent
Inspect

Fetch how and why one or more super connectors were provisioned (roles, qualifying company, investor / public-research / calendar evidence) together with their relevance verdict — summary, relevance_score (1-100 against the workspace's own company), and relevance_band (HIGH/MEDIUM/LOW) — so closeness to the workspace can be judged. Accepts 1..N super connector ids in a single call — always prefer this over calling repeatedly per id.

Use when: When assessing how strong or close one or many super connectors' relationships to the workspace are, given who provisioned them and why. Prefer relevance_band / relevance_score and summary when present; fall back to notes for connectors that have not been scored yet. Use this for both single-id and multi-id lookups.

Behavior: read_only, idempotent

workspace_id / user_id are injected from request headers.

Returns entries[] with fields: super_connector_id provisioning_evidence

IMPORTANT: If the response contains more than one record, always present the options to the user and ask them to choose before taking any follow-up action. Do not act on all results automatically.

NameRequiredDescriptionDefault
super_connector_idsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Annotations declare readOnly/idempotent, but the description adds material context beyond them: workspace_id/user_id are injected from request headers (no auth parameter needed), the returned entries[] shape, and a behavioral caution to present multiple records to the user rather than acting on all of them automatically.

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

Conciseness4/5

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

Front-loaded with the purpose, then organized into Use when / Behavior / Returns / IMPORTANT sections that are easy to scan. Slightly long and partially duplicates the output-schema field list, but every section 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?

Covers purpose, usage, header injection, return shape, and a multi-record safety caveat. Since an output schema exists, re-listing entries[] fields is redundant rather than harmful, but the description is complete enough 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 description coverage is 0% and the single parameter has no description, so the description must carry the load. It does clarify the parameter's semantics ('1..N super connector ids in a single call'), though it does not state that the field is optional with a null default.

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

Purpose5/5

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

States a specific verb and resource (fetch provisioning metadata for super connectors) plus exactly what is returned: roles, qualifying company, evidence, relevance verdict with score and band. It is clearly distinguishable from the sibling get_super_connector_metadata by the explicit bulk 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 an explicit 'Use when' clause, an alternative rule ('always prefer this over calling repeatedly per id'), and a fallback path ('fall back to notes for connectors that have not been scored yet'). Also states it covers both single-id and multi-id lookups, removing the main routing ambiguity.

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

get_unique_filter_optionsGet unique filter optionsA
Read-only
Inspect

Fetch available filter option values (seniority, location, category, strength, relationship path type, department, account owner, industry, country, employee size, ICP) for warm intro paths scoped to a reference entity (account, contact, or super connector). Returns value/label pairs with counts so the LLM can present valid filter choices to the user.

Use when: Use before or alongside SearchWarmIntroRelationships when you need to show the user which filter values exist for a given account, contact, or super connector scope. Pass any already-active filters to narrow the returned option lists dynamically. Do not use this to retrieve relationship paths — use SearchWarmIntroRelationships for that.

Behavior: read_only

workspace_id / user_id are injected from request headers.

Returns seniority[] with fields:

value label count Returns location[] with fields: value label count Returns category[] with fields: value label count Returns strength[] with fields: value label count Returns relationship_path_type[] with fields: value label count Returns department[] with fields: value label count Returns account_owner[] with fields: value label count Returns account_industry[] with fields: value label count Returns account_country[] with fields: value label count Returns account_employee_size[] with fields: value label count Returns account_icp[] with fields: value label count Returns account_office_country[] with fields: value label count Returns account_office_state[] with fields: value label count Returns account_office_city[] with fields: value label count

IMPORTANT: If the response contains more than one record, always present the options to the user and ask them to choose before taking any follow-up action. Do not act on all results automatically.
NameRequiredDescriptionDefault
searchNo
filtersNoOptional active filters to scope the returned option values — e.g. if a location filter is active, seniority options will only include values present for that location.
reference_idNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered; the description adds genuinely new context: 'workspace_id / user_id are injected from request headers' (no need to supply them) and a mandatory post-call behavior ('If the response contains more than one record, always present the options ... ask them to choose'). 'Behavior: read_only' merely restates the annotation, and response format is duplicated rather than adding nuance, which keeps this below 5.

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?

Front-loads well with purpose and a 'Use when' block, but roughly half the text is a 14-times-repeated 'Returns X[] with fields: value label count' listing that duplicates the existing output schema verbatim. That bulk crowds out the genuinely load-bearing content (the reference_id semantics) and provides no decision-relevant 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?

Since an output schema exists, the return-value section is unnecessary and the space should have gone to the three parameters: the description never explains what 'reference_id' should contain or how it selects the scope, and 'search' is entirely undocumented in both schema and description. For a zero-required-parameter scoping tool, that leaves the agent guessing at the most important input.

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?

Coverage is only 33% and the schema carries a very rich description for 'filters' but nothing for 'search' or 'reference_id'. The description clarifies the intent of filters ('Pass any already-active filters to narrow the returned option lists dynamically') and says the scope is an account, contact, or super connector, but never states how to pass that scope (which parameter, UUID vs. id) or what 'search' does — meaningful gaps remain.

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

Purpose5/5

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

States a specific verb and resource ('Fetch available filter option values ... for warm intro paths') and enumerates exactly which option families are returned. It also names the sibling it is not ('Do not use this to retrieve relationship paths — use SearchWarmIntroRelationships'), so an agent can separate the two without opening either schema.

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

Usage Guidelines5/5

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

Has an explicit 'Use when' block that ties usage to a concrete situation (before/alongside SearchWarmIntroRelationships when showing the user available filter values) and an explicit exclusion routing relationship-path retrieval to the sibling. It additionally explains that already-active filters should be passed to narrow the option lists, which is a usage rule, not just a schema fact.

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

get_user_by_emailGet user by emailA
Read-only
Inspect

Look up a platform user by email address. Returns the user's Keycloak ID and profile fields (name, LinkedIn ID). Use get_user_by_email to check if someone already exists or to resolve identity before updating a workspace member.

Use when: Use when you know the email and need to look up a user before adding or updating workspace membership. If email is unknown during an update, prefer search_workspace_members to find existing members, confirm identity with the user, then call create_workspace_member with the resolved email.

Behavior: read_only

Also returns pagination info (created_at, updated_at, created_by, updated_by, deleted_at, deleted_by).

NameRequiredDescriptionDefault
emailNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the 'Behavior: read_only' line adds nothing. The description does add useful context that the result resolves identity before workspace member updates, but the closing claim about 'pagination info' for a single-user lookup is confusing and arguably incorrect behavior disclosure.

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 'Use when:' guidance is front-loaded and valuable, but the description is padded with a self-referential restatement ('Use get_user_by_email to check if someone already exists') and a trailing sentence about pagination fields that does not belong in a single-entity lookup.

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 one-parameter, read-only lookup with an output schema, the description covers purpose, routing, and identity resolution adequately; return-value detail is legitimately delegated to the output schema. Only the misleading pagination sentence detracts.

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 0% and the single 'email' parameter is undocumented in the schema, but the description effectively supplies the semantic ('look up ... by email address'). It adds no format, case-sensitivity, or required/optional guidance, so it compensates only partially.

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 ('Look up a platform user by email address') and immediately names the returned identity fields (Keycloak ID, name, LinkedIn ID). An agent can distinguish this lookup-by-email tool from get_current_user, get_user_profile, and search_workspace_members without opening any schema.

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

Usage Guidelines5/5

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

Explicit when-to-use with a named alternative and a fallback sequence: 'If email is unknown during an update, prefer search_workspace_members to find existing members, confirm identity with the user, then call create_workspace_member with the resolved email.' This is exactly the routing information an agent needs.

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

get_user_profileGet user profileA
Read-only
Inspect

Retrieve the stored person profile (research document) for a user in the workspace. Returns a structured object with researched_on, person_name, person_url and a role classification (value/source/confidence). IMPORTANT — rendering instructions: do NOT dump raw JSON, bullet lists of keys, or plain text paragraphs in chat. After fetching, render the document as a self-contained editable UI (React or HTML artifact) — the user must review and edit the role inline.

Use when: Use when the user wants to view or edit the researched role for a person in the workspace. After the tool returns, IMMEDIATELY render the editable artifact UI in the same turn — do not summarize the JSON in prose. If no document exists yet, trigger GenerateUserResearch first, then call get_user_profile again when ready.

Behavior: read_only

workspace_id / user_id are injected from request headers.

Next steps (after this tool succeeds): [REQUIRED] [ACTION] → call update_user_profile: MANDATORY same turn: render the returned data as an editable person profile artifact UI with the role field and a Save button wired to update_user_profile. Do NOT echo JSON or field values as chat text.

Also returns pagination info (researched_on, person_name, person_url, role, next_15_days_focus, next_90_days_focus).

NameRequiredDescriptionDefault
user_idNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/destructiveHint, so safety is covered; the description adds genuinely new behavioral context (read-only nature restated, dependency on GenerateUserResearch, pagination-ish return fields, mandatory same-turn rendering). The heavy 'IMPORTANT — rendering instructions' is domain-specific but does disclose post-call behavior beyond structured fields.

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

Conciseness3/5

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

Purpose is front-loaded and readable, but the rendering instruction ('do NOT dump raw JSON...') is repeated three times across the description, 'Use when' block, and 'Next steps', and the returned-field list duplicates the output schema. Length is not matched by unique information.

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

Completeness4/5

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

For a read-only fetch with an output schema and annotation coverage, the definition supplies the key missing pieces: read-only behavior, ordering dependency on GenerateUserResearch, and the required follow-on call. Return-value enumeration is redundant given the output schema, and parameter format is left unspecified, keeping it just short of full.

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 0%, so the description must carry the load. It only notes that 'workspace_id / user_id are injected from request headers', which adds meaning for injection but leaves the single user_id parameter's type/format/requiredness unexplained (the schema lists it as an optional string). Baseline is adjusted down since the gap isn't fully compensated.

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 ('Retrieve the stored person profile (research document) for a user in the workspace') and clarifies the returned structure. This distinguishes it from siblings like get_company_profile and get_current_user, so an agent can select it without opening the schema.

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

Usage Guidelines5/5

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

Gives explicit when-to-use ('view or edit the researched role for a person in the workspace') plus a documented alternative path ('if no document exists yet, trigger GenerateUserResearch first, then call get_user_profile again'). The next-steps block names update_user_profile as the follow-on action, so routing is unambiguous.

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

get_workspace_categoriesGet workspace categoriesA
Read-only
Inspect

List all categories configured in the current workspace. Each category has id, label, name, description, and relationship_type. For the add-member Super Connector Category dropdown, filter to entries where relationship_type is SUPER_CONNECTORS and is_deleted is false — use id as the option value and label (or name) as the display text.

Use when: Call before rendering the add–Super Connector form (add_super_connector flow) — populates the required Category dropdown. Do NOT use with create_workspace_member for Super Connectors. Also use when the user asks what Super Connector categories exist in the workspace. REQUIRED before applying FILTER_FIELD_CATEGORY in search_warm_intro_relationships: filter response to relationship_type SUPER_CONNECTORS and is_deleted false, match the user's intent to a category label (e.g. 'Investor Employees', 'Advisor'), then pass that category's id UUID as the filter value.

Behavior: read_only

workspace_id / user_id are injected from request headers.

Returns categories[] with fields: id: Category UUID — pass as category_ids when calling add_super_connector. name: Internal category name/slug. value label: Human-readable label for dropdown display. description: Short description of what this category represents. definition is_tracked parent_id type logo relationship_type: Category scope. Use entries with SUPER_CONNECTORS for the Super Connector add-member dropdown. order is_deleted: When true, exclude from dropdown options. meta created_at category_features

IMPORTANT: If the response contains more than one record, always present the options to the user and ask them to choose before taking any follow-up action. Do not act on all results automatically.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, but the description adds substantial non-structured behavior: filter semantics for relationship_type/is_deleted, the id-as-value / label-as-display mapping, and a strong interaction rule that multiple results must be presented to the user for selection before any follow-up action. This goes well beyond the annotation's 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.

Conciseness3/5

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

Purpose is front-loaded and useful, but the description then enumerates the full return field list (id, name, value, label, description, definition, is_tracked, parent_id, type, logo, relationship_type, order, is_deleted, meta, created_at, category_features) even though an output schema exists. That enumeration is redundant and inflates length, though the surrounding usage guidance 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 no-param, output-schema-backed read tool with rich annotations, the description is largely complete and adds filtering and interaction guidance. The only gap is that it duplicates return-field documentation already covered by the output schema, slightly diluting rather than completing the definition.

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

Parameters4/5

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

Zero input parameters, so the baseline of 4 applies per the rubric. The description instead documents how returned fields are consumed (id as option value, label for display), which compensates for the empty input schema but is not strictly required.

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 ('List all categories configured in the current workspace') and immediately distinguishes itself from similar-sounding siblings like get_account_categories and list_tags by scoping the resource to workspace categories. An agent can identify the tool's role without opening the schema.

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

Usage Guidelines5/5

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

Explicitly states when to call it (before rendering the add–Super Connector form, populating a Category dropdown), when NOT to ('Do NOT use with create_workspace_member for Super Connectors'), and a third use case (filtering FILTER_FIELD_CATEGORY in search_warm_intro_relationships). Names concrete downstream tools and the exact filter conditions.

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

intro_request_get_current_stateIntro request get current stateA
Read-only
Inspect

Get current_state for an intro request. TWO lookup modes — use exactly one, never mix fields across modes: (1) PREFERRED when intro_request_id is known: pass intro_request_id ONLY — omit target_id and requester_id. (2) Fallback when intro_request_id is unknown: pass target_id AND requester_id together — omit intro_request_id. INVALID (returns requester_id is required): intro_request_id + target_id without requester_id, or target_id alone. When intro_request_id is available, prefer search_intro_request with INTRO_REQUEST_SEARCH_FILTER_INTRO_REQUEST_ID instead.

Use when: Use only when you need current_state only (not full details) and intro_request_id is unavailable (use target_id + requester_id), OR when intro_request_id is known pass intro_request_id alone. Do NOT call with intro_request_id and target_id together. If intro_request_id is known and you need full details or state, prefer search_intro_request over this tool.

Behavior: read_only

workspace_id / user_id are injected from request headers.

Prerequisites (check before calling this tool): [REQUIRED] Lookup parameters must match one valid mode — mixed partial keys cause INVALID_ARGUMENT. Verify: Mode A: intro_request_id only. Mode B: target_id + requester_id (both required). Invalid: intro_request_id + target_id without requester_id. Invalid: target_id without requester_id. When intro_request_id is known, use search_intro_request instead.

NameRequiredDescriptionDefault
target_idNo
requester_idNo
intro_request_idNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover read-only, idempotency, and destructive/open-world flags, so the 'Behavior: read_only' line is redundant. What the description does add beyond structured data is that workspace_id/user_id are injected from request headers and that mixing partial keys returns INVALID_ARGUMENT / 'requester_id is required' — genuinely useful error and context disclosure.

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 same mode rules are stated three times — in the opening 'TWO lookup modes' block, again under 'Use when', and again under 'Prerequisites (check before calling this tool)'. The redundancy bloats the definition well past what is needed and buries the routing rule in repetition.

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

Completeness5/5

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

An output schema exists, so return values need not be described, and the otherwise-undocumented parameters are fully explained. For a 3-param, zero-required lookup tool, everything needed to call it correctly and to handle the invalid-input case is present.

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 description coverage is 0%, so the description carries the full burden, and it does: it defines the two valid key combinations, marks each mode's required fields, and enumerates the invalid partial-key shapes. This is far more than the bare anyOf string 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 first sentence names a specific verb and resource ('Get current_state for an intro request'), and the description explicitly distinguishes this from the sibling search_intro_request for full details. An agent can tell what this tool returns and when a sibling is the better pick without opening either schema.

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

Usage Guidelines5/5

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

It spells out two mutually exclusive lookup modes (intro_request_id only, or target_id + requester_id), names the invalid combinations, and routes the agent to search_intro_request when intro_request_id is known. This is explicit when/when-not/alternative guidance rather than implied usage.

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

intro_request_get_state_machine_transitionsIntro request get state machine transitionsA
Read-only
Inspect

Return the complete intro request state machine transition graph. Each row is a directed edge: source_state → target_state, plus the event that triggers the move, which actor may fire it (ADMIN, REQUESTER, SYSTEM, REFERRER), action metadata, and event_label (human-readable). No input — returns the full graph in one call. To find valid next moves for a specific request: call intro_request_get_current_state first, then filter transitions where source_state equals that current_state and allowed_actor matches the caller's role.

Use when: Use to understand the intro request lifecycle — which states exist and which events move from one state to another (e.g. DRAFT → INTRO_REQUESTED via INTRO_REQUESTED_EVENT, DRAFT → DISCARD_DRAFT via DISCARD_DRAFT_EVENT). Call before intro_request_send_state_change_event whenever you are unsure what transitions are legal from the request's current state. Pair with intro_request_get_current_state: current_state tells you where the request is; this tool tells you where it can go next.

Behavior: read_only

workspace_id / user_id are injected from request headers.

Next steps (after this tool succeeds): [optional] [SUGGESTION] → call intro_request_send_state_change_event: After filtering edges from the request's current_state, fire the chosen event via intro_request_send_state_change_event.

Returns transitions[] with fields: source_state: From-state — the intro request must be in this state for the transition to be valid. Match against current_state from intro_request_get_current_state. target_state: To-state — where the intro request lands after the event succeeds. event: Event enum to pass to intro_request_send_state_change_event to trigger this edge. action: Internal action identifier for this transition (informational). allowed_actor: Role allowed to fire this event. Only suggest transitions the current user's role can trigger. event_label: Human-readable label for this transition — use when presenting next-step options to the user.

IMPORTANT: If the response contains more than one record, always present the options to the user and ask them to choose before taking any follow-up action. Do not act on all results automatically.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful context beyond annotations: 'No input — returns the full graph in one call,' the header injection note (workspace_id/user_id), the IMPORTANT rule to present multiple options rather than auto-acting, and actor-role constraints. The actor/auth detail and multi-record caution are real behavioral value.

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

Conciseness4/5

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

Well-structured with front-loaded purpose and clear labeled sections (Use when, Behavior, Next steps, Returns). It is somewhat long and repeats the current_state pairing twice, and the per-field 'Returns' detail partially duplicates the output schema, but nothing is misleading and the sections are skimmable.

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 read-only, zero-param tool with an existing output schema, the description is more than sufficient: it explains the edge semantics, the actor model, the follow-up flow, and the guardrail on multiple results. Nothing an agent needs to invoke or reason about this tool is missing.

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

Parameters4/5

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

This is a zero-parameter tool, so the baseline is 4. The description correctly states 'No input — returns the full graph in one call,' which matches the empty schema and removes any ambiguity about required arguments.

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: 'Return the complete intro request state machine transition graph,' and clarifies the row semantics (directed edge source_state → target_state plus event/actor). It is clearly distinguishable from the sibling referrer_request_get_state_machine_transitions and from intro_request_get_current_state by naming both the resource scope and the pairing relationship.

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

Usage Guidelines5/5

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

Explicit 'Use when:' block gives the lifecycle-understanding context and a concrete trigger ('Call before intro_request_send_state_change_event whenever you are unsure what transitions are legal'). It names alternatives and the exact sequencing: current_state first, then filter transitions by source_state and allowed_actor.

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

intro_request_send_state_change_eventIntro request send state change eventA
Destructive
Inspect

Fire a state machine event to move an intro request from its current state to a new state. Returns previous_state, current_state, and whether a transition occurred. Lookup: pass intro_request_id ONLY (preferred), OR target_id + requester_id together — never intro_request_id + target_id without requester_id. Only events valid for the request's current state will succeed — use intro_request_get_state_machine_transitions to see the full from→to graph.

Use when: Use when the user wants to advance, submit, cancel, withdraw, or discard an intro request. Workflow when the valid next step is unclear: (1) intro_request_get_current_state → (2) intro_request_get_state_machine_transitions → filter edges where source_state equals current_state and allowed_actor matches the caller → (3) pick the matching event → (4) call this tool. Do not guess events — invalid events are rejected.

Behavior: destructive

workspace_id / user_id are injected from request headers.

Prerequisites (check before calling this tool): [REQUIRED] Know the intro request's current state before firing an event. Verify: When intro_request_id is known, use search_intro_request with INTRO_REQUEST_SEARCH_FILTER_INTRO_REQUEST_ID + EQUALS. If using intro_request_get_current_state: pass intro_request_id ALONE — do not also pass target_id. Alternative lookup: target_id + requester_id together with no intro_request_id. Never pass intro_request_id + target_id without requester_id — the API returns INVALID_ARGUMENT. [REQUIRED] Confirm the event is a valid edge from the current state. Verify: Call intro_request_get_state_machine_transitions and find a transition where source_state == current_state, allowed_actor matches the user's role, and target_state matches the intended outcome. Use event_label to explain options to the user.

NameRequiredDescriptionDefault
eventNo
target_idNo
event_metaNoOptional key-value metadata for the event (e.g. cancellation reason).
requester_idNo
intro_request_idNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=false, and the description reinforces rather than contradicts that ('Behavior: destructive'). Beyond annotations it adds genuine value: the returned fields (previous_state, current_state, transition occurred), rejection of invalid events, and that workspace_id/user_id are injected from headers. Only minor repetition of the annotation's destructive flag keeps it from a 5.

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

Conciseness3/5

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

The content is front-loaded and header-organized, but the lookup constraint is stated three times (the Lookup paragraph, the first prerequisite's Verify line, and again in that Verify wording), and the numbered workflow duplicates the prerequisites section. Every sentence is informative, but the redundancy costs it conciseness.

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

Completeness5/5

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

For a destructive, non-idempotent state-machine tool with five loosely-typed parameters, the description covers prerequisites, valid-edge confirmation via intro_request_get_state_machine_transitions, actor matching, and fallback lookup. An output schema exists, and the description still summarizes the return shape, so nothing an agent needs to invoke it correctly is missing.

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

Parameters4/5

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

Schema description coverage is only 20%, so the description must carry the load, and it does for the identity parameters: intro_request_id alone is preferred, or target_id + requester_id together, never intro_request_id + target_id without requester_id. The event parameter is only pointed at intro_request_get_state_machine_transitions rather than explained, so event value semantics remain schema-dependent.

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 framing ('Fire a state machine event to move an intro request from its current state to a new state') and immediately distinguishes itself from the sibling read tools by describing the transition semantics. An agent can tell it apart from intro_request_get_current_state and intro_request_get_state_machine_transitions without opening any schema.

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

Usage Guidelines5/5

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

It explicitly lists the situations ('advance, submit, cancel, withdraw, or discard an intro request'), provides a numbered workflow for the ambiguous case, and warns 'Do not guess events — invalid events are rejected.' It also names the alternative lookup paths and the exact invalid argument combination to avoid.

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

list_filesList filesA
Read-onlyIdempotent
Inspect

List all uploaded files with metadata.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, non-destructive, and closed-world behavior, so the description is not burdened with safety disclosure. It adds that results cover 'all' files and include 'metadata', but does not mention pagination, sorting, or auth requirements; against rich annotations this is adequate 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?

One sentence, front-loaded with the verb and resource, no filler. Every word earns its place for a simple listing 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?

With no parameters, rich annotations, and a separate output schema, the description only needs to state the operation, which it does. It could be improved by noting pagination or ordering, but the output schema likely covers return values.

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?

There are zero parameters, and schema coverage is 100%; the description has no parameters to explain. Baseline for zero params is 4.

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

Purpose4/5

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

States a specific verb (List) and resource (uploaded files), and adds the scope 'all' plus mention of metadata. It is clear what the tool does, though it does not explicitly distinguish itself from siblings like read_file or file_manager.

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 when-to-use guidance, no prerequisites, and no alternatives named. The agent must infer from the phrase 'List all uploaded files' that this is the listing tool, with no help on when read_file or file_manager would be preferred.

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

list_linkedin_engagement_activitiesList linkedin engagement activitiesA
Read-onlyIdempotent
Inspect

List stored LinkedIn engagement for a tracked person in a date range. Requires exactly one of keycloak_user_id OR linkedin_handle, plus start_date and end_date (yyyy-MM-dd). Returns a slim summary per activity: comment text (if any), post author's LinkedIn handle, when it happened, and interaction type. Read-only — does not scrape LinkedIn.

Use when: Use when a trigger or user asks what LinkedIn posts someone commented on or reacted to in a date range. Prefer linkedin_handle when known. Reads stored history only.

Behavior: read_only, idempotent

Internal fields — available for follow-up tool calls but do NOT display to the user: total_count, page, page_size, keycloak_user_id

Returns activities[] with fields: comment_text: Comment text when the activity is a comment; empty for reactions/likes. post_author_linkedin_handle: LinkedIn vanity handle of the person whose post was engaged with. activity_at: When the comment or reaction occurred. interaction_type: Type of engagement, e.g. comment or reaction.

IMPORTANT: If the response contains more than one record, always present the options to the user and ask them to choose before taking any follow-up action. Do not act on all results automatically.

NameRequiredDescriptionDefault
end_dateNo
start_dateNo
linkedin_handleNo
keycloak_user_idNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive/openWorld=false, but the description adds genuine context: 'does not scrape LinkedIn' (reads cached history), the internal-fields-do-not-display warning, and the multi-record disambiguation rule. These are non-obvious operational constraints that the annotations do not convey.

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

Conciseness3/5

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

Purpose is front-loaded and header-style sections help scanning, but there is redundancy: 'Read-only — does not scrape LinkedIn' overlaps the 'Behavior: read_only, idempotent' line and the readOnlyHint annotation, and the 'Returns activities[] with fields' block restates an output schema that already exists.

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-param read tool with an output schema, the description covers purpose, invocation constraints, param formats, hidden internal fields, and multi-result handling. It is essentially complete; only pagination semantics (beyond listing page/page_size as internal) and row-count expectations are left implicit.

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 description coverage is 0%, so the description carries the full burden and does so: it specifies the mutual-exclusivity constraint (exactly one of keycloak_user_id OR linkedin_handle), names the required start_date/end_date, and gives the yyyy-MM-dd format. All four parameters are meaningfully documented where the schema is silent.

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

Purpose5/5

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

States a specific verb and resource (list stored LinkedIn engagement for a tracked person) with explicit scope (date range, stored history). It cleanly distinguishes itself from siblings like get_person_by_linkedin_handle and search_people_in_companies, which fetch identities or search people rather than engagement history.

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

Usage Guidelines4/5

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

Provides an explicit 'Use when' clause tying the tool to a user/trigger asking about commented-on or reacted-to posts, plus a parameter preference ('Prefer linkedin_handle when known'). It lacks a when-not/alternative comparison against a sibling, so it stops short of a 5.

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

list_tagsList tagsA
Read-only
Inspect

List the customer-defined tags available in this workspace for a given entity type, optionally narrowed to a name substring.

Use when: Use before attaching or filtering by tags, to discover which tags exist and their ids.

Behavior: read_only

workspace_id / user_id are injected from request headers.

Returns tags[] with fields: id name entity_type

IMPORTANT: If the response contains more than one record, always present the options to the user and ask them to choose before taking any follow-up action. Do not act on all results automatically.

NameRequiredDescriptionDefault
entity_typeNo
search_textNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds real value beyond them: headers inject workspace_id/user_id, and it introduces a non-obvious multi-record rule requiring the agent to present choices and await user selection before acting.

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

Conciseness4/5

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

Front-loaded purpose followed by labeled sections (Use when / Behavior / Returns / IMPORTANT). Slightly verbose – the Returns block restates fields already present in the output schema – but structurally clean and easy to scan.

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 an existing output schema, return values need not be explained; the description still covers purpose, usage, injected auth context, and a critical interaction constraint. Adequate and mostly complete, with only the entity_type value space left undefined.

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 0%, so the description must compensate. It maps search_text to a 'name substring' narrowing, which is helpful, but entity_type is only described as 'a given entity type' with no valid values, format, or default guidance for the two 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?

Specific verb (List) plus resource (customer-defined tags) plus scope (this workspace, given entity type, optional name substring). It cleanly distinguishes itself from siblings like create_tag, get_entity_tags, and assign_tags_by_name without opening any schema.

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

Usage Guidelines4/5

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

Explicit when-to-use: discover which tags exist and their ids before attaching or filtering by tags. Clear context, but no explicit when-not or named alternatives (e.g., get_entity_tags for read on a specific entity).

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

listTriggerTemplatesList trigger templatesA
Read-only
Inspect

List admin-managed trigger templates for the workspace (master + tenant). Returns id, name, description, instructions, enabled, trigger_kind (SCHEDULED|WEBHOOK), and metadata (including supported_events for WEBHOOK). Use a template's id as createWorkflowTrigger.template_id — never invent ids or event slugs. WEBHOOK templates are included only when the caller is OWNER, ADMIN, or SUPER_CONNECTOR_ADMIN in the workspace; other callers receive SCHEDULED templates only.

Use when: Use when the user wants to browse or pick an admin template to create from, or when there is no workflow_trigger_template_context seed in the conversation. Call before createWorkflowTrigger so you can copy template_id, trigger_kind, and metadata.supported_events / metadata.preview verbatim. Prefer this over inventing WEBHOOK event slugs. If WEBHOOK templates are missing from the response, the caller lacks OWNER/ADMIN/SUPER_CONNECTOR_ADMIN — do not invent them. Not a substitute for listWorkflowTriggers (that lists live activations / catalog rows).

Behavior: read_only

workspace_id / user_id are injected from request headers.

Returns templates[] with fields: id workspace_id name description instructions enabled created_at updated_at created_by_user_id trigger_kind: SCHEDULED or WEBHOOK. Passed through to createWorkflowTrigger when this template is used. metadata: Same shape as catalog metadata. Example: {"preview":{"slack":{"text":"..."},"email":{"subject":"...","html_body":"..."}},"supported_events":[{"integration_name":"hubspot","subscribed_events":["HUBSPOT_CONTACT_CREATED_TRIGGER"]}]}. WEBHOOK templates require supported_events.

IMPORTANT: If the response contains more than one record, always present the options to the user and ask them to choose before taking any follow-up action. Do not act on all results automatically.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare the safe read profile, but the description adds substantial context beyond them: the OWNER/ADMIN/SUPER_CONNECTOR_ADMIN gate that controls whether WEBHOOK templates appear, the failure inference when they are absent, the fact that workspace_id/user_id are header-injected, and the instruction to surface multiple results to the user rather than act. This is far more than the annotations convey.

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

Conciseness4/5

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

Well front-loaded with clear 'Use when' and 'Behavior' sections, and the IMPORTANT caveat is called out. It loses a point for redundancy: the returned fields are enumerated in prose at the top and then listed again with descriptions, which is duplicated content.

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 an output schema already existing, the description covers everything an agent needs: permission gating, what to do when WEBHOOK templates are missing, what to copy before calling createWorkflowTrigger, and the multi-result handling rule. No gaps for a zero-param read tool.

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

Parameters4/5

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

The tool takes zero parameters, so the baseline is 4. The description instead documents the semantics of the returned fields (template_id to copy verbatim, trigger_kind passed through to createWorkflowTrigger, metadata.supported_events required for WEBHOOK), adding downstream meaning, though that overlaps with the output schema.

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

Purpose5/5

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

States a specific verb and resource ('List admin-managed trigger templates for the workspace') and immediately names what it returns (id, name, trigger_kind, metadata). It explicitly distinguishes itself from the sibling listWorkflowTriggers ('that lists live activations / catalog rows') and from createWorkflowTrigger, so an agent can route without opening a schema.

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

Usage Guidelines5/5

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

A dedicated 'Use when' block gives the trigger conditions (browsing/picking a template, or missing a workflow_trigger_template_context seed), the sequencing ('Call before createWorkflowTrigger'), the preference rule ('Prefer this over inventing WEBHOOK event slugs'), and the exclusion ('Not a substitute for listWorkflowTriggers'). Both when-to-use and when-not-to-use are spelled out.

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

listWorkflowTriggersList workflow triggersA
Read-only
Inspect

List a recipient's workflow triggers (catalog-based and agent-created), optionally filtered by lifecycle status. Returns id, catalog_id, name, description, prompt, schedule, and status.

Use when: Use before creating a new trigger to avoid duplicates, or when the user refers to 'that reminder'/'my reminders' — match on name/description here, then update_workflow_trigger with trigger_id set to the row's id (config UUID). Empty id means an unactivated catalog template — activate via create_workflow_trigger with that catalog_id, not update.

Behavior: read_only

workspace_id / user_id are injected from request headers.

Returns triggers[] with fields: name description enabled last_run_at last_run_status status prompt source id allowed_channels selected_channels cron recurring adhoc config_status plan channel_metadata agent_thread_id editable metadata test_mode test_cron test_lead_minutes test_recipients scope created_by created_by_user_name owner_user_id owner_user_name activation_mode principal_type catalog_id audience_type is_template audience_filter trigger_kind

IMPORTANT: If the response contains more than one record, always present the options to the user and ask them to choose before taking any follow-up action. Do not act on all results automatically.

NameRequiredDescriptionDefault
statusNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so 'Behavior: read_only' is redundant. However the description adds real behavioral context the annotations do not: the empty-id-means-unactivated-template semantics, the config-UUID interpretation, and the IMPORTANT rule to present options and not auto-act when multiple records return.

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?

Well front-loaded with Use when/Behavior headers, but the tool has an output schema, so the long enumerated dump of ~30 return fields (name, description, enabled, last_run_at, ...) is pure redundancy and bloats the definition without adding call-time value.

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

Completeness4/5

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

Annotations and an output schema carry the safety profile and return shape, and the description covers usage and follow-up routing thoroughly. The only remaining gap is the undefined set of acceptable status values, which is minor for a filter with a null default.

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 0% and the single 'status' param has no description or enum. The description partially compensates by specifying that 'status' filters on lifecycle status, but it never enumerates the allowed status values, so the agent still cannot pick a valid value from the definition.

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 and scope: 'List a recipient's workflow triggers (catalog-based and agent-created)'. Combined with the sibling routing in the 'Use when' block (update_workflow_trigger, create_workflow_trigger), an agent can distinguish this list tool from its write siblings without opening any schema.

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

Usage Guidelines5/5

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

Explicit when-to-use ('before creating a new trigger to avoid duplicates, or when the user refers to that reminder'), plus named alternatives with selecting conditions: route to update_workflow_trigger with the row's id, and to create_workflow_trigger when id is empty. This is exactly the when/when-not/alternative guidance the dimension asks for.

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

merge_workspace_membersMerge workspace membersA
Destructive
Inspect

Merge two workspace members who are the same person (e.g. a Super Connector added twice): everything the retired member has — relationships, connections, categories, tags, roles — moves onto the keeper, and the retired member is removed. Irreversible from chat. ALWAYS call first with dry_run=true: show the user the side-by-side comparison (both people's name, email, LinkedIn, roles and data counts) and every warning in plain language, and ask them to confirm which person to keep. Only after the user explicitly agrees, call again with the same keeper_user_id and retired_user_id, dry_run=false and confirm=true. Never merge on your own initiative, never skip the dry run, and never set confirm=true without the user's explicit agreement. If the outcome is MERGE_OUTCOME_REFUSED, explain refusal_reason plainly and do not retry. USER-FACING COPY: talk about people by name, never mention user ids, tool names or enum strings.

Use when: Use only when an admin asks to merge, combine or de-duplicate two members of this workspace. Get both user ids from search_workspace_members first (by name, email or LinkedIn). The keeper is the member to keep (usually the one with more data or a login); the retired member must not have a login.

Behavior: destructive

workspace_id / user_id are injected from request headers.

Prerequisites (check before calling this tool): [REQUIRED] Both keeper_user_id and retired_user_id are known and belong to members of this workspace. Verify: Call search_workspace_members and take user_id from the two matching rows. Never guess ids. [REQUIRED] A dry run was shown to the user and they explicitly agreed to the merge. Verify: Only call with dry_run=false after a dry_run=true call in this conversation and an explicit 'yes' from the user.

Also returns pagination info (user_id, member_id, name, email, linkedin_id, role, data_counts, has_login).

NameRequiredDescriptionDefault
confirmNo
dry_runNo
keeper_user_idNo
retired_user_idNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the annotations (destructiveHint=true, idempotentHint=false) the description discloses that the action is irreversible from chat, that the retired member is removed, the dry_run-then-confirm protocol, and the MERGE_OUTCOME_REFUSED handling with refusal_reason. It also sets an output-copy contract (talk about people by name, hide ids/enum strings), which is behavioral context no annotation carries.

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

Conciseness4/5

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

Front-loaded with purpose and consequence before the procedural steps, and organized into clear blocks (workflow, Use when, Behavior, Prerequisites). It is long and the safety rules are restated in both prose and the prerequisites block, but for an irreversible merge the redundancy is largely load-bearing; only mild trimming is possible.

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?

Complete for a destructive, irreversible operation: it covers the two-phase call flow, both id prerequisites with verification, the confirmation gate, refusal outcomes, and the user-facing copy rules. An output schema exists and the description still names the returned fields, so nothing an agent needs to call this safely is missing.

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

Parameters5/5

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

Schema coverage is 0%, so the description must carry all four parameters, and it does: it defines keeper_user_id semantics ('the member to keep, usually the one with more data or a login') versus retired_user_id ('must not have a login'), and specifies the dry_run and confirm values and the required pairing across the two calls. It fully compensates for the undocumented schema.

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

Purpose5/5

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

States a specific verb+resource ('Merge two workspace members who are the same person') and immediately scopes it with the real-world case ('e.g. a Super Connector added twice'). It is clearly distinguishable from siblings like create_workspace_member, update_workspace_member and search_workspace_members, and describes the exact data consequence (relationships, connections, categories, tags, roles move to the keeper).

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

Usage Guidelines5/5

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

Gives explicit when-to-use ('only when an admin asks to merge, combine or de-duplicate two members'), when-not ('never merge on your own initiative'), and the alternative/upstream tool to use first ('Get both user ids from search_workspace_members'). A numbered prerequisite block repeats the conditions with verification steps, so the agent knows exactly how to reach a callable state.

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

preview_people_queryPreview people queryA
Read-onlyIdempotent
Inspect

Preview how many companies and people match a SearchPeopleRequest at each funnel stage (companies -> current employees -> +seniority -> +title keywords -> +person location), without running the final search. Same anchor/filter fields as search_people_by_location_and_seniority. Use this to show the user what each filter is doing before committing to the final query, especially after adding or loosening a filter.

Use when: Use whenever the user is refining a search interactively — after every new filter (region, seniority, title keywords, company set) — to show the funnel counts and let them see which parameter is truncating the result set. Do not use as a substitute for the final search_people_by_location_and_seniority call.

Behavior: read_only, idempotent

Returns stages[] with fields: label company_count people_count by_seniority top_locations top_titles basis sampled_rows

IMPORTANT: If the response contains more than one record, always present the options to the user and ask them to choose before taking any follow-up action. Do not act on all results automatically.

NameRequiredDescriptionDefault
pageNo
regionNo
previewNo
last_nameNo
page_sizeNo
seniorityNo
first_nameNo
name_anchorNo
company_nameNo
country_codeNoUS
workspace_idNo
title_personaNo
person_regionsNo
title_keywordsNo
company_social_idNo
per_company_limitNo
company_social_idsNo
exclude_social_idsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/idempotentHint/destructiveHint, so the repeated 'read_only, idempotent' adds nothing; however the description adds real behavioral context with the funnel progression stages and the rule about presenting multiple records to the user before acting. It does not cover pagination/limit behavior, so not a 5.

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

Conciseness4/5

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

Front-loaded with the core action, then cleanly segmented into Use when / Behavior / Returns / IMPORTANT. Slightly long, and the Returns field enumeration largely duplicates the output schema rather than earning 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?

An output schema exists, so the description need not explain return values (though it does), and annotations carry the safety profile. Intent, usage, funnel semantics and multi-result handling are all covered; only the undocumented non-filter parameters leave a gap.

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?

18 parameters at 0% schema description coverage, and the description compensates only partially: it names filter dimensions (region, seniority, title keywords, company set) and points to an equivalent sibling schema, but page, page_size, preview, per_company_limit, name_anchor, workspace_id and exclusion params are never explained. Most parameter semantics remain undocumented in both schema and 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?

States a specific verb and resource ('preview how many companies and people match a SearchPeopleRequest at each funnel stage') and explicitly contrasts it with the final search. The funnel-stage enumeration makes the tool's function unmistakable and distinguishes it from sibling search_people_by_location_and_seniority.

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

Usage Guidelines5/5

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

Has an explicit 'Use when' clause naming the interactive-refinement context and an explicit exclusion ('Do not use as a substitute for the final search_people_by_location_and_seniority call'). The alternative and the condition that selects it are both named.

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

query_contentQuery contentA
Read-only
Inspect

Query agent content by slug, natural language query, family (SKILL, MEMORY), tags, or scope. Use for on-demand skill retrieval or finding memories.

Use when: Use when the agent needs to load a specific skill by slug or search for content not already injected in the runtime bundle.

Behavior: read_only

workspace_id / user_id are injected from request headers.

Returns results[] with fields: content score match_reason

IMPORTANT: If the response contains more than one record, always present the options to the user and ask them to choose before taking any follow-up action. Do not act on all results automatically.

NameRequiredDescriptionDefault
slugNo
tagsNo
limitNo
queryNo
scopeNo
familyNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description reinforces with 'Behavior: read_only'. Beyond the annotations it adds genuinely new context: workspace_id/user_id are injected from request headers (so the agent needn't supply them) and a behavioral rule that multi-record responses must be presented to the user before follow-up action. The idempotentHint=false is not discussed, but the added operational guidance is substantial.

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

Conciseness4/5

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

Front-loaded with the purpose sentence, then cleanly sectioned into Use when / Behavior / Returns / IMPORTANT. Every block carries usable information. It is slightly verbose in restating read-only and listing return fields, but nothing is wasted in a way that hurts selection.

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 lookup tool with an output schema (so return detail is optional) and annotations covering safety, the description supplies purpose, usage trigger, header-injection behavior, and the multi-result handling caveat. It omits how the six filter parameters combine (AND/OR, which take precedence) and pagination/limit behavior, which are the main remaining gaps.

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

Parameters3/5

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

Schema description coverage is 0%, so the description carries the full burden. It names most parameters (slug, query, family, tags, scope) and gives concrete family values (SKILL, MEMORY), which is real added meaning. It never mentions 'limit' and gives no syntax or format guidance for slug/query (which are typed as open objects in the schema), leaving the semantics partially covered.

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

Purpose4/5

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

States a specific verb (Query) and resource (agent content) plus the filter facets used to locate it (slug, natural-language query, family, tags, scope). It names the two content families SKILL and MEMORY, making the scope concrete. It does not, however, differentiate itself from the memory siblings (get_scoped_memory, upsert_scoped_memory), which an agent would need to route correctly.

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 'Use when' clause gives real context: loading a skill by slug on demand, or searching for content not already injected in the runtime bundle. That is a clear usage trigger, not a tautology. It stops short of naming an alternative tool or an explicit when-not-to-use condition, so it falls just short of a 5.

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

read_fileRead fileB
Read-onlyIdempotent
Inspect

Read an uploaded file's contents by name.

NameRequiredDescriptionDefault
nameYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered structurally. The description's only added context is the 'uploaded file' scope and name-based lookup; it says nothing about error behavior, size limits, or encoding.

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, front-loaded with the verb and resource, with zero filler. Nothing in it is redundant or padded.

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?

A simple one-parameter read tool with an output schema and rich annotations needs little description, so this is close to sufficient. Still missing is how to obtain a valid file name (link to list_files) and any note on lookup failure 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 description coverage is 0% for the single 'name' parameter. The description's 'by name' only faintly clarifies that the argument is a filename, but not whether it includes a path or extension, nor whether it must be unique or case-sensitive.

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

Purpose4/5

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

States a specific verb+resource with scope: 'Read an uploaded file's contents by name.' An agent understands this retrieves file contents rather than metadata or a listing. It does not, however, explicitly distinguish itself from the sibling list_files, which an agent must infer from 'read' vs 'list'.

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

Usage Guidelines2/5

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

No when-to-use guidance, no exclusions, and no mention of the obvious alternative list_files for discovering files first. The agent is left to infer that a file must be uploaded and its name already known.

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

referrer_request_get_current_stateReferrer request get current stateA
Read-only
Inspect

Get the current state of a referrer request by target_id with optional requester_id or referrer_id (workspace member with SUPER_CONNECTOR role) filters. Returns ReferrerRequestState and whether a matching request was found.

Use when: Use before SendStateChangeEvent when you need to check current state and do not have referrer_request_id. Prefer GetReferrerRequestForReferrerById when you have the referrer_request_id.

Behavior: read_only

workspace_id / user_id are injected from request headers.

NameRequiredDescriptionDefault
target_idNo
referrer_idNo
requester_idNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already carry readOnlyHint=true, and the description restates 'read_only' (redundant), but it adds genuinely new context: that referrer_id must be a workspace member with the SUPER_CONNECTOR role, that the id filters are optional, and that workspace_id/user_id come from request headers rather than parameters. That header-injection note is valuable since it explains why those fields are absent from 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?

Front-loaded summary sentence followed by clearly labeled 'Use when' and 'Behavior' blocks. Every sentence carries routing or constraint information with 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?

An output schema exists, so the return values need not be spelled out, and the description sensibly only names the returned type. Usage, routing, and auth context are covered; the only shortfall is the undefined target_id 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 0%, so the description must compensate. It clarifies that referrer_id/requester_id are optional filters and that referrer_id requires the SUPER_CONNECTOR role, but it never defines what a target_id actually is, leaving the primary keying parameter ambiguous.

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 (Get) plus resource (current state of a referrer request) and the keying parameter (target_id), and further narrows it against siblings via 'Prefer GetReferrerRequestForReferrerById'. An agent can distinguish it from the intro_request and send_state_change_event siblings 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 Guidelines5/5

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

Explicit when-to-use ('before SendStateChangeEvent when you need to check current state and do not have referrer_request_id') and names the preferred alternative plus the condition that selects it. Nothing is left to inference.

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

referrer_request_get_state_machine_transitionsReferrer request get state machine transitionsA
Read-only
Inspect

Return the full state machine transition table for referrer requests. Each entry shows source state, target state, allowed actor, triggering event, and a human-readable label.

Use when: Call to understand all valid transitions before firing SendStateChangeEvent on a referrer request. No input parameters required.

Behavior: read_only

workspace_id / user_id are injected from request headers.

Returns transitions[] with fields: source_state target_state event action allowed_actor event_label

IMPORTANT: If the response contains more than one record, always present the options to the user and ask them to choose before taking any follow-up action. Do not act on all results automatically.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered, and 'Behavior: read_only' merely restates it. The description does add value beyond annotations by disclosing that workspace_id/user_id are injected from request headers (no caller-supplied scoping) and by giving a multi-record handling rule for the caller.

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

Conciseness4/5

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

Front-loaded with the purpose, then cleanly sectioned into Use when / Behavior / Returns / IMPORTANT. The only waste is the six-field Returns list, which duplicates the existing output schema, and the 'Behavior: read_only' line that repeats the annotation.

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 zero-parameter read-only lookup with an output schema, the description covers everything needed to select and call it correctly. The verbose Returns list is redundant given the output schema, and the trailing IMPORTANT multi-record/user-choice instruction reads like generic boilerplate rather than a trait of a fixed transition table, but it does not mislead.

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

Parameters4/5

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

Zero parameters, so the baseline is 4. The description confirms 'No input parameters required,' which matches the empty schema, though it adds nothing beyond that confirmation and the header-injection note.

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: 'Return the full state machine transition table for referrer requests,' and enumerates exactly what each entry contains (source state, target state, actor, event, label). This is unambiguous against siblings like referrer_request_get_current_state (single state) and referrer_request_send_state_change_event (mutation).

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

Usage Guidelines4/5

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

Explicit when-to-use: 'Call to understand all valid transitions before firing SendStateChangeEvent on a referrer request,' naming the downstream sibling tool that consumes this data. It also notes no input parameters are required. It stops short of stating when *not* to call it or how it differs from get_current_state, so it's clear context without exclusions.

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

referrer_request_send_state_change_eventReferrer request send state change eventA
Destructive
Inspect

Transition a referrer request to a new state by firing a state machine event. A referrer request is the per-connector leg of a warm intro request for one workspace member with SUPER_CONNECTOR role — e.g. queuing an intro ask, or recording acceptance or rejection.

Use when: Use when you need to advance a referrer request. Call GetCurrentState first to confirm current state, then GetStateMachineTransitions if unsure which event is valid.

Behavior: destructive

workspace_id / user_id are injected from request headers.

NameRequiredDescriptionDefault
eventNo
referrer_idNo
intro_request_idNo
referrer_request_idNo
referrer_request_state_metaNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, so the 'Behavior: destructive' line adds nothing on its own. The description does add value beyond structured fields: it discloses the state-machine firing semantics, requires a state pre-check, and states that workspace_id/user_id are injected from request headers, which is auth/context information an agent cannot get from the schema or annotations.

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

Conciseness4/5

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

Front-loaded purpose, then labelled 'Use when:' and 'Behavior:' sections that make scanning easy, with no filler sentences. Slightly long for the information conveyed, but every paragraph carries distinct 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?

An output schema exists, so return values need not be described, and annotations cover the safety profile, freeing the description to cover domain and workflow — which it does. The remaining gap is parameter disambiguation for the five optional identifiers, which is a real omission for a 5-param tool.

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 0% across five parameters, so the description carries the full burden and largely fails: the three identifier parameters (referrer_id, referrer_request_id, intro_request_id) are indistinguishable and referrer_request_state_meta is never explained. The one genuinely useful hint — consult GetStateMachineTransitions to learn valid 'event' values — only partially compensates for the single most important 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 opening sentence names a specific verb and resource — 'Transition a referrer request to a new state by firing a state machine event' — and the second sentence defines the domain object (per-connector leg of a warm intro request for a SUPER_CONNECTOR member), which distinguishes it from the sibling intro_request_send_state_change_event. An agent can tell what this does without opening a schema.

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

Usage Guidelines4/5

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

Explicit 'Use when: Use when you need to advance a referrer request' plus a concrete prerequisite workflow ('Call GetCurrentState first... then GetStateMachineTransitions if unsure which event is valid') that names the exact sibling tools to consult. It stops short of stating when NOT to use this tool (e.g. versus the intro_request equivalent), so it is clear context rather than full exclusion guidance.

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

remove_entity_tagsRemove entity tagsA
Destructive
Inspect

Remove tags from one or more entities. Only the listed tag/entity pairs are detached; tags not listed are kept. Tags are addressed by id (see ListTags).

Use when: Use to undo or clean up tag assignments, including bulk removal across many entities.

Behavior: destructive

workspace_id / user_id are injected from request headers.

Returns entities[] with fields:

entity_id tags Returns created_tags[] with fields: id name entity_type

IMPORTANT: If the response contains more than one record, always present the options to the user and ask them to choose before taking any follow-up action. Do not act on all results automatically.
NameRequiredDescriptionDefault
tag_idsNo
entity_idsNo
entity_typeNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=false, and the description adds real value beyond them: workspace_id/user_id are injected from headers (auth context an agent otherwise cannot infer), the partial-detach semantics, and an explicit instruction to present multi-record results to the user rather than acting automatically. 'Behavior: destructive' merely repeats the annotation.

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

Conciseness3/5

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

The Use when / Behavior / IMPORTANT blocks are well front-loaded and scannable, but the 'Returns entities[] with fields... Returns created_tags[] with fields...' block re-lists what the output schema already defines, wasting space for no added value.

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

Completeness4/5

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

For a destructive mutation the description covers the essentials: partial-detach semantics, header-injected identity, and multi-record follow-up behavior. Return values are already covered by the output schema, and the remaining gap (no entity_type value guidance) is the only real omission.

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 0% for three parameters, so the description must carry the load. It clarifies that tags are addressed by id (tag_ids) and implies pairing with entity_ids, but says nothing about the accepted entity_type values, id format, or that tag_ids/entity_ids are arrays — leaving the agent to guess at call shape.

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 (remove tags from entities) and immediately scopes the semantics: 'Only the listed tag/entity pairs are detached; tags not listed are kept.' It also names a sibling (ListTags) for the id lookup, so an agent can distinguish it from assign_tags_by_name, get_entity_tags, and create_tag.

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?

'Use when: Use to undo or clean up tag assignments, including bulk removal across many entities' gives clear context and identifies the bulk use case. It routes to list_tags for id resolution, but names no explicit exclusion or contrasting alternative (e.g., when to prefer assign_tags_by_name), so it stops short of full when-not guidance.

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

remove_roleRemove roleA
Destructive
Inspect

Set a member's complete workspace role list (full replacement). Any roles not included in the request are revoked. Use this to remove specific roles: fetch current roles via search_workspace_members, omit the role(s) to remove, and pass the remaining roles. Pass an empty role list to strip all roles while keeping the member in the workspace.

Use when: Use when an admin wants to remove one or more roles from a member, or replace the member's entire role set. ALWAYS call search_workspace_members first to get the member's current roles, then pass the new complete list without the removed role(s). To add roles without removing existing ones, use add_role instead.

Behavior: destructive

workspace_id / user_id are injected from request headers.

NameRequiredDescriptionDefault
roleNo
user_idNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, but the description adds the non-obvious consequence: omitted roles are revoked and an empty list strips all roles while keeping the member. It also discloses that workspace_id/user_id come from headers, which is real invocation context. It does not discuss permission/error behavior beyond implying an admin actor, and the 'Behavior: destructive' line merely restates the annotation.

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

Conciseness4/5

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

Well front-loaded: the replacement semantics come before the procedure. However, the 'Use when' block repeats the search_workspace_members-then-replace procedure already stated in the opening paragraph, and 'Behavior: destructive' is redundant against the annotations. Slight trimming would improve it.

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

Completeness5/5

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

For a destructive, non-idempotent mutation the description covers the risky semantics (revocation of omitted roles, empty-list behavior), the required prior lookup, and the sibling alternative. An output schema exists, so return values need not be explained, and the schema is minimal enough that nothing further is required.

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 description coverage is 0% and the schema's 'role' param is an untyped anyOf array/null, so the description carries the full burden — and it does: it defines the parameter as a complete replacement list, explains the empty-list and omission semantics, and clarifies that user_id/workspace_id are header-injected rather than user-supplied. This fully compensates for the 0% 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 names a specific verb and resource and immediately corrects the misleading tool name by explaining that this is a full-replacement setter ('Set a member's complete workspace role list'), not a single-role deletion. It distinguishes itself from the sibling add_role explicitly, so an agent can pick between them without opening either schema.

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

Usage Guidelines5/5

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

It gives an explicit prerequisite ('ALWAYS call search_workspace_members first'), a step-by-step procedure for the remove case, the add case routed to the alternative tool ('use add_role instead'), and an edge-case recipe (empty list strips all roles). When-to-use and when-to-use-something-else are both covered.

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

request_introRequest introAInspect

Create a new warm intro request in DRAFT state. DO NOT call until every required input is collected — if anything is missing, stop and ask the user to provide it (render a labeled form UI when helpful); never call with null, empty, or guessed UUIDs. REQUIRED: target_id (contact to introduce) and requester_id (who is asking — usually the current user). STRONGLY RECOMMENDED before calling: intro_request_meta.context (why the intro is needed — business reason, goal, talking points) and target_account_id when the contact belongs to a known account. OPTIONAL intro_request_meta: is_time_sensitive, recommended_sc (preferred super connectors / referrers with keycloak_user_id + order + note), opportunity_details, form_instance_id. Creating the draft does NOT submit the request — it only starts the workflow. AFTER SUCCESS (mandatory, same turn): immediately call get_draft_by_type three times (GHOSTWRITTEN_EMAIL, FORWARDABLE_EMAIL, TEXT) with intro_request_id from the response, render editable email/text UI, and present drafts to the user — do NOT ask 'Want me to pull those up?' or wait for confirmation; fetching drafts is automatic. USER-FACING: confirm creation in plain language (person names, connector name) — never read intro_request_id UUIDs, tool names, or enum state names aloud.

Use when: Use when a user wants to request a warm introduction to a target contact AND you already have target_id and requester_id. Before calling, confirm the target contact (search_contacts or relationship tools if needed), confirm requester_id (from X-User-ID context or explicit user choice), and collect intro_request_meta.context from the user ('Why do you want this intro?'). After success: save intro_request_id internally, tell the user the intro was created, then IMMEDIATELY fetch all three drafts and show the editable UI in the same response — never stop to ask whether to fetch drafts.

workspace_id / user_id are injected from request headers.

Prerequisites (check before calling this tool): [REQUIRED] target_id (contact UUID) must be confirmed before calling. Verify: If the user named a person but did not provide a UUID, search contacts or use relationship_intelligence tools to find the target, present the best match (name, title, company), and get explicit confirmation ('Is this the person you want an intro to?') before using their contact UUID as target_id. [REQUIRED] requester_id (workspace user UUID) must be known before calling. Verify: Prefer the authenticated user from request context (X-User-ID). If acting on behalf of someone else, resolve via search_workspace_members and confirm with the user before calling. [REQUIRED] intro_request_meta.context should be collected from the user before calling. Verify: Ask: 'Why do you want this introduction?' or 'What's the goal / context for this intro?' Capture a clear business reason in intro_request_meta.context. Do not invent context — if the user has not provided it, ask before calling request_intro.

Next steps (after this tool succeeds): [REQUIRED] [ACTION] → call get_draft_by_type: IMMEDIATELY after request_intro returns — same turn, no permission prompt — call get_draft_by_type for GHOSTWRITTEN_EMAIL, FORWARDABLE_EMAIL, and TEXT using intro_request_id from the response, then render editable email/text UI. Do not ask 'Want me to pull those up?' [optional] [ACTION] → call update_draft: If the user edits any draft in the UI and clicks Save, call update_draft with is_manually_edited=true and the full edited content. [REQUIRED] [ACTION] → call intro_request_send_state_change_event: After the user has reviewed (and optionally saved edits to) all drafts, submit the intro request for admin review by firing INTRO_REQUESTED_EVENT.

Also returns pagination info (context, opportunity_details, is_time_sensitive, form_instance_id, recommended_sc, meeting_status, meeting_attribution, email_enrichment_job_id, assigned_sc, routing).

NameRequiredDescriptionDefault
target_idNo
requester_idNo
target_account_idNo
intro_request_metaNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

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

Well beyond what readOnlyHint=false/destructiveHint=false/openWorldHint=false convey: it discloses draft-vs-submit semantics, header-injected workspace_id/user_id, the mandatory three get_draft_by_type follow-ups in the same turn, and user-facing output constraints (no UUIDs or enum states read aloud). Minor deduction for the closing sentence 'Also returns pagination info (context, opportunity_details, ...)' — a create call returns the created request, not pagination, so that tail mischaracterizes the response and could prime the agent to look for paging that isn't there.

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

Conciseness3/5

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

Front-loaded and sectioned, but the same guidance is delivered three times: the mandatory post-success get_draft_by_type sequence appears in the main paragraph, again in 'Use when', and again under 'Next steps'; likewise target/requester/context confirmation is stated in the body and then restated in Prerequisites. The 'render editable UI' / 'never ask Want me to pull those up?' instruction is repeated verbatim twice. Roughly a third of the text is redundant.

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

Completeness5/5

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

An output schema exists, so return values need not be spelled out, and everything an agent must know to call this correctly — required IDs, how to resolve them, what meta to gather, the draft-does-not-submit boundary, and the mandatory same-turn follow-up chain through update_draft to intro_request_send_state_change_event — is present. No blocking gap remains.

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 description coverage is 0%, so the description carries the whole burden and does so: target_id is 'contact to introduce', requester_id is 'who is asking — usually the current user', target_account_id applies 'when the contact belongs to a known account', and every nested intro_request_meta key is enumerated (context, is_time_sensitive, recommended_sc with keycloak_user_id + order + note, opportunity_details, form_instance_id). It also correctly states that workspace_id/user_id come from headers rather than the caller.

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

Purpose5/5

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

Opens with a specific verb, resource and resulting state: 'Create a new warm intro request in DRAFT state', and immediately clarifies the state boundary ('does NOT submit the request'). That single clause separates it from siblings like intro_request_send_state_change_event, update_draft and search_intro_request without opening their schemas.

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

Usage Guidelines5/5

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

There is an explicit 'Use when' with a positive condition (user wants a warm intro AND target_id and requester_id are known), a negative condition ('DO NOT call until every required input is collected'), and named alternatives for the resolution step (search_contacts, relationship_intelligence tools, search_workspace_members). The when/when-not/alternative triad is fully covered.

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

search_accounts_with_filtersSearch accounts with filtersA
Read-only
Inspect

Search and filter accounts using one or more field filters: account name (substring), LinkedIn URL, website, relationship strength, industry, country, employee size, ICP match status, CRM record ID (REFERENCE_ID_FILTER_FIELD), and external ID (EXTERNAL_ID_FILTER_FIELD). Returns full account details including domain, location, reference_id, crm_url, type, segment, and icp (Ideal Customer Profile match status). IMPORTANT — rendering: do NOT dump raw JSON or prose lists in chat. Render results in a tabular UI artifact (React/HTML table) with one row per account and columns for name, domain, website, linkedin_url, city, state, country, reference_id, crm_url (as link), type, segment, icp. Include pagination controls when page_info indicates more pages.

Use when: Use when you need to find accounts by name, CRM ID, or other attributes via filters. Use REFERENCE_ID_FILTER_FIELD when the user provides a Salesforce or HubSpot account ID (exact match on reference_id — same value returned as reference_id in results). Use EXTERNAL_ID_FILTER_FIELD for other external system IDs. Use NAME_FILTER_FIELD for name substring search. Prefer this over SearchAccounts when filters are needed. Use GetAccountsByIds only when you already have internal account UUIDs. Scoped to accounts tracked in this workspace's CRM — if the company has no account record, use search_people_in_companies instead; it needs no account to exist.

Behavior: read_only

workspace_id / user_id are injected from request headers.

Returns accounts[] with fields:

id: Unique internal UUID of the account. Use this as the identifier when referencing this account in other API calls. name: Account (company) name as stored in the platform. domain: Primary email domain of the account (e.g. 'acme.com'). Derived from the company website. linkedin_url: LinkedIn company page URL for this account (e.g. 'https://www.linkedin.com/company/acme'). Empty if not available. website: Company website URL (e.g. 'https://www.acme.com'). Empty if not available. state: State or province where the account's primary office is located. Empty if not available. city: City where the account's primary office is located. Empty if not available. country: Country where the account's primary office is located. Empty if not available. zipcode: Postal / ZIP code of the account's primary office address. Empty if not available. reference_id: CRM record ID from the connected system (e.g. Salesforce 18-char Account ID, HubSpot company ID). Queryable via REFERENCE_ID_FILTER_FIELD. Same value shown in crm_url. crm_url: Direct URL to this account's record in an external system. Empty if not available. type: Account type (e.g. 'Prospect', 'Customer', 'Partner'). Empty if not set. segment: Market segment or tier assigned to this account (e.g. 'Enterprise', 'Mid-Market', 'SMB'). Empty if not set. icp: ICP (Ideal Customer Profile) match status for this account — how well the account fits the workspace's target customer criteria. Values: 'MATCH' (Matches ICP — meets ICP criteria; prioritize for outreach), 'PRE_MATCH' (From your list — imported by CSV upload or contact/account report and taken as ICP without evaluation), 'NO_MATCH' (Outside ICP — does not meet ICP criteria), 'NO_DATA' (Not enough data — insufficient company data to evaluate against ICP; typically missing LinkedIn ID or unresolvable company), 'NO_ICP_DEFINED' (Not evaluated — workspace has not configured ICP criteria yet). Empty if not yet evaluated. Use this column to help users quickly identify best-fit accounts. category: Deprecated, use categories. The first of the account's categories (Customer first). Unspecified when the account has not been categorised. tags: Customer-defined free-form tags on this account (e.g. 'Enterprise', 'EMEA'). Independent of the account's categories. categories: The account's categories from the platform's strict vocabulary: Customer, Prospect, Open Opportunity, Closed Lost, Churned, Partner, Competitor, Other — Customer first. An account can carry several, set by a user, an account-list upload, or public research. Distinct from 'type', which is free text synced from the CRM. Empty when the account has not been categorised. Returns filter_values[] with fields: key value label count Also returns pagination info (current_page_number, page_size, total_pages, total_elements).

IMPORTANT: If the response contains more than one record, always present the options to the user and ask them to choose before taking any follow-up action. Do not act on all results automatically.
NameRequiredDescriptionDefault
filtersNoOptional list of field filters. Each entry targets one FilterField with one or more string values. Multi-value within a single field is OR-combined; multiple filter entries are AND-combined. To search by name use NAME_FILTER_FIELD (case-insensitive substring, e.g. 'Acme Corp'). Other supported fields: LINKEDIN_URL_FILTER_FIELD (LinkedIn company URL or ID, e.g. 'https://www.linkedin.com/company/acme'), WEBSITE_FILTER_FIELD (website URL or domain, e.g. 'acme.com'), STRENGTH_FILTER_FIELD (relationship strength — 'CONFIRMED', 'STRONG', 'MEDIUM', 'WEAK'), REFERENCE_ID_FILTER_FIELD (CRM record ID / reference_id — exact match, e.g. Salesforce Account ID '001xx000003DGbQAAW'), EXTERNAL_ID_FILTER_FIELD (external system ID — exact match), ICP_FILTER_FIELD (ICP / Ideal Customer Profile match status — use when the user asks about best-fit accounts, ICP scoring, or target profile. Values: 'MATCH' (Matches ICP — meets ICP criteria), 'PRE_MATCH' (From your list — externally imported and taken as ICP without evaluation; pass alongside 'MATCH' for best-fit questions), 'NO_MATCH' (Outside ICP — does not meet criteria), 'NO_DATA' (Not enough data — insufficient company data to evaluate), 'NO_ICP_DEFINED' (Not evaluated — workspace has no ICP configured yet)). Omit to return all accounts.
page_sizeNo
page_numberNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnlyHint/openWorldHint/destructiveHint, but the description adds substantive behavior beyond them: a mandatory rendering contract (tabular UI artifact with specified columns, pagination controls), and a hard rule to present multi-record results and ask the user before any follow-up action. These are operational constraints an agent could not infer from structured fields.

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

Conciseness3/5

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

Front-loaded well, with purpose, guidance, and behavior in that order. However, it is bloated by a full re-documentation of every return field (id, name, domain, category, tags, categories, filter_values, pagination) even though an output schema exists, which is redundant bulk that competes for attention with the actually valuable rendering and usage rules.

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 search tool with annotations and an output schema, the definition covers purpose, alternatives, filter semantics, rendering expectations, and pagination adequately. Its only gap is that return-field prose duplicates the output schema rather than filling a genuine hole; nothing an agent needs to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is only 33%, but the nested filter schema itself is unusually rich and the description adds real semantic value on top: OR-within-field vs AND-across-fields is restated, ICP values are enumerated with meanings, and REFERENCE_ID is tied to the returned reference_id field. Minor deduction for repeating filter-field guidance already present in the schema's own descriptions rather than adding new information.

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 ('Search and filter accounts') and immediately enumerates the filterable attributes. It explicitly contrasts itself with siblings: 'Prefer this over SearchAccounts when filters are needed. Use GetAccountsByIds only when you already have internal account UUIDs.' An agent can route correctly without opening another schema.

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

Usage Guidelines5/5

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

Provides explicit when-to-use with a dedicated 'Use when' block, field-selection rules (REFERENCE_ID vs EXTERNAL_ID vs NAME), sibling alternatives with conditions, and an out-of-scope fallback ('if the company has no account record, use search_people_in_companies instead'). This is the full when/when-not/alternatives pattern.

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

search_contactsSearch contactsA
Read-only
Inspect

Search and filter target prospect contacts using field filters: name, email, title, LinkedIn URL, company, account ID, seniority, department, persona grade, CRM record ID (REFERENCE_ID_FILTER_FIELD), external ID (EXTERNAL_ID_FILTER_FIELD), and title persona (TITLE_PERSONA_FILTER_FIELD). Returns full contact details including reference_id, profile picture, active title, and persona grade. IMPORTANT — rendering: do NOT dump raw JSON or prose lists in chat. Render results in a tabular UI artifact (React/HTML table) with one row per contact and columns for first_name, last_name, email, title, active_title, account_name, linkedin_url, persona_grade, reference_id (CRM ID). Include pagination when page_info has more pages.

Use when: Use when you need to find contacts by name, CRM ID, or other attributes. Use REFERENCE_ID_FILTER_FIELD when the user provides a Salesforce or HubSpot contact ID (exact match on reference_id). Use EXTERNAL_ID_FILTER_FIELD for other external system IDs. Use NAME_FILTER_FIELD for name search. Use ACCOUNT_ID_FILTER_FIELD for all contacts at an account (internal UUID). Use LINKEDIN_URL_FILTER_FIELD for LinkedIn profile lookup. Use TITLE_PERSONA_FILTER_FIELD with values BUYING_COMMITTEE, EXTENDED_BUYING_COMMITTEE, or LEADERSHIP to find contacts whose title matches the workspace's configured buyer personas. Scoped to tracked contacts only — if no match, fall back to search_people_in_companies before reporting no results.

Behavior: read_only

workspace_id / user_id are injected from request headers.

Returns contacts[] with fields:

id: Unique internal UUID of the contact. Use when referencing this contact in warm intro or intro request flows. first_name: Contact's first name. last_name: Contact's last name. email: [redacted] title: Contact's job title as stored in the platform. active_title: Most recently resolved job title for this contact, enriched by the Boomerang engine. account_name: Name of the company this contact works at. internal_account_id: Internal UUID of the account (company) this contact belongs to. linkedin_url: LinkedIn profile URL of the contact. profile_pic: URL of the contact's profile picture. Empty if not available. persona_grade: ICP fit grade assigned by the Boomerang engine: A (strongest fit), B, C, D (weakest fit). Empty if not yet graded. reference_id: CRM record ID from the connected system (e.g. Salesforce Contact/Lead ID, HubSpot contact ID). Queryable via REFERENCE_ID_FILTER_FIELD — exact match. Returns filter_facets[] with fields: key: The ContactFilterField enum name this facet belongs to (e.g. 'SENIORITY_FILTER_FIELD'). value: The filter value to send back in a ContactFilterInput to apply this facet (e.g. 'VP'). label: Human-readable display label for the facet value (e.g. 'Vice President'). count: Number of contacts in the current result set that match this facet value. Also returns pagination info (current_page_number, page_size, total_pages, total_elements).

IMPORTANT: If the response contains more than one record, always present the options to the user and ask them to choose before taking any follow-up action. Do not act on all results automatically.
NameRequiredDescriptionDefault
filtersNoOptional list of field filters to narrow results. Each entry targets one ContactFilterField with one or more values. Multi-value within a single entry is OR-combined; multiple entries are AND-combined. Omit to return all contacts in the workspace.
page_sizeNo
page_numberNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare the read-only, non-destructive profile, but the description adds real context beyond them: the result set is limited to tracked contacts, a fallback tool should be tried before reporting 'no results', and multi-record responses must be surfaced for user selection rather than acted on automatically. It loses a point only because 'Behavior: read_only' simply restates the annotation and no auth or rate-limit context is given.

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 critical scoping and routing information is front-loaded, but the description is bloated: it re-documents every return field (id, first_name, email, persona_grade, etc.) even though a full output schema exists, and the rendering/multi-record instructions consume as much space as the actual tool semantics.

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

Completeness4/5

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

Given an output schema and annotations, the description covers usage routing, result scope, rendering expectations, and multi-result handling — more than enough to invoke it correctly. The only real hole is the absence of any guidance on page_size/page_number, which are undocumented in the schema as well.

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?

Top-level schema description coverage is 33%, and the description never explains page_size or page_number semantics beyond a passing pagination mention in the rendering block. The filter-field semantics it does discuss (REFERENCE_ID vs EXTERNAL_ID, TITLE_PERSONA values) largely duplicate the already-rich oneOf descriptions in the schema, so it adds little net meaning.

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

Purpose5/5

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

States a specific verb (search/filter) and resource (prospect contacts) and enumerates the filterable attributes, then explicitly scopes it to 'tracked contacts only' with a named fallback. An agent can separate it from siblings like search_people_in_companies and search_people_by_location_and_seniority without opening any schema.

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

Usage Guidelines5/5

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

The 'Use when' block gives explicit routing: REFERENCE_ID_FILTER_FIELD for Salesforce/HubSpot IDs, EXTERNAL_ID_FILTER_FIELD for other IDs, ACCOUNT_ID_FILTER_FIELD for all contacts at an account, and so on. It even names the alternative to try when no match is found, so no selection inference is required.

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

search_intro_requestSearch intro requestA
Read-only
Inspect

Search and filter intro requests in the workspace. Input shape: workspace_id (auto-injected), filter_groups (optional), sort (optional), page (0-based, default 0), page_size (default 20, max 100). Each filter group has logic (AND/OR) and criteria [{field, operator, values}]. field and operator are enums — always pass exact enum strings. Returns intro_requests (current_state, meta, target_id, requester_id, timestamps) and page_info. Replaces get_intro_request — use INTRO_REQUEST_SEARCH_FILTER_INTRO_REQUEST_ID + EQUALS for single-ID lookup. USER-FACING: summarize results with person/account names — never read UUIDs or tool names aloud.

Use when: Use for ANY intro request lookup or list. Decision guide — (1) By intro_request_id: INTRO_REQUEST_SEARCH_FILTER_INTRO_REQUEST_ID + EQUALS. (2) Person at account: INTRO_REQUEST_SEARCH_FILTER_TARGET_ACCOUNT_ID + EQUALS AND INTRO_REQUEST_SEARCH_FILTER_TARGET_CONTACT_NAME + CONTAINS (single token e.g. ['sherif']) OR TARGET_CONTACT_ID + EQUALS when contact UUID known from search_contacts. (3) All intros for account: TARGET_ACCOUNT_ID only. (4) All intros to a contact: TARGET_CONTACT_ID + EQUALS. (5) By lifecycle state: INTRO_REQUEST_SEARCH_FILTER_STATE + IN e.g. ['DRAFT','IN_PROGRESS']. (6) By requester: REQUESTER_ID + EQUALS. (7) By super connector: REFERRER_ID + EQUALS or IN. (8) Time-sensitive only: IS_TIME_SENSITIVE + EQUALS ['true']. (9) Created after date: CREATED_AT + GTE ['2024-01-01']. Omit filter_groups to list all (paginated). Multiple filter_groups are AND-combined. Prefer TARGET_CONTACT_ID over name when UUID is known.

Behavior: read_only

workspace_id / user_id are injected from request headers.

Returns intro_requests[] with fields:

target_id: UUID of the target contact this intro request is for. requester_id: UUID of the workspace user who requested the introduction. intro_request_id: UUID of this intro request — store internally for search_intro_request, intro_request_send_state_change_event, and get_draft_by_type. Do not read aloud to the user. current_state: Current state of the intro request in the state machine. created_at: ISO 8601 timestamp when the intro request was created. meta: Metadata: context, time-sensitivity, opportunity details, recommended super connectors, meeting status. Also returns pagination info (current_page_number, page_size, total_pages, total_elements, has_next, has_previous).

IMPORTANT: If the response contains more than one record, always present the options to the user and ask them to choose before taking any follow-up action. Do not act on all results automatically.
NameRequiredDescriptionDefault
pageNo
sortNoOptional sort order. Defaults to created_at descending when omitted.
page_sizeNo
filter_groupsNoOptional filter groups — AND-combined with each other. Each group has logic (AND/OR) and criteria [{field, operator, values}]. Primary patterns: by ID (INTRO_REQUEST_ID), person-at-account (TARGET_ACCOUNT_ID + TARGET_CONTACT_NAME), by contact UUID (TARGET_CONTACT_ID), by state (STATE IN), by requester (REQUESTER_ID). Omit to return all intro requests.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds real value beyond that: header injection of workspace_id/user_id, pagination semantics, the multi-result handling rule ('always present the options to the user'), and the user-facing instruction not to read UUIDs or tool names aloud. It stops short of describing error or empty-result 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?

Front-loaded with input shape, then usage, then behavior and return fields — a sensible ordering. It is verbose and partly redundant, restating filter patterns already enumerated in the schema enums, but given the enum-heavy filter DSL the length is largely justified.

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

Completeness5/5

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

An output schema exists, yet the description still names the key return fields an agent must act on (intro_request_id, current_state, target_id) and flags the multi-result interaction rule. Combined with the usage guide and injection note, nothing needed to invoke it correctly is missing.

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

Parameters5/5

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

With only 50% schema coverage, the description carries the load and does so: it maps each filter field to its valid operator (STATE→IN, TARGET_CONTACT_NAME→CONTAINS single token, CREATED_AT→GTE), gives literal example values, and explains AND-combination across filter_groups. This meaningfully exceeds what the top-level schema properties state.

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 ('Search and filter intro requests in the workspace') and explicitly positions itself against siblings: it says it replaces get_intro_request and points to search_contacts for UUID resolution. An agent can distinguish it from intro_request_get_current_state and request_intro without opening any schema.

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

Usage Guidelines5/5

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

Provides an explicit decision guide with nine numbered lookup patterns keyed to concrete filter combinations, plus the fallback behavior ('Omit filter_groups to list all'). It also states the tie-break rule 'Prefer TARGET_CONTACT_ID over name when UUID is known', leaving no ambiguity about which path to take.

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

search_people_by_location_and_senioritySearch people by location and seniorityA
Read-onlyIdempotent
Inspect

Find a specific person by exact first+last name, or find people at a company (by name or by LinkedIn company id) — optionally refined by geographic location and seniority band. Returns name, current title, current company, location, and LinkedIn URL. Global directory search — NOT scoped to the caller's workspace/contacts. Requires first_name+last_name, company_name, OR company_social_id; region/seniority alone are not enough. company_name is resolved server-side to a LinkedIn id — an ambiguous or unmatched name is rejected asking you to resolve it yourself (e.g. via web search) and retry with company_social_id. Results are capped and ranked by follower count; use page for more.

Use when: Use when the user wants to find a specific known person by name (e.g. 'find Satya Nadella'), or people at a named company, optionally narrowed by where they live (US state or metro) and how senior they are (C-suite, VP, director-and-above). For a fixed SET of companies known by social id/slug rather than a name, prefer SearchPeopleInCompanies instead.

Behavior: read_only, idempotent

Returns people[] with fields: full_name current_title current_company location country_code linkedin_url social_followers person_social_id: Stable person social id (profile-data graph identifier). Not for display — carry through to any export/CSV for de-duplication and re-lookup.

IMPORTANT: If the response contains more than one record, always present the options to the user and ask them to choose before taking any follow-up action. Do not act on all results automatically.

NameRequiredDescriptionDefault
pageNo
regionNo
previewNo
last_nameNo
page_sizeNo
seniorityNo
first_nameNo
name_anchorNo
company_nameNo
country_codeNoUS
workspace_idNo
title_personaNo
person_regionsNo
title_keywordsNo
company_social_idNo
per_company_limitNo
company_social_idsNo
exclude_social_idsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint=false), the description discloses that the scope is the global directory rather than the caller's workspace, that company_name is resolved server-side and ambiguous names are rejected with a resolve-it-yourself-and-retry flow, that results are capped and ranked by follower count, and that page paginates. These are non-obvious behaviors an agent must plan around.

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

Conciseness4/5

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

Front-loaded with the core retrieval modes, then 'Use when' and 'Behavior' sections make it scannable, and the return-field list is grouped cleanly. It is somewhat long and repeats the title's phrasing in the opening sentence, so it is efficient but not maximally tight.

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?

Return values are covered (an output schema exists and the description enumerates key fields, including the non-obvious person_social_id guidance), and the safety profile comes from annotations. But for an 18-parameter tool with zero schema description coverage, the description leaves too many inputs unexplained, so it is only adequate given the tool's complexity.

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 0% across 18 parameters, so the description carries the full burden, yet it only explains a fraction: region, seniority bands, company_name resolution, company_social_id, and page. Highly consequential parameters such as name_anchor, person_regions, title_keywords, title_persona, per_company_limit, company_social_ids, exclude_social_ids, preview, country_code, and page_size are never mentioned, leaving an agent to guess at them.

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 gives a specific verb+resource (find people in a global directory) and immediately distinguishes the two modes: exact name lookup vs. company lookup, optionally refined by location and seniority. It names the sibling it is NOT (SearchPeopleInCompanies for a fixed set of social ids), so an agent can route without opening either schema.

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

Usage Guidelines5/5

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

Explicit 'Use when' block covers both trigger scenarios (known person by name; people at a named company narrowed by location/seniority), states a hard prerequisite (first_name+last_name, company_name, OR company_social_id; region/seniority alone insufficient), and names the alternative tool plus the condition that selects it. Also warns against auto-acting on multi-record results.

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

search_people_in_companiesSearch people in companiesA
Read-onlyIdempotent
Inspect

Deprecated — prefer search_people_by_location_and_seniority with company_social_ids set. Find senior people at a specific SET of companies (anchored by company social ids / slugs), optionally filtered by location and by title keywords. COMPANY-anchored: the input is a fixed list of companies to look inside. Returns name, title, company, seniority, and location for up to per_company_limit people per company.

Use when: Deprecated. Use for people at named companies, e.g. 'VPs at Acme and Globex' — or as the fallback when search_contacts finds no match for a named person/company. Also use for company-wide sweeps (e.g. ICP match) across ALL employees, not just tracked contacts — pass the workspace's ICP title_keywords for that. Narrow further with title_keywords. Prefer SearchPeopleByLocationAndSeniority for location/seniority-only queries not anchored to specific companies.

Behavior: read_only, idempotent

DEPRECATED.

Returns people[] with fields: person_social_id first_name last_name title company_social_id company_name seniority country_code location social_followers_count

IMPORTANT: If the response contains more than one record, always present the options to the user and ask them to choose before taking any follow-up action. Do not act on all results automatically.

NameRequiredDescriptionDefault
min_seniorityNo
location_codesNo
title_keywordsNo
per_company_limitNo
company_social_idsNo
exclude_social_idsNo
include_numeric_company_id_formNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/destructive/openWorld, so 'read_only, idempotent' is redundant. However the description adds genuinely new behavioral context beyond the annotations: the deprecation status (which annotations don't express) and a notable output-handling policy ('If the response contains more than one record, always present the options to the user... Do not act on all results automatically').

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 deprecation notice is repeated three times ('Deprecated —', 'Use when: Deprecated.', and a standalone 'DEPRECATED.'), and the ten-field returns list duplicates the existing output schema. The usage guidance is front-loaded and useful, but the redundancy inflates the definition.

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

Completeness4/5

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

With annotations covering the safety profile and an output schema present, the description gives enough to select and invoke the tool: deprecation routing, anchor semantics, and result-handling policy. It falls short only on the two undocumented filter parameters.

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 0% and there are 7 parameters, so the description carries the burden. It does add meaning for company_social_ids (anchor set), per_company_limit ('up to per_company_limit people per company'), location, and title_keywords, but says nothing about exclude_social_ids or include_numeric_company_id_form, leaving two parameters wholly undocumented.

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

Purpose5/5

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

States a specific verb and resource with scope: 'Find senior people at a specific SET of companies (anchored by company social ids / slugs)'. It explicitly contrasts itself with search_people_by_location_and_seniority ('COMPANY-anchored: the input is a fixed list of companies to look inside'), so an agent can distinguish it from its closest sibling without opening either schema.

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

Usage Guidelines5/5

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

Contains an explicit 'Use when' block naming concrete cases ('VPs at Acme and Globex', fallback when search_contacts finds no match, company-wide ICP sweeps) and an explicit alternative plus the condition that selects it ('Prefer SearchPeopleByLocationAndSeniority for location/seniority-only queries not anchored to specific companies').

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

search_warm_intro_relationshipsSearch warm intro relationshipsA
Read-only
Inspect

Search warm intro relationship paths across the workspace using rich filters on accounts, contacts, super connectors, and relationship quality. Returns fully resolved results with contact, super connector, account, relationship evidence, and intro request context per path. IMPORTANT — rendering: do NOT dump raw JSON or long prose in chat. Render results in a tabular UI artifact (React/HTML table) — one row per relationship path. Include as many columns as the data provides: Contact (full_name, title, seniority, company_name, email), Super Connector (full_name, title, email), Account (account_name, domain, industry, owner_full_name, employee_size), Relationship (strength, category, confidence, intro_value, score, summary, relationship_path_types, number_of_meetings, last_contacted_at), Intro Request (current_state, requester_full_name, is_recommended_connector, connector_request_status when has_intro_request). Hide internal UUIDs unless the user asks. Include pagination when page_info indicates more pages.

Use when: Use for workspace-wide warm intro discovery when you need to combine multiple filters — e.g. VP contacts at accounts owned by a rep, CONFIRMED paths via a specific connector, or contacts at a specific domain. After results return, render the table UI in the same turn — do not summarize paths as paragraphs. CATEGORY TRIGGER WORDS — if the user's request contains any of: investor(s), customer(s), board member(s), advisor(s), champion(s), alumni, leadership, partner(s) — treat this as a FILTER_FIELD_CATEGORY request, NOT a seniority or strength filter. These words describe who the connector is in relation to the company, not how senior the contact is or how strong the tie is. NEVER substitute FILTER_FIELD_SENIORITY or FILTER_FIELD_STRENGTH as a proxy for a category-based request. Required flow for any category-based request: (1) call get_workspace_categories FIRST, (2) filter response to relationship_type SUPER_CONNECTORS and is_deleted false, (3) match the user's term to the closest category label(s) — include all plausible matches as OR'd values (e.g. both 'Investor' and 'Investors' if both exist), (4) pass those category id UUIDs as FILTER_FIELD_CATEGORY values. Never pass label strings directly as FILTER_FIELD_CATEGORY values. Mixed requests (e.g. 'senior leaders who investors know'): apply FILTER_FIELD_CATEGORY AND FILTER_FIELD_SENIORITY together in the same call. When filtering by super connector, prefer FILTER_FIELD_CONNECTOR_ID (exact UUID match) over FILTER_FIELD_SUPER_CONNECTOR_NAME whenever the connector user_id is known — name prefix matching requires a single first or last name token and silently returns zero results for full names like "Steven Hagler". When the user supplies Salesforce/HubSpot account IDs, pass them straight to FILTER_FIELD_ACCOUNT_REFERENCE_ID — do not call search_accounts_with_filters to map them to UUIDs first.

Behavior: read_only

workspace_id / user_id are injected from request headers.

Returns results[] with fields:

source: Originating party of the path. source.user is set for User→Contact and User→Account paths; source.company is set for Account→Account paths; source.contact is set for Contact→Account (COMPANY_ALUMNI) paths. target: Intended intro recipient. target.contact is set for User→Contact paths; target.account is set for User→Account and Account→Account paths; both are set for COMPANY_ALUMNI paths. relationship: Relationship quality and evidence — strength, category, confidence, intro_value, score, summary, number_of_meetings, last_contacted_at, is_approved, connected_on_date. relationship_path_types is a list of {type, description} objects — use type values to determine which source/target sub-fields are populated. intro_request: Intro request context — show when has_intro_request is true: current_state, requester_full_name, created_at, is_time_sensitive, is_recommended_connector, connector_request_status. Show '—' when absent. Returns groups[] with fields: representative: The full row of the group's representative path: source, target contact, target account (= primary_account), relationship and intro request. The representative is the contact's employer when known, else the group's best path. primary_account: The account of the representative path — the contact's employer when is_primary_employer is true, otherwise the group's best path (strongest, then highest score). accounts: Every account in the group that matches the request's filters, primary_account included, employer first then by strength. account_count: Number of entries in accounts. best_strength: Strongest path strength in the group (groups are ranked by it). Also returns pagination info (total_pages, current_page_number, page_size, total_count).

IMPORTANT: If the response contains more than one record, always present the options to the user and ask them to choose before taking any follow-up action. Do not act on all results automatically.
NameRequiredDescriptionDefault
sortNo
searchNo
filtersNoOptional active filters to scope the returned option values — e.g. if a location filter is active, seniority options will only include values present for that location.
group_byNo
page_sizeNo
page_numberNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=false), and the description goes well past them: it discloses the tabular-rendering requirement, the hide-internal-UUID rule, pagination handling from page_info, the multiple-result 'present options and ask before acting' constraint, and the documented silent-zero-result failure modes of name prefix matching. That is substantial behavioral context an agent would otherwise not have.

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?

Well front-loaded — purpose first, then usage, then behavior, then return shape — but the render-spec paragraph with the full column inventory and the CATEGORY TRIGGER WORDS block restate material already carried by the output schema and by FILTER_FIELD_CATEGORY's own schema description. Useful content, but it is over-proportioned relative to tool-selection needs.

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, multi-filter, grouped, paginated search tool this covers what an agent needs: when to call it, the category-resolution prerequisite, the ID-vs-name preference, and the shape of results[]/groups[] beyond what the output schema declares. The only real gap is the absence of guidance on sort, search, and group_by, which remain fully opaque.

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 only 17%, and the description compensates heavily for the hardest part — FILTER_FIELD_CATEGORY requires UUIDs resolved from get_workspace_categories, not label strings, and mixed category+seniority requests must be ANDed in one call. It does not address the opaque top-level parameters (search, sort, group_by, page_size/page_number are never explained), which is why it falls short of a 5.

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

Purpose5/5

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

Opens with a specific verb and resource ('Search warm intro relationship paths across the workspace') and immediately scopes it via the filter dimensions (accounts, contacts, super connectors, relationship quality). An agent can tell this apart from search_contacts, search_accounts_with_filters, and get_workspace_categories without opening any schema.

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

Usage Guidelines5/5

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

There is an explicit 'Use when' block with concrete filter combinations ('VP contacts at accounts owned by a rep', 'CONFIRMED paths via a specific connector'), plus disambiguation rules for the ambiguous category trigger words and the required get_workspace_categories-first flow. It also states the alternative-path rules (FILTER_FIELD_CONNECTOR_ID over name filters, FILTER_FIELD_ACCOUNT_REFERENCE_ID instead of resolving via search_accounts_with_filters).

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

search_workspace_membersSearch workspace membersA
Read-only
Inspect

Search and filter members in a workspace. Input shape: workspace_id (required root param, auto-injected), filter_groups (optional), sort (optional), page (0-based, default 0), page_size (default 20, max 100). When filter_groups is omitted, returns all members. field and operator are enums — always pass exact enum strings. Primary filters: WORKSPACE_MEMBER_FILTER_FIELD_NAME→CONTAINS or EQUALS; WORKSPACE_MEMBER_FILTER_FIELD_ROLE→IN; WORKSPACE_MEMBER_FILTER_FIELD_EMAIL→CONTAINS or EQUALS. Also supports USER_ID, LINKEDIN_ID, CREATED_AT, Super Connector consent fields, CATEGORY→IN, and TITLE→REGEX (current job title(s), regex match). Sortable: CREATED_AT, NAME, EMAIL, ROLE. Response includes a categories array (id, label, value) per member, and for Super Connectors super_connector_state (ACTIVE / DORMANT) plus the effective super_connector_dormant flag; filter SC_STATE→IN ['DORMANT'] lists the parked Super Connectors; activate one with add_role (role [SUPER_CONNECTOR], super_connector_state ACTIVE).

Use when: Use for ANY workspace member lookup. Decision guide — (1) List all members: omit filter_groups (workspace_id only). (2) Find by name substring: WORKSPACE_MEMBER_FILTER_FIELD_NAME + WORKSPACE_MEMBER_FILTER_OPERATOR_CONTAINS e.g. ['smith']. (3) Find by exact name: WORKSPACE_MEMBER_FILTER_FIELD_NAME + WORKSPACE_MEMBER_FILTER_OPERATOR_EQUALS e.g. ['John Smith']. (4) Find by role: WORKSPACE_MEMBER_FILTER_FIELD_ROLE + WORKSPACE_MEMBER_FILTER_OPERATOR_IN e.g. ['SUPER_CONNECTOR'] or ['ADMIN']. (5) Find by email substring/domain: WORKSPACE_MEMBER_FILTER_FIELD_EMAIL + WORKSPACE_MEMBER_FILTER_OPERATOR_CONTAINS e.g. ['@acme.com']. (6) Find by exact email: WORKSPACE_MEMBER_FILTER_FIELD_EMAIL + WORKSPACE_MEMBER_FILTER_OPERATOR_EQUALS e.g. ['jane@acme.com']. (7) Find by category: WORKSPACE_MEMBER_FILTER_FIELD_CATEGORY + WORKSPACE_MEMBER_FILTER_OPERATOR_IN — pass one or more WorkspaceMemberCategoryName display values e.g. ['Leadership'] or ['Board','Investors']. Valid values: 'Leadership', 'Board', 'Advisors', 'Customers', 'Employees', 'Alumni', 'Investors', 'Others', 'Power User', 'Partners'. Matching is exact and case-sensitive on these display strings — a value outside this list matches nothing and returns an empty result rather than an error, so never invent or pluralise one ('Power User' is singular). (8) Find by one or more user IDs: WORKSPACE_MEMBER_FILTER_FIELD_USER_ID + WORKSPACE_MEMBER_FILTER_OPERATOR_EQUALS only — this field does NOT support IN; for multiple IDs use a WORKSPACE_MEMBER_FILTER_LOGIC_OR group with one EQUALS criterion per ID. (9) Find by current job title: WORKSPACE_MEMBER_FILTER_FIELD_TITLE + WORKSPACE_MEMBER_FILTER_OPERATOR_REGEX e.g. ['(?i)^VP.*Sales'] — case-insensitive Postgres regex against the member's current title(s); only current employment is searched, not past roles. workspace_id is always required at root and auto-injected — never ask the user.

Behavior: read_only

workspace_id / user_id are injected from request headers.

Returns members[] with fields:

user_id: Unique internal UUID of the user. Use this as the identifier when referencing this member in other API calls. workspace_id: Id of the workspace this membership belongs to. role: List of roles assigned to this member in the workspace. Each entry has a machine name (e.g. 'ADMIN') and a human-readable label (e.g. 'Admin'). A member can hold multiple roles simultaneously. user_first_name: Member's first name. user_last_name: Member's last name. user_email: [redacted] created_at: Timestamp when this member was added to the workspace. is_management_user: True if this user holds a platform-level management role (assigned outside of workspace roles, via ManagementUserService). Management users typically have elevated cross-workspace privileges. linkedin_id: Member's LinkedIn profile ID or URL. Used to identify the member's LinkedIn presence for Super Connector network analysis and warm intro path finding. whatsapp_consent: Whether the member has consented to receiving WhatsApp communications. connection_ledger_id: ID of the member's uploaded LinkedIn connection file (connection ledger). Non-empty means the member has uploaded their LinkedIn connections export, which enables Super Connector network analysis. Empty means no connection file has been uploaded yet. network_description: Free-text description of the member's professional network, provided by the member or admin. Gives context on the member's relationship capital and areas of influence. Null if not set. super_connector_opt_in: Whether the member has opted into the Super Connector program, which allows the platform to leverage their LinkedIn network for warm introductions. connection_consent: Member's consent to share their LinkedIn network connections with the workspace for intro facilitation. Distinct from super_connector_opt_in — this specifically governs the sharing of raw connection data. sc_onboarding_status: Current stage of the member's Super Connector onboarding flow. categories: Category tags assigned to this member (e.g. Finance, Technology). Each entry has an id, a human-readable label, and a value. Used to group or segment members within the workspace. notes: Optional admin notes about this Super Connector member. Free-text field set via UpdateSuperConnectorNotes. Null if no notes have been added. super_connector_state: Super Connector state, read from the member's SUPER_CONNECTOR role. SUPER_CONNECTOR_STATE_UNSPECIFIED when the member is not a Super Connector. DORMANT means the Super Connector is parked: no automations run for them and they hold no plan seat until activated with add_role (super_connector_state ACTIVE). super_connector_dormant: True when this Super Connector currently gets no automations: super_connector_state is DORMANT, or it is ACTIVE but over the workspace plan's Super Connector limit. dormant=true with state ACTIVE means activating will not help; the plan limit must be raised. Always false for members who are not Super Connectors. Also returns pagination info (current_page, page_size, total_elements, total_pages, has_next, has_previous).

IMPORTANT: If the response contains more than one record, always present the options to the user and ask them to choose before taking any follow-up action. Do not act on all results automatically.
NameRequiredDescriptionDefault
pageNo
sortNoOptional sort order. Array of {field: <enum>, order: <enum>}. Sortable: WORKSPACE_MEMBER_SORT_FIELD_CREATED_AT, NAME, EMAIL, ROLE. Default if omitted: CREATED_AT ASC.
page_sizeNo
filter_groupsNoOptional filter groups (AND-combined). Omit to list all members. Each criterion uses enum field + enum operator + values array. Primary filters: NAME (CONTAINS/EQUALS), ROLE (IN), EMAIL (CONTAINS/EQUALS). See FilterCriterion for valid field→operator pairs.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

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

Goes well beyond the annotations: states that workspace_id is auto-injected from headers and 'never ask the user', documents pagination metadata, and warns that a bad CATEGORY value silently returns an empty result rather than an error. Also adds a workflow constraint ('present options and ask the user before acting on multiple results'). The one gap is the idempotentHint=false annotation, which is never explained.

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

Conciseness3/5

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

Purpose, input shape, decision guide, and returns are sensibly ordered and front-loaded. However it is extremely long and reproduces much of the schema verbatim — the full enum string lists, field→operator table, and every return field with prose descriptions — which is redundant when the schema and an output schema already carry that content.

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?

Everything an agent needs is present: auto-injection semantics, pagination, the DORMANT/plan-limit nuance in super_connector_dormant, category exact-match pitfalls, and the handoff to add_role for activation. An output schema exists, so the return documentation is surplus rather than necessary, but nothing is missing.

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

Parameters5/5

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

Schema coverage is only 50%, but the description compensates heavily: it spells out field→operator pairings, the exact case-sensitive category display values, the USER_ID EQUALS-only restriction with the OR-group workaround, and worked examples for name/email/role/title filters. It adds substantial meaning beyond the schema's enum titles.

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

Purpose5/5

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

Opens with a specific verb+resource ('Search and filter members in a workspace') and immediately scopes itself with 'Use for ANY workspace member lookup', which separates it from the many contact/company/profile siblings. An agent can tell what this tool covers without inspecting the schema.

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

Usage Guidelines5/5

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

Provides a numbered decision guide mapping nine concrete intents to exact field/operator/value combinations, plus the 'omit filter_groups to list all' case. It also names the alternative pattern where one exists (multi-ID lookups must use an OR group of EQUALS rather than IN).

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

search_workspacesSearch workspacesA
Read-only
Inspect

Search and filter workspaces for a user. Input shape: member_user_id (required root param, auto-injected), filter_groups (optional), sort (optional), page (0-based, default 0), page_size (default 20, max 100). When filter_groups is omitted, returns all workspaces the user belongs to. field and operator are enums — always pass exact enum strings. Valid field→operator pairs: WORKSPACE_FILTER_FIELD_NAME→CONTAINS, EQUALS, or REGEX; WORKSPACE_FILTER_FIELD_WORKSPACE_ID→EQUALS or IN; WORKSPACE_FILTER_FIELD_DOMAIN→CONTAINS, EQUALS, or REGEX; WORKSPACE_FILTER_FIELD_WORKSPACE_TYPE→IN; WORKSPACE_FILTER_FIELD_CREATED_AT→GTE or LTE (ISO-8601); WORKSPACE_FILTER_FIELD_DESCRIPTION→CONTAINS. Returns workspace id, name, description, type, contact stats, config, logo, member count, and the user's roles.

Use when: Use for ANY workspace lookup for the current user. Decision guide — (1) List all workspaces: omit filter_groups (member_user_id only). (2) Find by name substring: WORKSPACE_FILTER_FIELD_NAME + WORKSPACE_FILTER_OPERATOR_CONTAINS e.g. ['acme']. (3) Find by name regex: WORKSPACE_FILTER_FIELD_NAME + WORKSPACE_FILTER_OPERATOR_REGEX e.g. ['^Acme.*']. (4) Lookup by workspace UUID: WORKSPACE_FILTER_FIELD_WORKSPACE_ID + WORKSPACE_FILTER_OPERATOR_EQUALS e.g. ['<uuid>']. (5) Bulk lookup by IDs: WORKSPACE_FILTER_FIELD_WORKSPACE_ID + WORKSPACE_FILTER_OPERATOR_IN e.g. ['uuid1','uuid2']. (6) Find by domain: WORKSPACE_FILTER_FIELD_DOMAIN + WORKSPACE_FILTER_OPERATOR_EQUALS e.g. ['acme.com'] or CONTAINS/REGEX for partial/pattern. (7) Filter by type: WORKSPACE_FILTER_FIELD_WORKSPACE_TYPE + WORKSPACE_FILTER_OPERATOR_IN e.g. ['CUSTOMER']. (8) Filter by creation date: WORKSPACE_FILTER_FIELD_CREATED_AT + GTE/LTE with ISO-8601 e.g. ['2024-01-01T00:00:00Z']. member_user_id is always required and scopes to that user's memberships.

Behavior: read_only

workspace_id / user_id are injected from request headers.

Returns workspaces[] with fields:

id: Unique UUID of the workspace. Use this as the workspace_id when calling other workspace-scoped APIs. name: Display name of the workspace. description: Free-text description of the workspace's purpose or customer context. May be empty. workspace_type: Tier or classification of the workspace. meta: Contact counts for the workspace: total, processable, unique, and discovered contacts. workspace_config: Workspace-level configuration values (category 'workspace'). Structured as a JSON object. May be empty if no custom configuration has been set. created_at: Timestamp when the workspace was first created. updated_at: Timestamp of the most recent update to the workspace record. is_disabled: True if the workspace has been disabled (soft-deleted or suspended). Disabled workspaces are not fully active; their data is retained but the workspace is not operational. logo_url: Public URL of the workspace's logo image. Empty string if no logo has been uploaded. active_member_count: Number of active (non-removed) members currently in the workspace. requesting_member_roles: Roles held by the requesting user in this workspace. A user can hold multiple roles simultaneously e.g. ['OWNER', 'SUPER_CONNECTOR_ADMIN']. Always non-empty since only workspaces where the user is an active member are returned. workspace_scope: Whether the workspace belongs to a company or to one person. package_type: The shape of the workspace's current plan. Unspecified when it has no subscription. Also returns pagination info (current_page, page_size, total_elements, total_pages, has_next, has_previous).

IMPORTANT: If the response contains more than one record, always present the options to the user and ask them to choose before taking any follow-up action. Do not act on all results automatically.
NameRequiredDescriptionDefault
pageNo
sortNoOrdered list of sort criteria. First entry is primary sort, subsequent entries break ties. Optional — defaults to NAME ascending (A-Z) if omitted.
page_sizeNo
filter_groupsNoOptional list of filter groups (AND-combined). Omit to return all workspaces for member_user_id. Each criterion uses enum field + enum operator + values array. See WorkspaceFilterCriterion for valid field→operator pairs and example values.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds real value beyond them: it explains that member_user_id/workspace_id are auto-injected from headers, and the closing IMPORTANT rule about not auto-acting on multi-record results is genuine behavioral guidance. It stops short of covering rate limits or empty-result behavior.

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 front-loaded input shape is good, but the entry is bloated: the field→operator pair list is duplicated verbatim in the schema, and every return field is re-described despite an output schema existing. The verbose return-field enumeration adds length without adding information.

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

Completeness5/5

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

Given a nested-looking filter schema and a rich output schema, the description supplies everything an agent needs: required root param, defaults, enum pairing rules, filter composition semantics, and the multi-result caution. Nothing material to correct invocation is missing.

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

Parameters5/5

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

At 50% schema coverage the description must compensate, and it does: it specifies page is 0-based (default 0), page_size default 20/max 100, and fully maps the valid field→operator pairs for filter_groups. It also warns that field/operator are enums requiring exact strings, which the schema alone does not emphasize.

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 ('Search and filter workspaces for a user') and scopes it to the current user's memberships. It is readily distinguishable from siblings like search_workspace_members, get_current_workspace, and find_companies.

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

Usage Guidelines5/5

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

A numbered decision guide enumerates eight concrete scenarios (list-all, substring, regex, UUID lookup, bulk IN, domain, type, date range) each with the exact enum pair to use. This is explicit when-to-use guidance that leaves nothing to inference.

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

send_emailSend emailAInspect

Send an HTML email to recipients via SES. Always CCs a random boomerang+*@mail.getboomerang.ai tracking alias and records email_conversations with the SES message id.

Use when: Use when Rudy or an internal agent must deliver an email brief or notification to a user.

workspace_id / user_id are injected from request headers.

NameRequiredDescriptionDefault
ccNo
bccNo
subjectNo
reply_toNo
html_bodyNo
to_addressesNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing two non-obvious behaviors: it always CCs a random boomerang+*@mail.getboomerang.ai tracking alias, and it records an email_conversations row keyed by the SES message id. It also states that workspace_id/user_id are injected from request headers, which the agent otherwise couldn't infer.

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

Conciseness4/5

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

Front-loaded with the action and side effects, then the usage condition, then the header-injection note. Every sentence earns its place, though the three-part structure is slightly fragmented rather than a single coherent paragraph.

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

Completeness4/5

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

An output schema exists, so return values need not be explained. The description covers the send action, its hidden side effects, and injected context; combined with the side-effect disclosure it is nearly complete, with the main gap being the unexplained subject/reply_to/bcc parameters.

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 0% across 6 parameters, so the description carries the burden. It clarifies the core inputs (recipients, HTML body) and the auto-CC behavior, but says nothing about subject, reply_to, or bcc, leaving half the parameters undocumented in both places.

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

Purpose5/5

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

States a specific verb+resource ('Send an HTML email to recipients via SES') and immediately distinguishes itself from siblings, none of which send email. The mechanism (SES) and the side effects are named up front, so an agent knows exactly what this 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 'Use when' line gives clear context: 'Rudy or an internal agent must deliver an email brief or notification to a user.' It sets the triggering condition well but offers no explicit exclusions or alternative tools, since none of the siblings overlap for outbound email.

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

start_super_connector_activationStart super connector activationAInspect

Provision one or more Super Connectors and immediately run the requested automation actions against them, bypassing the normal onboarding-complete gate. Returns a run_id; progress arrives as SC_ACTIVATION_RUN realtime events.

Use when: Use when you need to fast-path activate Super Connectors and trigger automations (e.g. CREATE_LEADERSHIP_BRIDGE_PATHS) without waiting for full onboarding. Prefer add_super_connector for standard onboarding flows.

workspace_id / user_id are injected from request headers.

NameRequiredDescriptionDefault
peopleNoList of Super Connectors to activate. Each entry requires linkedin_id; first_name and last_name are optional overrides (resolved from profile data when omitted). Profiles with no matching data are reported as UNKNOWN_PROFILE in realtime events and are not provisioned.
sourceNo
automationsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations only declare the safety profile (write, non-idempotent, non-destructive); the description adds genuinely new behavior: it bypasses the onboarding gate, is asynchronous (returns run_id, progress via SC_ACTIVATION_RUN events), and notes header-injected identity. It doesn't warn that idempotentHint=false means repeat calls may re-provision, which is the notable remaining gap.

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

Conciseness4/5

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

Front-loaded with purpose, then scoped usage, then a header-injection footnote — a clean three-beat structure. Minor waste from the 'Use when: Use when you need to...' doubling, but every other sentence carries information.

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

Completeness4/5

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

Output schema exists, so return-value detail is optional, yet the description still names run_id and the event channel. Header injection is disclosed. The main gap is unexplained `source` and `automations` semantics, and no caution around the non-idempotent flag, but for the tool's core purpose the description is sufficient.

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 low (33%): only `people` is documented in the schema, while `source` and `automations` have empty/no descriptions. The description loosely ties to automations ('run the requested automation actions' with one example enum) but never explains what `source` is, and does not compensate for the coverage gap as a low-coverage tool must.

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

Purpose5/5

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

Specific verb+resource ('Provision one or more Super Connectors and immediately run the requested automation actions') with an explicit distinguishing scope ('bypassing the normal onboarding-complete gate'). An agent can immediately tell this apart from add_super_connector, which is named as the standard-path sibling.

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

Usage Guidelines5/5

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

Contains an explicit 'Use when:' clause with a concrete condition (fast-path activation without waiting for full onboarding) and a named alternative ('Prefer add_super_connector for standard onboarding flows'). When-to-use, when-not, and alternative are all present.

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

submitEmailExtractionJobSubmit email extraction jobAInspect

Start an async professional-email extraction job for one or more contacts. Returns job_id. Prefer linkedin_url when available; otherwise provide first_name + last_name + company_name or company_domain. Optionally pass boomerang_identity_id when the Boomerang contact id is known. After calling, poll getEmailExtractionJobStatus until the job is terminal — results (including emails) are returned on that same status response.

Use when: Use when you need to find a contact's work email and do not already have it. For a single person, pass one contact. Do not invent emails — wait for the job to complete.

workspace_id / user_id are injected from request headers.

Next steps (after this tool succeeds): [REQUIRED] [ACTION] → call getEmailExtractionJobStatus: Poll getEmailExtractionJobStatus with the returned job_id until status is COMPLETED, PARTIALLY_COMPLETED, or FAILED, then read results[].email.

NameRequiredDescriptionDefault
contactsNoContacts to extract emails for. Each needs linkedin_url OR (first_name + last_name + company_name/company_domain).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Annotations give readOnly=false, openWorld=true, idempotent=false, destructive=false, but the description adds substantial context beyond them: it is async, returns a job_id, must be polled to a terminal status, results land on the status response, identity precedence, and that workspace_id/user_id are header-injected (not caller args). No contradictions with the annotation profile.

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

Conciseness4/5

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

Front-loaded with purpose, then usage, then an explicit next-steps block. Every sentence carries usable information, but the '[REQUIRED] [ACTION]' scaffolding and repeated polling instruction add mild verbosity that could be tightened.

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

Completeness5/5

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

For an async job-submission tool with an output schema, annotations, and full schema coverage, the description supplies everything an agent needs: how to identify contacts, that it is async, and exactly how to retrieve results via getEmailExtractionJobStatus. Return-value explanation is correctly left to the output schema.

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

Parameters4/5

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

Schema coverage is 100% with one top-level param, so the baseline is 3. The description still adds value over the schema by restating the identity precedence (linkedin_url preferred, otherwise name+company) and the optional boomerang_identity_id condition, though it does not add new syntax or format 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?

Specific verb+resource: 'Start an async professional-email extraction job for one or more contacts. Returns job_id.' It is immediately distinguishable from its natural sibling getEmailExtractionJobStatus (submit vs poll), and the async nature is stated up front.

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

Usage Guidelines4/5

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

Explicit when-to-use ('Use when you need to find a contact's work email and do not already have it') plus identity-selection rules (prefer linkedin_url, else name+company) and an exclusion ('Do not invent emails — wait for the job to complete'). It routes to the follow-up status tool but does not explicitly rule out siblings like search_contacts for the same goal.

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

switch_workspaceSwitch workspaceAInspect

Switch the active Boomerang workspace for the current MCP session.

Call this when the user asks to work in a different workspace. The new workspace will be used for all subsequent tool calls.

NameRequiredDescriptionDefault
workspace_idYesThe ID of the workspace to switch to.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false and idempotentHint=false, but the description adds the key behavioral fact annotations can't convey: the switch persists across 'all subsequent tool calls' for the session. It doesn't warn whether existing session state is discarded or whether the workspace_id must be pre-validated, leaving some 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?

Three short sentences, front-loaded with the core action and session scope, then trigger condition. Nothing redundant; every sentence carries information.

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

Completeness4/5

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

For a one-param state-switching tool with an output schema, the description covers action, trigger, and session-wide effect well. It could mention how to get a workspace_id or that the change affects in-flight assumptions, but overall it is complete enough.

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

Parameters3/5

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

Schema coverage is 100% and the single parameter already documents its purpose ('The ID of the workspace to switch to'). The description adds nothing about obtaining a valid workspace_id, 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?

States a specific verb (Switch) and resource (active Boomerang workspace) with the crucial scope qualifier 'for the current MCP session'. This tells an agent exactly what state changes and how broadly the effect applies, distinguishing it from get_current_workspace and search_workspaces.

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

Usage Guidelines4/5

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

Explicitly says when to call it ('when the user asks to work in a different workspace'), which is clear trigger guidance. It does not name alternatives like search_workspaces (to find an ID) or get_current_workspace, so a 4 rather than 5.

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

update_company_profileUpdate company profileA
DestructiveIdempotent
Inspect

Save changes to the workspace's company profile in Boomerang. The change is persistent and shared: the saved profile is what everyone in the workspace sees when they open the company profile, and it replaces the previous values of the sections you send (there is no undo). Merges only the sections you provide — pass just the fields being changed in data, and optionally an explicit sections list. When sections is empty, only populated data fields are merged. Pass sections=["ALL"] to replace the entire document.

Use when: Use when the user asks to change their company profile or saves edits from the get_company_profile artifact UI. Pass only changed sections in data (e.g. value_proposition and pain_points), not the full document. Confirm success in plain language, naming the sections that were updated; optionally re-render the UI with saved values.

Behavior: idempotent, destructive

workspace_id / user_id are injected from request headers.

Next steps (after this tool succeeds): [optional] [SUGGESTION] → call get_company_profile: Confirm save to the user in plain language. Optionally re-render the company profile artifact with the returned data.

Also returns pagination info (researched_on, company_name, company_url, one_line_summary, value_proposition, pain_points, proof_points, competitors, customer_industry_category, departments, seniority, title_keywords, company_size, named_customers, named_investors, title_regex, buying_committee, buying_committee_regex, customer_industry, extended_buying_committee, extended_buying_committee_regex).

NameRequiredDescriptionDefault
dataNo
sectionsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

The annotations already flag idempotent/destructive, but the description adds substantive context they cannot carry: the change is persistent and workspace-shared, it replaces prior values for the sections sent, there is no undo, and merging is section-scoped with a special sections=["ALL"] full-replace mode. It also discloses that workspace_id/user_id are injected from headers, which affects nothing the caller must supply.

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

Conciseness3/5

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

The core guidance is well front-loaded and sectionalized, but the final sentence ("Also returns pagination info (researched_on, company_name, ...)") is a long, mislabeled enumeration — those are profile field names, not pagination — and adds noise rather than information. That trailing block dilutes an otherwise tight description.

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

Completeness4/5

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

For a destructive, nested-object merge tool with 0% schema description coverage, the description covers persistence, merge scope, the full-replace escape hatch, header-injected IDs, and the follow-up call. An output schema exists so return values need not be explained, yet the trailing return-field list is confusing and slightly undermines an otherwise complete picture.

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 0% and `data` is a free-form object, so the description must carry the burden — and it does, defining merge semantics, the empty-sections behavior (only populated data fields merged), and the ["ALL"] sentinel for `sections`. It stops short of specifying the field names/shape accepted inside `data` beyond examples (value_proposition, pain_points).

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

Purpose5/5

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

The first sentence states a specific verb and resource ("Save changes to the workspace's company profile in Boomerang") and the surrounding text makes clear this is the write counterpart to the read-side get_company_profile sibling. An agent can distinguish it from other update_* siblings without opening the schema.

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

Usage Guidelines5/5

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

There is an explicit "Use when" block naming both trigger conditions (user asks to change the profile, or saves edits from the get_company_profile UI), plus concrete guidance on what to pass (only changed sections, not the whole document) and an explicit next step routing to get_company_profile. Alternatives and conditions are spelled out rather than implied.

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

update_draftUpdate draftA
Destructive
Inspect

Save user edits to the latest draft of a specific type (GHOSTWRITTEN_EMAIL, FORWARDABLE_EMAIL, or TEXT) for an intro request. Call this when the user clicks Save in the editable email or text UI rendered from get_draft_by_type. Pass the full edited email_content or text_content (all fields, not just changed ones) and set is_manually_edited=true.

Use when: Use when the user edits a draft in the editable UI from get_draft_by_type and clicks Save — e.g. changes subject, body, To/CC, or the text message. Always set is_manually_edited=true. After saving: update the artifact in place with the saved content (do not re-fetch via get_draft_by_type unless the response content differs from what was submitted) and confirm success in plain language — e.g. 'Your edits to the Ghostwritten Email have been saved.' Do not explain tool names or internal state.

Behavior: destructive

workspace_id / user_id are injected from request headers.

Next steps (after this tool succeeds): [optional] [SUGGESTION] → call intro_request_send_state_change_event: After editing, call intro_request_send_state_change_event with INTRO_REQUESTED_EVENT to submit the intro request for admin review.

Also returns pagination info (request_context).

NameRequiredDescriptionDefault
statusNo
draft_typeNo
text_contentNo
email_contentNo
intro_request_idNo
is_manually_editedNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=false, and the description's 'Behavior: destructive' is consistent. Beyond annotations it adds genuinely useful context: pass ALL fields not just changed ones (implying full replacement of prior draft content), set is_manually_edited=true, and workspace_id/user_id are injected from request headers. It stops short of explicitly stating that existing draft content is overwritten/destroyed.

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

Conciseness3/5

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

Purpose is front-loaded, but the text is long and repetitive: the get_draft_by_type / click-Save condition appears in the opening sentence and again in the 'Use when:' block, and the post-save instructions run several sentences. Some of the length is justified by the routing detail, but it could be 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?

An output schema exists, so return-value documentation is not required, and the description adds return context anyway (pagination info via request_context) plus next-step routing. Combined with the explicit trigger and mutation guidance, it is nearly complete, with the only real gap being the undocumented status/intro_request_id parameters.

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 0% across 6 parameters, so the description carries the burden. It explains draft_type values, the full-content semantics of email_content/text_content, is_manually_edited=true, and that workspace_id/user_id come from headers, but leaves status and intro_request_id entirely undocumented.

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 ('Save user edits to the latest draft') and enumerates the draft types (GHOSTWRITTEN_EMAIL, FORWARDABLE_EMAIL, TEXT), clearly distinguishing it from the read-side sibling get_draft_by_type and from other update_* tools. An agent can identify the operation and target resource without opening the schema.

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

Usage Guidelines5/5

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

The description gives an explicit trigger ('Call this when the user clicks Save in the editable email or text UI rendered from get_draft_by_type'), restates it in a 'Use when:' block, and adds post-save guidance (update the artifact in place, don't re-fetch unless content differs, confirm in plain language). It even names the downstream sibling intro_request_send_state_change_event for the next step.

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

update_user_profileUpdate user profileA
DestructiveIdempotent
Inspect

Save changes to a person's profile in this Boomerang workspace. The change is persistent and shared: the saved profile is what everyone in the workspace sees for that person, and it replaces the previous values of the sections you send (there is no undo). Merges only the sections you provide — pass just the fields being changed in data (e.g. role, next_15_days_focus, next_90_days_focus), and optionally an explicit sections list. When sections is empty, only populated data fields are merged. Pass sections=["ALL"] to replace the entire document.

Use when: Use when the user asks to change a person's profile or saves edits from the get_user_profile artifact UI. Pass only changed sections in data (e.g. role), not the full document. Confirm success in plain language, naming the sections that were updated; optionally re-render the UI with saved values.

Behavior: idempotent, destructive

workspace_id / user_id are injected from request headers.

Next steps (after this tool succeeds): [optional] [SUGGESTION] → call get_user_profile: Confirm save to the user in plain language. Optionally re-render the person profile artifact with the returned data.

Also returns pagination info (researched_on, person_name, person_url, role, next_15_days_focus, next_90_days_focus).

NameRequiredDescriptionDefault
dataNo
user_idNo
sectionsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Annotations declare destructive=true/idempotent=true, and the description goes well beyond them: it discloses that the write is persistent and shared workspace-wide, that sent sections overwrite prior values with no undo, that merge is section-scoped, and that workspace_id/user_id come from request headers. That is exactly the kind of consequence information an agent needs before a destructive write.

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

Conciseness4/5

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

Front-loaded with purpose and then cleanly sectioned into Use when / Behavior / Next steps, so it scans well. However the optional re-render instruction is repeated in both the 'Use when' block and the 'Next steps' block, and the trailing 'Also returns pagination info (researched_on, person_name, ...)' line looks imported from a list-style tool and adds noise rather than value.

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

Completeness5/5

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

For a 3-param destructive write with no schema descriptions, the definition still covers the merge/replace semantics, the header-injected identifiers, when to invoke it, and the intended follow-up (get_user_profile to confirm). An output schema exists, so the return-value summary is not required for the agent to call this correctly.

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

Parameters5/5

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

Schema description coverage is 0%, so the description carries the full burden and does so: it defines data as the changed fields (with concrete examples: role, next_15_days_focus, next_90_days_focus), defines sections including empty and ["ALL"] behavior, and notes that user_id is header-injected. Only the valid section-name vocabulary is left implicit.

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 ('Save changes to a person's profile') and immediately qualifies scope: persistent, shared across the workspace, and section-level replacement. This distinguishes it cleanly from read-side siblings like get_user_profile and from update_company_profile.

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

Usage Guidelines5/5

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

Provides an explicit 'Use when' clause (user asks to change a profile, or edits saved from the get_user_profile artifact UI) and a clear when-not directive: pass only changed sections, not the full document. It also spells out the two edge cases, empty sections (merge populated fields only) and sections=["ALL"] (full document replacement).

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

updateWorkflowTriggerUpdate workflow triggerA
DestructiveIdempotent
Inspect

Update an existing workflow trigger activation: edit name/description/prompt/plan/schedule/channels, or change lifecycle status (ACTIVE/PAUSED/CANCELLED). trigger_id is required and must be the activation config UUID from list_workflow_triggers.id or create_workflow_trigger.trigger_id — never catalog_id. Only set fields that changed. SCHEDULED: any new cron / one_time_fire_at must be absolute UTC. WEBHOOK triggers have no cron — do not add cron when list shows trigger_kind=WEBHOOK; change prompt/channels/status only (supported_events are fixed on the catalog from create/template). Prefer list_workflow_triggers first to load id (as trigger_id) and trigger_kind.

Use when: Use to edit an existing live activation, or pause/resume/cancel it. trigger_id = list_workflow_triggers.id (the config UUID). Do NOT pass catalog_id as trigger_id. First-time opt-in of a WORKSPACE_OPT_IN template uses create_workflow_trigger with catalog_id instead. Call list_workflow_triggers first if you don't have the config id. For WEBHOOK rows, never invent a schedule.

Behavior: idempotent, destructive

workspace_id / user_id are injected from request headers.

Also returns pagination info (name, description, enabled, last_run_at, last_run_status, status, prompt, source, id, allowed_channels, selected_channels, cron, recurring, adhoc, config_status, plan, channel_metadata, agent_thread_id, editable, metadata, test_mode, test_cron, test_lead_minutes, test_recipients, scope, created_by, created_by_user_name, owner_user_id, owner_user_name, activation_mode, principal_type, catalog_id, audience_type, is_template, audience_filter, trigger_kind).

NameRequiredDescriptionDefault
cronNo
nameNo
planNo
promptNo
statusNo
channelsNo
trigger_idNo
descriptionNo
trigger_kindNo
agent_thread_idNo
channel_metadataNo
one_time_fire_atNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare idempotent/destructive, and the description repeats that ('Behavior: idempotent, destructive'), which is redundant. However it adds genuine beyond-annotation context: id must be the config UUID not catalog_id, cron/one_time_fire_at must be absolute UTC, WEBHOOK rows have no cron, supported_events are fixed on the catalog, and workspace_id/user_id are header-injected.

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

Conciseness3/5

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

The core guidance is reasonably front-loaded, but the catalog_id warning is repeated three times ('never catalog_id', 'Do NOT pass catalog_id as trigger_id', 'trigger_id = list_workflow_triggers.id') and the trailing enumeration of ~35 return fields is redundant given a native output schema exists.

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 12-param lifecycle mutation this covers the hard parts well: id provenance, scheduling constraints, kind-specific rules, and status transitions. The redundant return-field list is unnecessary since an output schema already defines them, but overall an agent has enough to call it correctly.

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

Parameters3/5

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

Schema coverage is 0% across 12 params, so the description must carry the load. It does clarify the critical ones (trigger_id must be the config UUID, cron vs one_time_fire_at UTC, WEBHOOK has no cron, channels), but leaves plan, description, agent_thread_id, channel_metadata, and the object-typed name/description shapes unexplained, so compensation is only partial.

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

Purpose5/5

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

Specific verb+resource ('Update an existing workflow trigger activation') with the exact editable fields (name/description/prompt/plan/schedule/channels) and lifecycle transitions (ACTIVE/PAUSED/CANCELLED) named. It explicitly distinguishes itself from create_workflow_trigger and list_workflow_triggers, so an agent can route 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 Guidelines5/5

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

A dedicated 'Use when' block states the trigger condition (edit an existing live activation, or pause/resume/cancel), and it names the alternative for a related case: first-time opt-in uses create_workflow_trigger with catalog_id. It also mandates calling list_workflow_triggers first, giving concrete when/when-not/alternative guidance.

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

update_workspace_memberUpdate workspace memberA
Idempotent
Inspect

Update an existing workspace member's profile settings. member_profile ONLY accepts super_connector_settings (onboarding status, connection consent, opportunity stage, contact seniority, minimum deal size) — email, first_name, and last_name are rejected because identity belongs on the User entity. Does not change workspace roles — use add_role or remove_role for role changes.

Use when: Use when an admin needs to update Super Connector profile settings for an existing workspace member. The member record must already exist. For role changes use add_role or remove_role.

Behavior: idempotent

workspace_id / user_id are injected from request headers.

Also returns pagination info (created_at, updated_at, created_by, updated_by, deleted_at, deleted_by).

NameRequiredDescriptionDefault
member_profileNo
keycloak_user_idNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare idempotentHint, destructiveHint=false, and openWorldHint=false, so the description's 'idempotent' restatement is redundant. It earns credit by adding behavior beyond the annotations: the exact field-acceptance/rejection rules for member_profile, the fact that identity fields belong on the User entity, and that workspace_id/user_id are injected from request headers.

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

Conciseness4/5

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

Front-loaded with purpose, then constraints, then usage, behavior, and return info — a sensible ordering. It is slightly redundant (the 'idempotent' trait duplicates the annotation and the role-change warning appears twice), which keeps it from a 5, but no sentence is wasteful.

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 an output schema exists, the return-value sentence is not strictly needed but is harmless. Annotations cover the safety profile and the description covers field semantics and header injection, so an agent has what it needs; the only gap is the unexplained keycloak_user_id parameter.

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 0%, so the description carries the burden, and it does so well for member_profile: it enumerates the accepted super_connector_settings (onboarding status, connection consent, opportunity stage, contact seniority, minimum deal size) and the rejected fields. It falls short of full compensation because keycloak_user_id is never mentioned in the description or schema.

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

Purpose5/5

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

States a specific verb and resource ('Update an existing workspace member's profile settings') and immediately scopes it against siblings by declaring what member_profile does and does not accept, plus that identity fields are rejected. An agent can distinguish this from create_workspace_member, merge_workspace_members, and update_user_profile without opening a schema.

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

Usage Guidelines5/5

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

Provides an explicit 'Use when' clause (admin updating Super Connector profile settings for an existing member), a precondition ('The member record must already exist'), and names the alternatives for the excluded case ('For role changes use add_role or remove_role'). When-to-use, when-not, and alternatives are all present.

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

upsert_scoped_memoryUpsert scoped memoryA
Destructive
Inspect

Atomically create or replace the single MEMORY document for a USER or WORKSPACE scope. Pass full structured markdown_body plus a compact description projection.

Use when: Use after merging an observation into the scoped memory document. Never create additional MEMORY rows.

Behavior: destructive

workspace_id / user_id are injected from request headers.

Also returns pagination info (id, content_id, version_number, markdown_body, json_payload, change_summary, token_budget_hint, draft_of_version_id, rollback_to_version_id, published_at, published_by, created_at, created_by).

NameRequiredDescriptionDefault
tagsNo
scopeNo
scope_idNo
entity_idNo
descriptionNo
entity_typeNo
markdown_bodyNo
metadata_jsonNo
change_summaryNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so 'Behavior: destructive' repeats structured data rather than adding. It does add the useful note that workspace_id/user_id are injected from headers (so the caller shouldn't pass them), which is genuine beyond-annotation context, but the destructive meaning (replacement of prior content) is not elaborated.

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

Conciseness4/5

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

Front-loaded purpose, then usage, behavior, and a return field list. Efficient overall, though the trailing return-field enumeration is bloated and partly redundant with the output schema.

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?

An output schema exists, so listing pagination/return fields is unnecessary duplication. The header-injection note is valuable, but with 9 undocumented params at 0% coverage and no versioning/rollback semantics explained despite the tool exposing version fields, the description is only adequate for a destructive mutation tool.

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 0% across 9 parameters, so the description must carry the burden. It only mentions markdown_body and description projection plus the header-injected ids; it says nothing about scope, scope_id, entity_id, entity_type, tags, metadata_json, or change_summary. Compensation is partial and leaves most params ambiguous.

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 (create or replace) plus resource (the single MEMORY document) and scope (USER or WORKSPACE). The constraint 'single MEMORY document' and 'Never create additional MEMORY rows' separates it from generic upserts and from sibling delete_scoped_memory/get_scoped_memory.

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

Usage Guidelines4/5

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

Explicit 'Use when: Use after merging an observation into the scoped memory document' gives a clear triggering context, and names the boundary (never create additional rows). No explicit when-not or named-alternative routing (e.g. vs get_scoped_memory), so short of 5.

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. 2 tool updates
    • Changedget_unique_filter_options1 field changed
      • changedInput schema / properties / filters / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "properties": {
        -        "fallback_fields": {
        -          "items": {
        -            "oneOf": [
        -              {
        -                "const": "FILTER_FIELD_SENIORITY",
        -                "title": "FILTER_FIELD_SENIORITY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_LOCATION",
        -                "title": "FILTER_FIELD_LOCATION"
        -              },
        -              {
        -                "const": "FILTER_FIELD_STRENGTH",
        -                "title": "FILTER_FIELD_STRENGTH"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CATEGORY",
        -                "title": "FILTER_FIELD_CATEGORY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONNECTOR_ID",
        -                "title": "FILTER_FIELD_CONNECTOR_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY",
        -                "title": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE",
        -                "title": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_DEPARTMENT",
        -                "title": "FILTER_FIELD_DEPARTMENT"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OWNER_ID",
        -                "title": "FILTER_FIELD_ACCOUNT_OWNER_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_INDUSTRY",
        -                "title": "FILTER_FIELD_ACCOUNT_INDUSTRY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_COUNTRY",
        -                "title": "FILTER_FIELD_ACCOUNT_COUNTRY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE",
        -                "title": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONFIDENCE",
        -                "title": "FILTER_FIELD_CONFIDENCE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_INTRO_VALUE",
        -                "title": "FILTER_FIELD_INTRO_VALUE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_ID",
        -                "title": "FILTER_FIELD_ACCOUNT_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_NAME",
        -                "title": "FILTER_FIELD_ACCOUNT_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_DOMAIN",
        -                "title": "FILTER_FIELD_ACCOUNT_DOMAIN"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OWNER_NAME",
        -                "title": "FILTER_FIELD_ACCOUNT_OWNER_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_ID",
        -                "title": "FILTER_FIELD_CONTACT_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_NAME",
        -                "title": "FILTER_FIELD_CONTACT_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_EMAIL",
        -                "title": "FILTER_FIELD_CONTACT_EMAIL"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_TITLE",
        -                "title": "FILTER_FIELD_CONTACT_TITLE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_COMPANY_NAME",
        -                "title": "FILTER_FIELD_CONTACT_COMPANY_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SUPER_CONNECTOR_NAME",
        -                "title": "FILTER_FIELD_SUPER_CONNECTOR_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL",
        -                "title": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_ACCOUNT_ID",
        -                "title": "FILTER_FIELD_SOURCE_ACCOUNT_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_ACCOUNT_NAME",
        -                "title": "FILTER_FIELD_SOURCE_ACCOUNT_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN",
        -                "title": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_CONTACT_ID",
        -                "title": "FILTER_FIELD_SOURCE_CONTACT_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_CONTACT_NAME",
        -                "title": "FILTER_FIELD_SOURCE_CONTACT_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_ICP",
        -                "title": "FILTER_FIELD_ACCOUNT_ICP"
        -              },
        -              {
        -                "const": "FILTER_FIELD_TITLE_PERSONA",
        -                "title": "FILTER_FIELD_TITLE_PERSONA"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_CATEGORY",
        -                "title": "FILTER_FIELD_ACCOUNT_CATEGORY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONNECTOR_LOCATION",
        -                "title": "FILTER_FIELD_CONNECTOR_LOCATION"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY",
        -                "title": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OFFICE_STATE",
        -                "title": "FILTER_FIELD_ACCOUNT_OFFICE_STATE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OFFICE_CITY",
        -                "title": "FILTER_FIELD_ACCOUNT_OFFICE_CITY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_REFERENCE_ID",
        -                "title": "FILTER_FIELD_ACCOUNT_REFERENCE_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_STARRED",
        -                "title": "FILTER_FIELD_STARRED"
        -              }
        -            ]
        -          },
        -          "type": "array"
        -        },
        -        "field": {
        -          "description": "Which attribute to filter on.",
        -          "oneOf": [
        -            {
        -              "const": "FILTER_FIELD_SENIORITY",
        -              "description": "Target contact seniority level. Use IN operator. Stored values: 'Owner/CXO', 'VP', 'DIRECTOR', 'MANAGER', 'IC'. Documented alias OWNER_CXO is also accepted. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_SENIORITY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_LOCATION",
        -              "description": "Target contact's location (country code or location name string). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_LOCATION"
        -            },
        -            {
        -              "const": "FILTER_FIELD_STRENGTH",
        -              "description": "Relationship strength between the connector and target contact. Valid values: 'CONFIRMED', 'STRONG', 'LESS_LIKELY', 'UNLIKELY'. Prefer CONFIRMED and STRONG when looking for high-quality intro paths.",
        -              "title": "FILTER_FIELD_STRENGTH"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CATEGORY",
        -              "description": "Relationship category describing who the super connector is in relation to the company (e.g. Investor, Advisor, Board Member, Customer, Champion, Alumni, Leadership). IMPORTANT: this is NOT the same as seniority (how senior the contact is) or strength (how strong the tie is). Trigger words: investor(s), customer(s), board member(s), advisor(s), champion(s), alumni, leadership, partner(s). Values must be category UUIDs — NOT label strings. Resolution flow: (1) call get_workspace_categories, (2) filter to relationship_type SUPER_CONNECTORS and is_deleted false, (3) match user intent to closest label(s) — OR all plausible matches, (4) use those id UUIDs as filter values.",
        -              "title": "FILTER_FIELD_CATEGORY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONNECTOR_ID",
        -              "description": "RECOMMENDED over FILTER_FIELD_SUPER_CONNECTOR_NAME when the connector user_id is known. Exact match on one or more connector user UUIDs (Keycloak user IDs). Resolve connector names via search_workspace_members first to avoid silent zero-result failures from name prefix matching.",
        -              "title": "FILTER_FIELD_CONNECTOR_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY",
        -              "description": "Include or exclude contacts who have left the tracked company. Values: 'true' or 'false'.",
        -              "title": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE",
        -              "description": "One or more path type evidence signals used to establish the relationship. Use string names from the RelationshipPathType enum. User–Contact: 'LINKEDIN_CONNECTION' (direct LinkedIn connection), 'WORK_OVERLAP' (same company same time), 'EDUCATION_OVERLAP' (same school), 'CALENDAR_EVENT' (meetings on record), 'SELF_DECLARED_CONTACT' (connector declared they know the contact), 'SELF_DECLARED_CONTACT_DONT_KNOW' (connector declared they do not know the contact), 'SUPER_CONNECTOR_APPROVED' (super connector approved the path), 'SUPER_CONNECTOR_DECLINED' (super connector declined), 'TESTIMONIAL' (LinkedIn recommendation one wrote for the other), 'LINKEDIN_ENGAGEMENT' (connector comments on the contact's LinkedIn posts), 'LINKEDIN_POST_MENTION' (connector tagged the contact in one of the connector's own LinkedIn posts), 'PATENT' (connector and contact are co-inventors on a patent), 'PUBLICATION' (connector and contact co-authored a paper or article). User–Account: 'BOARD_MEMBER', 'COMMON_BOARD_HOP' (P1 → P2 via shared board seat), 'ADVISOR', 'LEADERSHIP', 'EMPLOYEE', 'INVESTOR', 'ACCOUNT_ALUMNI' (connector previously worked at target account), 'SELF_DECLARED_ACCOUNT' (connector declared a relationship to the account), 'SELF_DECLARED_ACCOUNT_DONT_KNOW', 'FIRM_PORTFOLIO' (connector works at an investment firm that backed the account). Company–Account: 'COMMON_INVESTOR', 'COMMON_INVESTOR_HOP', 'PORTFOLIO' (a portfolio company of this workspace's investor firm). Contact–Account: 'COMPANY_ALUMNI' (worked at same company at different times). Account insight: 'ACCOUNT_INSIGHT_BOARD_ADVISOR', 'ACCOUNT_INSIGHT_BOARD_ADVISOR_VIA_CONTACT'. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_DEPARTMENT",
        -              "description": "Target contact's department (free-text match). Values are department name strings (e.g. 'Engineering', 'Sales', 'Marketing'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_DEPARTMENT"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OWNER_ID",
        -              "description": "RECOMMENDED over FILTER_FIELD_ACCOUNT_OWNER_NAME when the owner user_id is known. Exact match on CRM account owner user UUID (Keycloak user ID). Resolve owner names via search_workspace_members first.",
        -              "title": "FILTER_FIELD_ACCOUNT_OWNER_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_INDUSTRY",
        -              "description": "Filter by target account industry. Values are industry name strings (e.g. 'Software', 'Financial Services'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_INDUSTRY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_COUNTRY",
        -              "description": "Filter by target account's country. Values are country name strings (e.g. 'United States', 'Germany'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_COUNTRY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE",
        -              "description": "Filter by target account employee headcount range. Valid values: '1', '2-10', '11-50', '51-200', '201-500', '501-1000', '1001-5000', '5001-10000', '10001+'. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONFIDENCE",
        -              "description": "GPT scoring confidence level for the relationship assessment. Valid values: 'High', 'Medium', 'Low'. Use 'High' to restrict results to relationships the scoring model is most certain about. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONFIDENCE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_INTRO_VALUE",
        -              "description": "Assessed value of requesting an introduction through this relationship path. Valid values: 'High', 'Medium', 'Low'. Determined by the Boomerang scoring engine based on strength, seniority, and recency signals. Use 'High' to prioritize the best intro opportunities. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_INTRO_VALUE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_ID",
        -              "description": "Filter by CRM account UUID. Values are account ID strings. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_NAME",
        -              "description": "Filter by target account name (prefix match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_DOMAIN",
        -              "description": "Filter by target account website domain (e.g. 'acme.com'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_DOMAIN"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OWNER_NAME",
        -              "description": "Filter by CRM account owner first OR last name, prefix match on ONE name part only (e.g. [\"John\"] or [\"Smith\"] — NOT \"John Smith\" as one string, which silently returns zero results). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_ACCOUNT_OWNER_ID when user_id is known (resolve via search_workspace_members).",
        -              "title": "FILTER_FIELD_ACCOUNT_OWNER_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_ID",
        -              "description": "RECOMMENDED over FILTER_FIELD_CONTACT_NAME when the contact UUID is known. Exact match on target contact UUID. Resolve contact names via search_contacts first.",
        -              "title": "FILTER_FIELD_CONTACT_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_NAME",
        -              "description": "Filter by target contact first OR last name, prefix match on ONE name part only (e.g. [\"Jane\"] or [\"Doe\"] — NOT \"Jane Doe\" as one string, which silently returns zero results). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_CONTACT_ID when contact UUID is known (resolve via search_contacts).",
        -              "title": "FILTER_FIELD_CONTACT_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_EMAIL",
        -              "description": "Filter by target contact email address (prefix or exact match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONTACT_EMAIL"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_TITLE",
        -              "description": "Filter by target contact job title (prefix match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONTACT_TITLE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_COMPANY_NAME",
        -              "description": "Filter by the company name associated with the target contact — typically the target account name (prefix match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONTACT_COMPANY_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SUPER_CONNECTOR_NAME",
        -              "description": "Filter by super connector's first OR last name, prefix match on ONE name part only (e.g. [\"Steven\"] or [\"Hagler\"] — NOT \"Steven Hagler\" as a single combined string, which will silently return zero results rather than an error). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_CONNECTOR_ID instead whenever the connector's user_id is already known (e.g. from search_workspace_members) — it does an exact match and avoids the silent zero-result failure mode of name-based prefix matching, especially for people with common or multi-word names.",
        -              "title": "FILTER_FIELD_SUPER_CONNECTOR_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL",
        -              "description": "Filter by super connector email address (prefix or exact match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_ACCOUNT_ID",
        -              "description": "Filter by source company UUID — for Account→Account path types (COMMON_INVESTOR, COMMON_BOARD_HOP, ACCOUNT_ALUMNI, SELF_DECLARED_ACCOUNT, COMMON_INVESTOR_HOP, ACCOUNT_INSIGHT_BOARD_ADVISOR, etc.) where the source node is a company, not a user. Exact match. RECOMMENDED over FILTER_FIELD_SOURCE_ACCOUNT_NAME when the account UUID is known (resolve via search_accounts_with_filters first).",
        -              "title": "FILTER_FIELD_SOURCE_ACCOUNT_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_ACCOUNT_NAME",
        -              "description": "Filter by source company name (prefix/substring match) — for Account→Account path types. Use to answer questions like 'which accounts can Garuda Ventures help reach?'. ONE name token per value recommended for broad matching. Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_SOURCE_ACCOUNT_ID when the UUID is known.",
        -              "title": "FILTER_FIELD_SOURCE_ACCOUNT_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN",
        -              "description": "Filter by source company domain (exact or prefix match) — for Account→Account path types. E.g. 'garudaventures.com'. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_CONTACT_ID",
        -              "description": "Filter by source contact UUID — for Contact→Account path types (COMPANY_ALUMNI) where the source node is a contact. Exact match. RECOMMENDED over FILTER_FIELD_SOURCE_CONTACT_NAME when the UUID is known.",
        -              "title": "FILTER_FIELD_SOURCE_CONTACT_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_CONTACT_NAME",
        -              "description": "Filter by source contact first OR last name (prefix match) — for Contact→Account path types. ONE name token per value. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_SOURCE_CONTACT_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_ICP",
        -              "description": "Filter by target account ICP (Ideal Customer Profile) match status. Valid values: 'MATCH' (account matches ICP criteria), 'NO_MATCH' (account evaluated and does not match), 'NO_DATA' (insufficient data to evaluate), 'NO_ICP_DEFINED' (workspace has no ICP configured), 'PRE_MATCH' (pending evaluation). Use the special sentinel value 'null' to match accounts where the ICP field has not been set. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_ICP"
        -            },
        -            {
        -              "const": "FILTER_FIELD_TITLE_PERSONA",
        -              "description": "Buyer persona of the target contact, matched against the contact's title. Values are persona names, NOT job titles: 'BUYING_COMMITTEE' (functional buyers and users — the workspace's buying_committee_regex), 'EXTENDED_BUYING_COMMITTEE' (procurement / finance / IT / legal approval seats — extended_buying_committee_regex), 'LEADERSHIP' (C-suite and VP-level titles from the shared taxonomy, not board members, founders or partner/principal). Multiple values are OR-combined. A persona whose regex is not configured for the workspace is ignored.",
        -              "title": "FILTER_FIELD_TITLE_PERSONA"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_CATEGORY",
        -              "description": "Filter by the target account's category — the workspace's own classification of the account, distinct from ICP. Valid values: 'CUSTOMER', 'PROSPECT', 'OPEN_OPPORTUNITY', 'CLOSED_LOST', 'CHURNED', 'PARTNER', 'COMPETITOR', 'OTHER'. Use the special sentinel value 'null' to match accounts that have not been categorised. An account can carry several categories; multiple values are OR-combined (the account carries any of them), and NOT_IN keeps accounts carrying none of them. Do not confuse with FILTER_FIELD_CATEGORY, which filters on the super connector's category.",
        -              "title": "FILTER_FIELD_ACCOUNT_CATEGORY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONNECTOR_LOCATION",
        -              "description": "Location of the connector (super connector), matched case-insensitively against city, country, or ISO country code (e.g. 'US', 'San Francisco', 'United States'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONNECTOR_LOCATION"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY",
        -              "title": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OFFICE_STATE",
        -              "title": "FILTER_FIELD_ACCOUNT_OFFICE_STATE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OFFICE_CITY",
        -              "title": "FILTER_FIELD_ACCOUNT_OFFICE_CITY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_REFERENCE_ID",
        -              "description": "Filter by the target account's CRM record ID — exact match on reference_id (e.g. Salesforce 18-character Account ID '001xx000003DGbQAAW', HubSpot company ID). Values are CRM IDs, NOT internal UUIDs. Use directly when the user supplies Salesforce/HubSpot IDs — do NOT call search_accounts_with_filters first to resolve them to UUIDs. Pass the id exactly as the CRM stores it: a 15-character Salesforce short id does not match the stored 18-character form, and the match is silent — wrong form returns zero rows, not an error. Only CRM-sourced accounts have a CRM id; accounts created inside Boomerang carry an internal 'BOOM-…' reference_id and never match here. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_REFERENCE_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_STARRED",
        -              "title": "FILTER_FIELD_STARRED"
        -            }
        -          ]
        -        },
        -        "operator": {
        -          "description": "How values are matched. Omit (or 'IN') to keep only rows matching any of the values — the default. Use 'NOT_IN' (aliases: 'NOT_EQUAL_TO', 'NE') to EXCLUDE rows matching any of the values, e.g. field=FILTER_FIELD_ACCOUNT_CATEGORY, operator='NOT_IN', values=['CUSTOMER'] returns paths to accounts that are not customers. A NOT_IN filter keeps rows where the entity exists but the field has no value on record, and excludes paths that have no such entity at all — 'account category not CUSTOMER' returns only paths that target an account, never User→Contact paths. Text filters (names, titles, domains, emails) match by substring, so NOT_IN on them excludes every row CONTAINING a value, not only exact matches — 'account name not [Acme]' also drops 'Acme Holdings'. Not supported on FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY — pass 'true'/'false' with IN instead.",
        -          "type": "string"
        -        },
        -        "values": {
        -          "description": "One or more filter values. Multiple values are OR-combined within the same field, AND across different fields. For FILTER_FIELD_SENIORITY use stored values 'Owner/CXO', 'VP', 'DIRECTOR', 'MANAGER', 'IC' (OWNER_CXO alias accepted). For FILTER_FIELD_STRENGTH use: 'CONFIRMED', 'STRONG', 'LESS_LIKELY', 'UNLIKELY'. For FILTER_FIELD_CATEGORY use category UUIDs resolved from get_workspace_categories (filter to SUPER_CONNECTORS, match by label, use id). For FILTER_FIELD_RELATIONSHIP_PATH_TYPE use RelationshipPathType enum names as strings — User–Contact: 'LINKEDIN_CONNECTION', 'WORK_OVERLAP', 'EDUCATION_OVERLAP', 'CALENDAR_EVENT', 'SELF_DECLARED_CONTACT', 'SELF_DECLARED_CONTACT_DONT_KNOW', 'SUPER_CONNECTOR_APPROVED', 'SUPER_CONNECTOR_DECLINED', 'TESTIMONIAL', 'LINKEDIN_ENGAGEMENT', 'LINKEDIN_POST_MENTION', 'PATENT', 'PUBLICATION'; User–Account: 'BOARD_MEMBER', 'COMMON_BOARD_HOP', 'ADVISOR', 'LEADERSHIP', 'EMPLOYEE', 'INVESTOR', 'ACCOUNT_ALUMNI', 'SELF_DECLARED_ACCOUNT', 'SELF_DECLARED_ACCOUNT_DONT_KNOW', 'FIRM_PORTFOLIO'; Company–Account: 'COMMON_INVESTOR', 'COMMON_INVESTOR_HOP', 'PORTFOLIO'; Contact–Account: 'COMPANY_ALUMNI'; Account insight: 'ACCOUNT_INSIGHT_BOARD_ADVISOR', 'ACCOUNT_INSIGHT_BOARD_ADVISOR_VIA_CONTACT'. For FILTER_FIELD_CONFIDENCE use: 'High', 'Medium', 'Low'. For FILTER_FIELD_INTRO_VALUE use: 'High', 'Medium', 'Low'. For FILTER_FIELD_SOURCE_ACCOUNT_ID/FILTER_FIELD_SOURCE_CONTACT_ID use UUIDs (resolve via search_accounts_with_filters or search_contacts first). For FILTER_FIELD_ACCOUNT_REFERENCE_ID pass CRM record IDs as-is (e.g. Salesforce '001xx000003DGbQAAW') — exact match, no UUID resolution needed. For FILTER_FIELD_ACCOUNT_ICP use: 'MATCH', 'NO_MATCH', 'NO_DATA', 'NO_ICP_DEFINED', 'PRE_MATCH', or the sentinel 'null' to match accounts with no ICP value set. Person-name filters (FILTER_FIELD_SUPER_CONNECTOR_NAME, FILTER_FIELD_CONTACT_NAME, FILTER_FIELD_ACCOUNT_OWNER_NAME, FILTER_FIELD_SOURCE_ACCOUNT_NAME, FILTER_FIELD_SOURCE_CONTACT_NAME): pass ONE first or last name token per value — never a full name like 'Jane Doe' or 'Garuda Ventures' as a single string, which silently returns zero results. Prefer ID-based filters when UUIDs are known.",
        -          "items": {
        -            "type": "string"
        -          },
        -          "type": "array"
        -        }
        -      },
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "properties": {
        +        "fallback_fields": {
        +          "items": {
        +            "oneOf": [
        +              {
        +                "const": "FILTER_FIELD_SENIORITY",
        +                "title": "FILTER_FIELD_SENIORITY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_LOCATION",
        +                "title": "FILTER_FIELD_LOCATION"
        +              },
        +              {
        +                "const": "FILTER_FIELD_STRENGTH",
        +                "title": "FILTER_FIELD_STRENGTH"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CATEGORY",
        +                "title": "FILTER_FIELD_CATEGORY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONNECTOR_ID",
        +                "title": "FILTER_FIELD_CONNECTOR_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY",
        +                "title": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE",
        +                "title": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_DEPARTMENT",
        +                "title": "FILTER_FIELD_DEPARTMENT"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OWNER_ID",
        +                "title": "FILTER_FIELD_ACCOUNT_OWNER_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_INDUSTRY",
        +                "title": "FILTER_FIELD_ACCOUNT_INDUSTRY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_COUNTRY",
        +                "title": "FILTER_FIELD_ACCOUNT_COUNTRY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE",
        +                "title": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONFIDENCE",
        +                "title": "FILTER_FIELD_CONFIDENCE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_INTRO_VALUE",
        +                "title": "FILTER_FIELD_INTRO_VALUE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_ID",
        +                "title": "FILTER_FIELD_ACCOUNT_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_NAME",
        +                "title": "FILTER_FIELD_ACCOUNT_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_DOMAIN",
        +                "title": "FILTER_FIELD_ACCOUNT_DOMAIN"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OWNER_NAME",
        +                "title": "FILTER_FIELD_ACCOUNT_OWNER_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_ID",
        +                "title": "FILTER_FIELD_CONTACT_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_NAME",
        +                "title": "FILTER_FIELD_CONTACT_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_EMAIL",
        +                "title": "FILTER_FIELD_CONTACT_EMAIL"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_TITLE",
        +                "title": "FILTER_FIELD_CONTACT_TITLE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_COMPANY_NAME",
        +                "title": "FILTER_FIELD_CONTACT_COMPANY_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SUPER_CONNECTOR_NAME",
        +                "title": "FILTER_FIELD_SUPER_CONNECTOR_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL",
        +                "title": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_ACCOUNT_ID",
        +                "title": "FILTER_FIELD_SOURCE_ACCOUNT_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_ACCOUNT_NAME",
        +                "title": "FILTER_FIELD_SOURCE_ACCOUNT_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN",
        +                "title": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_CONTACT_ID",
        +                "title": "FILTER_FIELD_SOURCE_CONTACT_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_CONTACT_NAME",
        +                "title": "FILTER_FIELD_SOURCE_CONTACT_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_ICP",
        +                "title": "FILTER_FIELD_ACCOUNT_ICP"
        +              },
        +              {
        +                "const": "FILTER_FIELD_TITLE_PERSONA",
        +                "title": "FILTER_FIELD_TITLE_PERSONA"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_CATEGORY",
        +                "title": "FILTER_FIELD_ACCOUNT_CATEGORY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONNECTOR_LOCATION",
        +                "title": "FILTER_FIELD_CONNECTOR_LOCATION"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY",
        +                "title": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OFFICE_STATE",
        +                "title": "FILTER_FIELD_ACCOUNT_OFFICE_STATE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OFFICE_CITY",
        +                "title": "FILTER_FIELD_ACCOUNT_OFFICE_CITY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_REFERENCE_ID",
        +                "title": "FILTER_FIELD_ACCOUNT_REFERENCE_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_STARRED",
        +                "title": "FILTER_FIELD_STARRED"
        +              }
        +            ]
        +          },
        +          "type": "array"
        +        },
        +        "field": {
        +          "description": "Which attribute to filter on.",
        +          "oneOf": [
        +            {
        +              "const": "FILTER_FIELD_SENIORITY",
        +              "description": "Target contact seniority level. Use IN operator. Stored values: 'Owner/CXO', 'VP', 'DIRECTOR', 'MANAGER', 'IC'. Documented alias OWNER_CXO is also accepted. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_SENIORITY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_LOCATION",
        +              "description": "Target contact's location (country code or location name string). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_LOCATION"
        +            },
        +            {
        +              "const": "FILTER_FIELD_STRENGTH",
        +              "description": "Relationship strength between the connector and target contact. Valid values: 'CONFIRMED', 'STRONG', 'LESS_LIKELY', 'UNLIKELY'. Prefer CONFIRMED and STRONG when looking for high-quality intro paths.",
        +              "title": "FILTER_FIELD_STRENGTH"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CATEGORY",
        +              "description": "Relationship category describing who the super connector is in relation to the company (e.g. Investor, Advisor, Board Member, Customer, Champion, Alumni, Leadership). IMPORTANT: this is NOT the same as seniority (how senior the contact is) or strength (how strong the tie is). Trigger words: investor(s), customer(s), board member(s), advisor(s), champion(s), alumni, leadership, partner(s). Values must be category UUIDs — NOT label strings. Resolution flow: (1) call get_workspace_categories, (2) filter to relationship_type SUPER_CONNECTORS and is_deleted false, (3) match user intent to closest label(s) — OR all plausible matches, (4) use those id UUIDs as filter values.",
        +              "title": "FILTER_FIELD_CATEGORY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONNECTOR_ID",
        +              "description": "RECOMMENDED over FILTER_FIELD_SUPER_CONNECTOR_NAME when the connector user_id is known. Exact match on one or more connector user UUIDs (Keycloak user IDs). Resolve connector names via search_workspace_members first to avoid silent zero-result failures from name prefix matching.",
        +              "title": "FILTER_FIELD_CONNECTOR_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY",
        +              "description": "Include or exclude contacts who have left the tracked company. Values: 'true' or 'false'.",
        +              "title": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE",
        +              "description": "One or more path type evidence signals used to establish the relationship. Use string names from the RelationshipPathType enum. User–Contact: 'LINKEDIN_CONNECTION' (direct LinkedIn connection), 'WORK_OVERLAP' (same company same time), 'EDUCATION_OVERLAP' (same school), 'CALENDAR_EVENT' (meetings on record), 'SELF_DECLARED_CONTACT' (connector declared they know the contact), 'SELF_DECLARED_CONTACT_DONT_KNOW' (connector declared they do not know the contact), 'SUPER_CONNECTOR_APPROVED' (super connector approved the path), 'SUPER_CONNECTOR_DECLINED' (super connector declined), 'TESTIMONIAL' (LinkedIn recommendation one wrote for the other), 'LINKEDIN_ENGAGEMENT' (connector comments on the contact's LinkedIn posts), 'LINKEDIN_POST_MENTION' (connector tagged the contact in one of the connector's own LinkedIn posts), 'PATENT' (connector and contact are co-inventors on a patent), 'PUBLICATION' (connector and contact co-authored a paper or article), 'AFFILIATION_OVERLAP' (connector and contact share an investor / advisor / board / member tie to the same small company — not co-employment). User–Account: 'BOARD_MEMBER', 'COMMON_BOARD_HOP' (P1 → P2 via shared board seat), 'ADVISOR', 'LEADERSHIP', 'EMPLOYEE', 'INVESTOR', 'ACCOUNT_ALUMNI' (connector previously worked at target account), 'SELF_DECLARED_ACCOUNT' (connector declared a relationship to the account), 'SELF_DECLARED_ACCOUNT_DONT_KNOW', 'FIRM_PORTFOLIO' (connector works at an investment firm that backed the account). Company–Account: 'COMMON_INVESTOR', 'COMMON_INVESTOR_HOP', 'PORTFOLIO' (a portfolio company of this workspace's investor firm). Contact–Account: 'COMPANY_ALUMNI' (worked at same company at different times). Account insight: 'ACCOUNT_INSIGHT_BOARD_ADVISOR', 'ACCOUNT_INSIGHT_BOARD_ADVISOR_VIA_CONTACT'. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_DEPARTMENT",
        +              "description": "Target contact's department (free-text match). Values are department name strings (e.g. 'Engineering', 'Sales', 'Marketing'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_DEPARTMENT"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OWNER_ID",
        +              "description": "RECOMMENDED over FILTER_FIELD_ACCOUNT_OWNER_NAME when the owner user_id is known. Exact match on CRM account owner user UUID (Keycloak user ID). Resolve owner names via search_workspace_members first.",
        +              "title": "FILTER_FIELD_ACCOUNT_OWNER_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_INDUSTRY",
        +              "description": "Filter by target account industry. Values are industry name strings (e.g. 'Software', 'Financial Services'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_INDUSTRY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_COUNTRY",
        +              "description": "Filter by target account's country. Values are country name strings (e.g. 'United States', 'Germany'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_COUNTRY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE",
        +              "description": "Filter by target account employee headcount range. Valid values: '1', '2-10', '11-50', '51-200', '201-500', '501-1000', '1001-5000', '5001-10000', '10001+'. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONFIDENCE",
        +              "description": "GPT scoring confidence level for the relationship assessment. Valid values: 'High', 'Medium', 'Low'. Use 'High' to restrict results to relationships the scoring model is most certain about. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONFIDENCE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_INTRO_VALUE",
        +              "description": "Assessed value of requesting an introduction through this relationship path. Valid values: 'High', 'Medium', 'Low'. Determined by the Boomerang scoring engine based on strength, seniority, and recency signals. Use 'High' to prioritize the best intro opportunities. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_INTRO_VALUE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_ID",
        +              "description": "Filter by CRM account UUID. Values are account ID strings. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_NAME",
        +              "description": "Filter by target account name (prefix match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_DOMAIN",
        +              "description": "Filter by target account website domain (e.g. 'acme.com'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_DOMAIN"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OWNER_NAME",
        +              "description": "Filter by CRM account owner first OR last name, prefix match on ONE name part only (e.g. [\"John\"] or [\"Smith\"] — NOT \"John Smith\" as one string, which silently returns zero results). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_ACCOUNT_OWNER_ID when user_id is known (resolve via search_workspace_members).",
        +              "title": "FILTER_FIELD_ACCOUNT_OWNER_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_ID",
        +              "description": "RECOMMENDED over FILTER_FIELD_CONTACT_NAME when the contact UUID is known. Exact match on target contact UUID. Resolve contact names via search_contacts first.",
        +              "title": "FILTER_FIELD_CONTACT_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_NAME",
        +              "description": "Filter by target contact first OR last name, prefix match on ONE name part only (e.g. [\"Jane\"] or [\"Doe\"] — NOT \"Jane Doe\" as one string, which silently returns zero results). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_CONTACT_ID when contact UUID is known (resolve via search_contacts).",
        +              "title": "FILTER_FIELD_CONTACT_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_EMAIL",
        +              "description": "Filter by target contact email address (prefix or exact match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONTACT_EMAIL"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_TITLE",
        +              "description": "Filter by target contact job title (prefix match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONTACT_TITLE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_COMPANY_NAME",
        +              "description": "Filter by the company name associated with the target contact — typically the target account name (prefix match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONTACT_COMPANY_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SUPER_CONNECTOR_NAME",
        +              "description": "Filter by super connector's first OR last name, prefix match on ONE name part only (e.g. [\"Steven\"] or [\"Hagler\"] — NOT \"Steven Hagler\" as a single combined string, which will silently return zero results rather than an error). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_CONNECTOR_ID instead whenever the connector's user_id is already known (e.g. from search_workspace_members) — it does an exact match and avoids the silent zero-result failure mode of name-based prefix matching, especially for people with common or multi-word names.",
        +              "title": "FILTER_FIELD_SUPER_CONNECTOR_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL",
        +              "description": "Filter by super connector email address (prefix or exact match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_ACCOUNT_ID",
        +              "description": "Filter by source company UUID — for Account→Account path types (COMMON_INVESTOR, COMMON_BOARD_HOP, ACCOUNT_ALUMNI, SELF_DECLARED_ACCOUNT, COMMON_INVESTOR_HOP, ACCOUNT_INSIGHT_BOARD_ADVISOR, etc.) where the source node is a company, not a user. Exact match. RECOMMENDED over FILTER_FIELD_SOURCE_ACCOUNT_NAME when the account UUID is known (resolve via search_accounts_with_filters first).",
        +              "title": "FILTER_FIELD_SOURCE_ACCOUNT_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_ACCOUNT_NAME",
        +              "description": "Filter by source company name (prefix/substring match) — for Account→Account path types. Use to answer questions like 'which accounts can Garuda Ventures help reach?'. ONE name token per value recommended for broad matching. Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_SOURCE_ACCOUNT_ID when the UUID is known.",
        +              "title": "FILTER_FIELD_SOURCE_ACCOUNT_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN",
        +              "description": "Filter by source company domain (exact or prefix match) — for Account→Account path types. E.g. 'garudaventures.com'. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_CONTACT_ID",
        +              "description": "Filter by source contact UUID — for Contact→Account path types (COMPANY_ALUMNI) where the source node is a contact. Exact match. RECOMMENDED over FILTER_FIELD_SOURCE_CONTACT_NAME when the UUID is known.",
        +              "title": "FILTER_FIELD_SOURCE_CONTACT_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_CONTACT_NAME",
        +              "description": "Filter by source contact first OR last name (prefix match) — for Contact→Account path types. ONE name token per value. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_SOURCE_CONTACT_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_ICP",
        +              "description": "Filter by target account ICP (Ideal Customer Profile) match status. Valid values: 'MATCH' (account matches ICP criteria), 'NO_MATCH' (account evaluated and does not match), 'NO_DATA' (insufficient data to evaluate), 'NO_ICP_DEFINED' (workspace has no ICP configured), 'PRE_MATCH' (pending evaluation). Use the special sentinel value 'null' to match accounts where the ICP field has not been set. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_ICP"
        +            },
        +            {
        +              "const": "FILTER_FIELD_TITLE_PERSONA",
        +              "description": "Buyer persona of the target contact, matched against the contact's title. Values are persona names, NOT job titles: 'BUYING_COMMITTEE' (functional buyers and users — the workspace's buying_committee_regex), 'EXTENDED_BUYING_COMMITTEE' (procurement / finance / IT / legal approval seats — extended_buying_committee_regex), 'LEADERSHIP' (C-suite and VP-level titles from the shared taxonomy, not board members, founders or partner/principal). Multiple values are OR-combined. A persona whose regex is not configured for the workspace is ignored.",
        +              "title": "FILTER_FIELD_TITLE_PERSONA"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_CATEGORY",
        +              "description": "Filter by the target account's category — the workspace's own classification of the account, distinct from ICP. Valid values: 'CUSTOMER', 'PROSPECT', 'OPEN_OPPORTUNITY', 'CLOSED_LOST', 'CHURNED', 'PARTNER', 'COMPETITOR', 'OTHER'. Use the special sentinel value 'null' to match accounts that have not been categorised. An account can carry several categories; multiple values are OR-combined (the account carries any of them), and NOT_IN keeps accounts carrying none of them. Do not confuse with FILTER_FIELD_CATEGORY, which filters on the super connector's category.",
        +              "title": "FILTER_FIELD_ACCOUNT_CATEGORY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONNECTOR_LOCATION",
        +              "description": "Location of the connector (super connector), matched case-insensitively against city, country, or ISO country code (e.g. 'US', 'San Francisco', 'United States'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONNECTOR_LOCATION"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY",
        +              "title": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OFFICE_STATE",
        +              "title": "FILTER_FIELD_ACCOUNT_OFFICE_STATE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OFFICE_CITY",
        +              "title": "FILTER_FIELD_ACCOUNT_OFFICE_CITY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_REFERENCE_ID",
        +              "description": "Filter by the target account's CRM record ID — exact match on reference_id (e.g. Salesforce 18-character Account ID '001xx000003DGbQAAW', HubSpot company ID). Values are CRM IDs, NOT internal UUIDs. Use directly when the user supplies Salesforce/HubSpot IDs — do NOT call search_accounts_with_filters first to resolve them to UUIDs. Pass the id exactly as the CRM stores it: a 15-character Salesforce short id does not match the stored 18-character form, and the match is silent — wrong form returns zero rows, not an error. Only CRM-sourced accounts have a CRM id; accounts created inside Boomerang carry an internal 'BOOM-…' reference_id and never match here. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_REFERENCE_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_STARRED",
        +              "title": "FILTER_FIELD_STARRED"
        +            }
        +          ]
        +        },
        +        "operator": {
        +          "description": "How values are matched. Omit (or 'IN') to keep only rows matching any of the values — the default. Use 'NOT_IN' (aliases: 'NOT_EQUAL_TO', 'NE') to EXCLUDE rows matching any of the values, e.g. field=FILTER_FIELD_ACCOUNT_CATEGORY, operator='NOT_IN', values=['CUSTOMER'] returns paths to accounts that are not customers. A NOT_IN filter keeps rows where the entity exists but the field has no value on record, and excludes paths that have no such entity at all — 'account category not CUSTOMER' returns only paths that target an account, never User→Contact paths. Text filters (names, titles, domains, emails) match by substring, so NOT_IN on them excludes every row CONTAINING a value, not only exact matches — 'account name not [Acme]' also drops 'Acme Holdings'. Not supported on FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY — pass 'true'/'false' with IN instead.",
        +          "type": "string"
        +        },
        +        "values": {
        +          "description": "One or more filter values. Multiple values are OR-combined within the same field, AND across different fields. For FILTER_FIELD_SENIORITY use stored values 'Owner/CXO', 'VP', 'DIRECTOR', 'MANAGER', 'IC' (OWNER_CXO alias accepted). For FILTER_FIELD_STRENGTH use: 'CONFIRMED', 'STRONG', 'LESS_LIKELY', 'UNLIKELY'. For FILTER_FIELD_CATEGORY use category UUIDs resolved from get_workspace_categories (filter to SUPER_CONNECTORS, match by label, use id). For FILTER_FIELD_RELATIONSHIP_PATH_TYPE use RelationshipPathType enum names as strings — User–Contact: 'LINKEDIN_CONNECTION', 'WORK_OVERLAP', 'EDUCATION_OVERLAP', 'CALENDAR_EVENT', 'SELF_DECLARED_CONTACT', 'SELF_DECLARED_CONTACT_DONT_KNOW', 'SUPER_CONNECTOR_APPROVED', 'SUPER_CONNECTOR_DECLINED', 'TESTIMONIAL', 'LINKEDIN_ENGAGEMENT', 'LINKEDIN_POST_MENTION', 'PATENT', 'PUBLICATION', 'AFFILIATION_OVERLAP'; User–Account: 'BOARD_MEMBER', 'COMMON_BOARD_HOP', 'ADVISOR', 'LEADERSHIP', 'EMPLOYEE', 'INVESTOR', 'ACCOUNT_ALUMNI', 'SELF_DECLARED_ACCOUNT', 'SELF_DECLARED_ACCOUNT_DONT_KNOW', 'FIRM_PORTFOLIO'; Company–Account: 'COMMON_INVESTOR', 'COMMON_INVESTOR_HOP', 'PORTFOLIO'; Contact–Account: 'COMPANY_ALUMNI'; Account insight: 'ACCOUNT_INSIGHT_BOARD_ADVISOR', 'ACCOUNT_INSIGHT_BOARD_ADVISOR_VIA_CONTACT'. For FILTER_FIELD_CONFIDENCE use: 'High', 'Medium', 'Low'. For FILTER_FIELD_INTRO_VALUE use: 'High', 'Medium', 'Low'. For FILTER_FIELD_SOURCE_ACCOUNT_ID/FILTER_FIELD_SOURCE_CONTACT_ID use UUIDs (resolve via search_accounts_with_filters or search_contacts first). For FILTER_FIELD_ACCOUNT_REFERENCE_ID pass CRM record IDs as-is (e.g. Salesforce '001xx000003DGbQAAW') — exact match, no UUID resolution needed. For FILTER_FIELD_ACCOUNT_ICP use: 'MATCH', 'NO_MATCH', 'NO_DATA', 'NO_ICP_DEFINED', 'PRE_MATCH', or the sentinel 'null' to match accounts with no ICP value set. Person-name filters (FILTER_FIELD_SUPER_CONNECTOR_NAME, FILTER_FIELD_CONTACT_NAME, FILTER_FIELD_ACCOUNT_OWNER_NAME, FILTER_FIELD_SOURCE_ACCOUNT_NAME, FILTER_FIELD_SOURCE_CONTACT_NAME): pass ONE first or last name token per value — never a full name like 'Jane Doe' or 'Garuda Ventures' as a single string, which silently returns zero results. Prefer ID-based filters when UUIDs are known.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedsearch_warm_intro_relationships2 fields changed
      • changedInput schema / properties / filters / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "properties": {
        -        "fallback_fields": {
        -          "items": {
        -            "oneOf": [
        -              {
        -                "const": "FILTER_FIELD_SENIORITY",
        -                "title": "FILTER_FIELD_SENIORITY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_LOCATION",
        -                "title": "FILTER_FIELD_LOCATION"
        -              },
        -              {
        -                "const": "FILTER_FIELD_STRENGTH",
        -                "title": "FILTER_FIELD_STRENGTH"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CATEGORY",
        -                "title": "FILTER_FIELD_CATEGORY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONNECTOR_ID",
        -                "title": "FILTER_FIELD_CONNECTOR_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY",
        -                "title": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE",
        -                "title": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_DEPARTMENT",
        -                "title": "FILTER_FIELD_DEPARTMENT"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OWNER_ID",
        -                "title": "FILTER_FIELD_ACCOUNT_OWNER_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_INDUSTRY",
        -                "title": "FILTER_FIELD_ACCOUNT_INDUSTRY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_COUNTRY",
        -                "title": "FILTER_FIELD_ACCOUNT_COUNTRY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE",
        -                "title": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONFIDENCE",
        -                "title": "FILTER_FIELD_CONFIDENCE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_INTRO_VALUE",
        -                "title": "FILTER_FIELD_INTRO_VALUE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_ID",
        -                "title": "FILTER_FIELD_ACCOUNT_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_NAME",
        -                "title": "FILTER_FIELD_ACCOUNT_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_DOMAIN",
        -                "title": "FILTER_FIELD_ACCOUNT_DOMAIN"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OWNER_NAME",
        -                "title": "FILTER_FIELD_ACCOUNT_OWNER_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_ID",
        -                "title": "FILTER_FIELD_CONTACT_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_NAME",
        -                "title": "FILTER_FIELD_CONTACT_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_EMAIL",
        -                "title": "FILTER_FIELD_CONTACT_EMAIL"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_TITLE",
        -                "title": "FILTER_FIELD_CONTACT_TITLE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_COMPANY_NAME",
        -                "title": "FILTER_FIELD_CONTACT_COMPANY_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SUPER_CONNECTOR_NAME",
        -                "title": "FILTER_FIELD_SUPER_CONNECTOR_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL",
        -                "title": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_ACCOUNT_ID",
        -                "title": "FILTER_FIELD_SOURCE_ACCOUNT_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_ACCOUNT_NAME",
        -                "title": "FILTER_FIELD_SOURCE_ACCOUNT_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN",
        -                "title": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_CONTACT_ID",
        -                "title": "FILTER_FIELD_SOURCE_CONTACT_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_CONTACT_NAME",
        -                "title": "FILTER_FIELD_SOURCE_CONTACT_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_ICP",
        -                "title": "FILTER_FIELD_ACCOUNT_ICP"
        -              },
        -              {
        -                "const": "FILTER_FIELD_TITLE_PERSONA",
        -                "title": "FILTER_FIELD_TITLE_PERSONA"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_CATEGORY",
        -                "title": "FILTER_FIELD_ACCOUNT_CATEGORY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONNECTOR_LOCATION",
        -                "title": "FILTER_FIELD_CONNECTOR_LOCATION"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY",
        -                "title": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OFFICE_STATE",
        -                "title": "FILTER_FIELD_ACCOUNT_OFFICE_STATE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OFFICE_CITY",
        -                "title": "FILTER_FIELD_ACCOUNT_OFFICE_CITY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_REFERENCE_ID",
        -                "title": "FILTER_FIELD_ACCOUNT_REFERENCE_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_STARRED",
        -                "title": "FILTER_FIELD_STARRED"
        -              }
        -            ]
        -          },
        -          "type": "array"
        -        },
        -        "field": {
        -          "description": "Which attribute to filter on.",
        -          "oneOf": [
        -            {
        -              "const": "FILTER_FIELD_SENIORITY",
        -              "description": "Target contact seniority level. Use IN operator. Stored values: 'Owner/CXO', 'VP', 'DIRECTOR', 'MANAGER', 'IC'. Documented alias OWNER_CXO is also accepted. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_SENIORITY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_LOCATION",
        -              "description": "Target contact's location (country code or location name string). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_LOCATION"
        -            },
        -            {
        -              "const": "FILTER_FIELD_STRENGTH",
        -              "description": "Relationship strength between the connector and target contact. Valid values: 'CONFIRMED', 'STRONG', 'LESS_LIKELY', 'UNLIKELY'. Prefer CONFIRMED and STRONG when looking for high-quality intro paths.",
        -              "title": "FILTER_FIELD_STRENGTH"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CATEGORY",
        -              "description": "Relationship category describing who the super connector is in relation to the company (e.g. Investor, Advisor, Board Member, Customer, Champion, Alumni, Leadership). IMPORTANT: this is NOT the same as seniority (how senior the contact is) or strength (how strong the tie is). Trigger words: investor(s), customer(s), board member(s), advisor(s), champion(s), alumni, leadership, partner(s). Values must be category UUIDs — NOT label strings. Resolution flow: (1) call get_workspace_categories, (2) filter to relationship_type SUPER_CONNECTORS and is_deleted false, (3) match user intent to closest label(s) — OR all plausible matches, (4) use those id UUIDs as filter values.",
        -              "title": "FILTER_FIELD_CATEGORY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONNECTOR_ID",
        -              "description": "RECOMMENDED over FILTER_FIELD_SUPER_CONNECTOR_NAME when the connector user_id is known. Exact match on one or more connector user UUIDs (Keycloak user IDs). Resolve connector names via search_workspace_members first to avoid silent zero-result failures from name prefix matching.",
        -              "title": "FILTER_FIELD_CONNECTOR_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY",
        -              "description": "Include or exclude contacts who have left the tracked company. Values: 'true' or 'false'.",
        -              "title": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE",
        -              "description": "One or more path type evidence signals used to establish the relationship. Use string names from the RelationshipPathType enum. User–Contact: 'LINKEDIN_CONNECTION' (direct LinkedIn connection), 'WORK_OVERLAP' (same company same time), 'EDUCATION_OVERLAP' (same school), 'CALENDAR_EVENT' (meetings on record), 'SELF_DECLARED_CONTACT' (connector declared they know the contact), 'SELF_DECLARED_CONTACT_DONT_KNOW' (connector declared they do not know the contact), 'SUPER_CONNECTOR_APPROVED' (super connector approved the path), 'SUPER_CONNECTOR_DECLINED' (super connector declined), 'TESTIMONIAL' (LinkedIn recommendation one wrote for the other), 'LINKEDIN_ENGAGEMENT' (connector comments on the contact's LinkedIn posts), 'LINKEDIN_POST_MENTION' (connector tagged the contact in one of the connector's own LinkedIn posts), 'PATENT' (connector and contact are co-inventors on a patent), 'PUBLICATION' (connector and contact co-authored a paper or article). User–Account: 'BOARD_MEMBER', 'COMMON_BOARD_HOP' (P1 → P2 via shared board seat), 'ADVISOR', 'LEADERSHIP', 'EMPLOYEE', 'INVESTOR', 'ACCOUNT_ALUMNI' (connector previously worked at target account), 'SELF_DECLARED_ACCOUNT' (connector declared a relationship to the account), 'SELF_DECLARED_ACCOUNT_DONT_KNOW', 'FIRM_PORTFOLIO' (connector works at an investment firm that backed the account). Company–Account: 'COMMON_INVESTOR', 'COMMON_INVESTOR_HOP', 'PORTFOLIO' (a portfolio company of this workspace's investor firm). Contact–Account: 'COMPANY_ALUMNI' (worked at same company at different times). Account insight: 'ACCOUNT_INSIGHT_BOARD_ADVISOR', 'ACCOUNT_INSIGHT_BOARD_ADVISOR_VIA_CONTACT'. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_DEPARTMENT",
        -              "description": "Target contact's department (free-text match). Values are department name strings (e.g. 'Engineering', 'Sales', 'Marketing'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_DEPARTMENT"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OWNER_ID",
        -              "description": "RECOMMENDED over FILTER_FIELD_ACCOUNT_OWNER_NAME when the owner user_id is known. Exact match on CRM account owner user UUID (Keycloak user ID). Resolve owner names via search_workspace_members first.",
        -              "title": "FILTER_FIELD_ACCOUNT_OWNER_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_INDUSTRY",
        -              "description": "Filter by target account industry. Values are industry name strings (e.g. 'Software', 'Financial Services'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_INDUSTRY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_COUNTRY",
        -              "description": "Filter by target account's country. Values are country name strings (e.g. 'United States', 'Germany'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_COUNTRY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE",
        -              "description": "Filter by target account employee headcount range. Valid values: '1', '2-10', '11-50', '51-200', '201-500', '501-1000', '1001-5000', '5001-10000', '10001+'. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONFIDENCE",
        -              "description": "GPT scoring confidence level for the relationship assessment. Valid values: 'High', 'Medium', 'Low'. Use 'High' to restrict results to relationships the scoring model is most certain about. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONFIDENCE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_INTRO_VALUE",
        -              "description": "Assessed value of requesting an introduction through this relationship path. Valid values: 'High', 'Medium', 'Low'. Determined by the Boomerang scoring engine based on strength, seniority, and recency signals. Use 'High' to prioritize the best intro opportunities. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_INTRO_VALUE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_ID",
        -              "description": "Filter by CRM account UUID. Values are account ID strings. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_NAME",
        -              "description": "Filter by target account name (prefix match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_DOMAIN",
        -              "description": "Filter by target account website domain (e.g. 'acme.com'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_DOMAIN"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OWNER_NAME",
        -              "description": "Filter by CRM account owner first OR last name, prefix match on ONE name part only (e.g. [\"John\"] or [\"Smith\"] — NOT \"John Smith\" as one string, which silently returns zero results). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_ACCOUNT_OWNER_ID when user_id is known (resolve via search_workspace_members).",
        -              "title": "FILTER_FIELD_ACCOUNT_OWNER_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_ID",
        -              "description": "RECOMMENDED over FILTER_FIELD_CONTACT_NAME when the contact UUID is known. Exact match on target contact UUID. Resolve contact names via search_contacts first.",
        -              "title": "FILTER_FIELD_CONTACT_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_NAME",
        -              "description": "Filter by target contact first OR last name, prefix match on ONE name part only (e.g. [\"Jane\"] or [\"Doe\"] — NOT \"Jane Doe\" as one string, which silently returns zero results). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_CONTACT_ID when contact UUID is known (resolve via search_contacts).",
        -              "title": "FILTER_FIELD_CONTACT_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_EMAIL",
        -              "description": "Filter by target contact email address (prefix or exact match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONTACT_EMAIL"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_TITLE",
        -              "description": "Filter by target contact job title (prefix match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONTACT_TITLE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_COMPANY_NAME",
        -              "description": "Filter by the company name associated with the target contact — typically the target account name (prefix match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONTACT_COMPANY_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SUPER_CONNECTOR_NAME",
        -              "description": "Filter by super connector's first OR last name, prefix match on ONE name part only (e.g. [\"Steven\"] or [\"Hagler\"] — NOT \"Steven Hagler\" as a single combined string, which will silently return zero results rather than an error). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_CONNECTOR_ID instead whenever the connector's user_id is already known (e.g. from search_workspace_members) — it does an exact match and avoids the silent zero-result failure mode of name-based prefix matching, especially for people with common or multi-word names.",
        -              "title": "FILTER_FIELD_SUPER_CONNECTOR_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL",
        -              "description": "Filter by super connector email address (prefix or exact match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_ACCOUNT_ID",
        -              "description": "Filter by source company UUID — for Account→Account path types (COMMON_INVESTOR, COMMON_BOARD_HOP, ACCOUNT_ALUMNI, SELF_DECLARED_ACCOUNT, COMMON_INVESTOR_HOP, ACCOUNT_INSIGHT_BOARD_ADVISOR, etc.) where the source node is a company, not a user. Exact match. RECOMMENDED over FILTER_FIELD_SOURCE_ACCOUNT_NAME when the account UUID is known (resolve via search_accounts_with_filters first).",
        -              "title": "FILTER_FIELD_SOURCE_ACCOUNT_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_ACCOUNT_NAME",
        -              "description": "Filter by source company name (prefix/substring match) — for Account→Account path types. Use to answer questions like 'which accounts can Garuda Ventures help reach?'. ONE name token per value recommended for broad matching. Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_SOURCE_ACCOUNT_ID when the UUID is known.",
        -              "title": "FILTER_FIELD_SOURCE_ACCOUNT_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN",
        -              "description": "Filter by source company domain (exact or prefix match) — for Account→Account path types. E.g. 'garudaventures.com'. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_CONTACT_ID",
        -              "description": "Filter by source contact UUID — for Contact→Account path types (COMPANY_ALUMNI) where the source node is a contact. Exact match. RECOMMENDED over FILTER_FIELD_SOURCE_CONTACT_NAME when the UUID is known.",
        -              "title": "FILTER_FIELD_SOURCE_CONTACT_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_CONTACT_NAME",
        -              "description": "Filter by source contact first OR last name (prefix match) — for Contact→Account path types. ONE name token per value. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_SOURCE_CONTACT_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_ICP",
        -              "description": "Filter by target account ICP (Ideal Customer Profile) match status. Valid values: 'MATCH' (account matches ICP criteria), 'NO_MATCH' (account evaluated and does not match), 'NO_DATA' (insufficient data to evaluate), 'NO_ICP_DEFINED' (workspace has no ICP configured), 'PRE_MATCH' (pending evaluation). Use the special sentinel value 'null' to match accounts where the ICP field has not been set. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_ICP"
        -            },
        -            {
        -              "const": "FILTER_FIELD_TITLE_PERSONA",
        -              "description": "Buyer persona of the target contact, matched against the contact's title. Values are persona names, NOT job titles: 'BUYING_COMMITTEE' (functional buyers and users — the workspace's buying_committee_regex), 'EXTENDED_BUYING_COMMITTEE' (procurement / finance / IT / legal approval seats — extended_buying_committee_regex), 'LEADERSHIP' (C-suite and VP-level titles from the shared taxonomy, not board members, founders or partner/principal). Multiple values are OR-combined. A persona whose regex is not configured for the workspace is ignored.",
        -              "title": "FILTER_FIELD_TITLE_PERSONA"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_CATEGORY",
        -              "description": "Filter by the target account's category — the workspace's own classification of the account, distinct from ICP. Valid values: 'CUSTOMER', 'PROSPECT', 'OPEN_OPPORTUNITY', 'CLOSED_LOST', 'CHURNED', 'PARTNER', 'COMPETITOR', 'OTHER'. Use the special sentinel value 'null' to match accounts that have not been categorised. An account can carry several categories; multiple values are OR-combined (the account carries any of them), and NOT_IN keeps accounts carrying none of them. Do not confuse with FILTER_FIELD_CATEGORY, which filters on the super connector's category.",
        -              "title": "FILTER_FIELD_ACCOUNT_CATEGORY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONNECTOR_LOCATION",
        -              "description": "Location of the connector (super connector), matched case-insensitively against city, country, or ISO country code (e.g. 'US', 'San Francisco', 'United States'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONNECTOR_LOCATION"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY",
        -              "title": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OFFICE_STATE",
        -              "title": "FILTER_FIELD_ACCOUNT_OFFICE_STATE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OFFICE_CITY",
        -              "title": "FILTER_FIELD_ACCOUNT_OFFICE_CITY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_REFERENCE_ID",
        -              "description": "Filter by the target account's CRM record ID — exact match on reference_id (e.g. Salesforce 18-character Account ID '001xx000003DGbQAAW', HubSpot company ID). Values are CRM IDs, NOT internal UUIDs. Use directly when the user supplies Salesforce/HubSpot IDs — do NOT call search_accounts_with_filters first to resolve them to UUIDs. Pass the id exactly as the CRM stores it: a 15-character Salesforce short id does not match the stored 18-character form, and the match is silent — wrong form returns zero rows, not an error. Only CRM-sourced accounts have a CRM id; accounts created inside Boomerang carry an internal 'BOOM-…' reference_id and never match here. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_REFERENCE_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_STARRED",
        -              "title": "FILTER_FIELD_STARRED"
        -            }
        -          ]
        -        },
        -        "operator": {
        -          "description": "How values are matched. Omit (or 'IN') to keep only rows matching any of the values — the default. Use 'NOT_IN' (aliases: 'NOT_EQUAL_TO', 'NE') to EXCLUDE rows matching any of the values, e.g. field=FILTER_FIELD_ACCOUNT_CATEGORY, operator='NOT_IN', values=['CUSTOMER'] returns paths to accounts that are not customers. A NOT_IN filter keeps rows where the entity exists but the field has no value on record, and excludes paths that have no such entity at all — 'account category not CUSTOMER' returns only paths that target an account, never User→Contact paths. Text filters (names, titles, domains, emails) match by substring, so NOT_IN on them excludes every row CONTAINING a value, not only exact matches — 'account name not [Acme]' also drops 'Acme Holdings'. Not supported on FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY — pass 'true'/'false' with IN instead.",
        -          "type": "string"
        -        },
        -        "values": {
        -          "description": "One or more filter values. Multiple values are OR-combined within the same field, AND across different fields. For FILTER_FIELD_SENIORITY use stored values 'Owner/CXO', 'VP', 'DIRECTOR', 'MANAGER', 'IC' (OWNER_CXO alias accepted). For FILTER_FIELD_STRENGTH use: 'CONFIRMED', 'STRONG', 'LESS_LIKELY', 'UNLIKELY'. For FILTER_FIELD_CATEGORY use category UUIDs resolved from get_workspace_categories (filter to SUPER_CONNECTORS, match by label, use id). For FILTER_FIELD_RELATIONSHIP_PATH_TYPE use RelationshipPathType enum names as strings — User–Contact: 'LINKEDIN_CONNECTION', 'WORK_OVERLAP', 'EDUCATION_OVERLAP', 'CALENDAR_EVENT', 'SELF_DECLARED_CONTACT', 'SELF_DECLARED_CONTACT_DONT_KNOW', 'SUPER_CONNECTOR_APPROVED', 'SUPER_CONNECTOR_DECLINED', 'TESTIMONIAL', 'LINKEDIN_ENGAGEMENT', 'LINKEDIN_POST_MENTION', 'PATENT', 'PUBLICATION'; User–Account: 'BOARD_MEMBER', 'COMMON_BOARD_HOP', 'ADVISOR', 'LEADERSHIP', 'EMPLOYEE', 'INVESTOR', 'ACCOUNT_ALUMNI', 'SELF_DECLARED_ACCOUNT', 'SELF_DECLARED_ACCOUNT_DONT_KNOW', 'FIRM_PORTFOLIO'; Company–Account: 'COMMON_INVESTOR', 'COMMON_INVESTOR_HOP', 'PORTFOLIO'; Contact–Account: 'COMPANY_ALUMNI'; Account insight: 'ACCOUNT_INSIGHT_BOARD_ADVISOR', 'ACCOUNT_INSIGHT_BOARD_ADVISOR_VIA_CONTACT'. For FILTER_FIELD_CONFIDENCE use: 'High', 'Medium', 'Low'. For FILTER_FIELD_INTRO_VALUE use: 'High', 'Medium', 'Low'. For FILTER_FIELD_SOURCE_ACCOUNT_ID/FILTER_FIELD_SOURCE_CONTACT_ID use UUIDs (resolve via search_accounts_with_filters or search_contacts first). For FILTER_FIELD_ACCOUNT_REFERENCE_ID pass CRM record IDs as-is (e.g. Salesforce '001xx000003DGbQAAW') — exact match, no UUID resolution needed. For FILTER_FIELD_ACCOUNT_ICP use: 'MATCH', 'NO_MATCH', 'NO_DATA', 'NO_ICP_DEFINED', 'PRE_MATCH', or the sentinel 'null' to match accounts with no ICP value set. Person-name filters (FILTER_FIELD_SUPER_CONNECTOR_NAME, FILTER_FIELD_CONTACT_NAME, FILTER_FIELD_ACCOUNT_OWNER_NAME, FILTER_FIELD_SOURCE_ACCOUNT_NAME, FILTER_FIELD_SOURCE_CONTACT_NAME): pass ONE first or last name token per value — never a full name like 'Jane Doe' or 'Garuda Ventures' as a single string, which silently returns zero results. Prefer ID-based filters when UUIDs are known.",
        -          "items": {
        -            "type": "string"
        -          },
        -          "type": "array"
        -        }
        -      },
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "properties": {
        +        "fallback_fields": {
        +          "items": {
        +            "oneOf": [
        +              {
        +                "const": "FILTER_FIELD_SENIORITY",
        +                "title": "FILTER_FIELD_SENIORITY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_LOCATION",
        +                "title": "FILTER_FIELD_LOCATION"
        +              },
        +              {
        +                "const": "FILTER_FIELD_STRENGTH",
        +                "title": "FILTER_FIELD_STRENGTH"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CATEGORY",
        +                "title": "FILTER_FIELD_CATEGORY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONNECTOR_ID",
        +                "title": "FILTER_FIELD_CONNECTOR_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY",
        +                "title": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE",
        +                "title": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_DEPARTMENT",
        +                "title": "FILTER_FIELD_DEPARTMENT"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OWNER_ID",
        +                "title": "FILTER_FIELD_ACCOUNT_OWNER_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_INDUSTRY",
        +                "title": "FILTER_FIELD_ACCOUNT_INDUSTRY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_COUNTRY",
        +                "title": "FILTER_FIELD_ACCOUNT_COUNTRY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE",
        +                "title": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONFIDENCE",
        +                "title": "FILTER_FIELD_CONFIDENCE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_INTRO_VALUE",
        +                "title": "FILTER_FIELD_INTRO_VALUE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_ID",
        +                "title": "FILTER_FIELD_ACCOUNT_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_NAME",
        +                "title": "FILTER_FIELD_ACCOUNT_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_DOMAIN",
        +                "title": "FILTER_FIELD_ACCOUNT_DOMAIN"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OWNER_NAME",
        +                "title": "FILTER_FIELD_ACCOUNT_OWNER_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_ID",
        +                "title": "FILTER_FIELD_CONTACT_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_NAME",
        +                "title": "FILTER_FIELD_CONTACT_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_EMAIL",
        +                "title": "FILTER_FIELD_CONTACT_EMAIL"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_TITLE",
        +                "title": "FILTER_FIELD_CONTACT_TITLE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_COMPANY_NAME",
        +                "title": "FILTER_FIELD_CONTACT_COMPANY_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SUPER_CONNECTOR_NAME",
        +                "title": "FILTER_FIELD_SUPER_CONNECTOR_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL",
        +                "title": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_ACCOUNT_ID",
        +                "title": "FILTER_FIELD_SOURCE_ACCOUNT_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_ACCOUNT_NAME",
        +                "title": "FILTER_FIELD_SOURCE_ACCOUNT_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN",
        +                "title": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_CONTACT_ID",
        +                "title": "FILTER_FIELD_SOURCE_CONTACT_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_CONTACT_NAME",
        +                "title": "FILTER_FIELD_SOURCE_CONTACT_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_ICP",
        +                "title": "FILTER_FIELD_ACCOUNT_ICP"
        +              },
        +              {
        +                "const": "FILTER_FIELD_TITLE_PERSONA",
        +                "title": "FILTER_FIELD_TITLE_PERSONA"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_CATEGORY",
        +                "title": "FILTER_FIELD_ACCOUNT_CATEGORY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONNECTOR_LOCATION",
        +                "title": "FILTER_FIELD_CONNECTOR_LOCATION"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY",
        +                "title": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OFFICE_STATE",
        +                "title": "FILTER_FIELD_ACCOUNT_OFFICE_STATE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OFFICE_CITY",
        +                "title": "FILTER_FIELD_ACCOUNT_OFFICE_CITY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_REFERENCE_ID",
        +                "title": "FILTER_FIELD_ACCOUNT_REFERENCE_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_STARRED",
        +                "title": "FILTER_FIELD_STARRED"
        +              }
        +            ]
        +          },
        +          "type": "array"
        +        },
        +        "field": {
        +          "description": "Which attribute to filter on.",
        +          "oneOf": [
        +            {
        +              "const": "FILTER_FIELD_SENIORITY",
        +              "description": "Target contact seniority level. Use IN operator. Stored values: 'Owner/CXO', 'VP', 'DIRECTOR', 'MANAGER', 'IC'. Documented alias OWNER_CXO is also accepted. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_SENIORITY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_LOCATION",
        +              "description": "Target contact's location (country code or location name string). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_LOCATION"
        +            },
        +            {
        +              "const": "FILTER_FIELD_STRENGTH",
        +              "description": "Relationship strength between the connector and target contact. Valid values: 'CONFIRMED', 'STRONG', 'LESS_LIKELY', 'UNLIKELY'. Prefer CONFIRMED and STRONG when looking for high-quality intro paths.",
        +              "title": "FILTER_FIELD_STRENGTH"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CATEGORY",
        +              "description": "Relationship category describing who the super connector is in relation to the company (e.g. Investor, Advisor, Board Member, Customer, Champion, Alumni, Leadership). IMPORTANT: this is NOT the same as seniority (how senior the contact is) or strength (how strong the tie is). Trigger words: investor(s), customer(s), board member(s), advisor(s), champion(s), alumni, leadership, partner(s). Values must be category UUIDs — NOT label strings. Resolution flow: (1) call get_workspace_categories, (2) filter to relationship_type SUPER_CONNECTORS and is_deleted false, (3) match user intent to closest label(s) — OR all plausible matches, (4) use those id UUIDs as filter values.",
        +              "title": "FILTER_FIELD_CATEGORY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONNECTOR_ID",
        +              "description": "RECOMMENDED over FILTER_FIELD_SUPER_CONNECTOR_NAME when the connector user_id is known. Exact match on one or more connector user UUIDs (Keycloak user IDs). Resolve connector names via search_workspace_members first to avoid silent zero-result failures from name prefix matching.",
        +              "title": "FILTER_FIELD_CONNECTOR_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY",
        +              "description": "Include or exclude contacts who have left the tracked company. Values: 'true' or 'false'.",
        +              "title": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE",
        +              "description": "One or more path type evidence signals used to establish the relationship. Use string names from the RelationshipPathType enum. User–Contact: 'LINKEDIN_CONNECTION' (direct LinkedIn connection), 'WORK_OVERLAP' (same company same time), 'EDUCATION_OVERLAP' (same school), 'CALENDAR_EVENT' (meetings on record), 'SELF_DECLARED_CONTACT' (connector declared they know the contact), 'SELF_DECLARED_CONTACT_DONT_KNOW' (connector declared they do not know the contact), 'SUPER_CONNECTOR_APPROVED' (super connector approved the path), 'SUPER_CONNECTOR_DECLINED' (super connector declined), 'TESTIMONIAL' (LinkedIn recommendation one wrote for the other), 'LINKEDIN_ENGAGEMENT' (connector comments on the contact's LinkedIn posts), 'LINKEDIN_POST_MENTION' (connector tagged the contact in one of the connector's own LinkedIn posts), 'PATENT' (connector and contact are co-inventors on a patent), 'PUBLICATION' (connector and contact co-authored a paper or article), 'AFFILIATION_OVERLAP' (connector and contact share an investor / advisor / board / member tie to the same small company — not co-employment). User–Account: 'BOARD_MEMBER', 'COMMON_BOARD_HOP' (P1 → P2 via shared board seat), 'ADVISOR', 'LEADERSHIP', 'EMPLOYEE', 'INVESTOR', 'ACCOUNT_ALUMNI' (connector previously worked at target account), 'SELF_DECLARED_ACCOUNT' (connector declared a relationship to the account), 'SELF_DECLARED_ACCOUNT_DONT_KNOW', 'FIRM_PORTFOLIO' (connector works at an investment firm that backed the account). Company–Account: 'COMMON_INVESTOR', 'COMMON_INVESTOR_HOP', 'PORTFOLIO' (a portfolio company of this workspace's investor firm). Contact–Account: 'COMPANY_ALUMNI' (worked at same company at different times). Account insight: 'ACCOUNT_INSIGHT_BOARD_ADVISOR', 'ACCOUNT_INSIGHT_BOARD_ADVISOR_VIA_CONTACT'. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_DEPARTMENT",
        +              "description": "Target contact's department (free-text match). Values are department name strings (e.g. 'Engineering', 'Sales', 'Marketing'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_DEPARTMENT"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OWNER_ID",
        +              "description": "RECOMMENDED over FILTER_FIELD_ACCOUNT_OWNER_NAME when the owner user_id is known. Exact match on CRM account owner user UUID (Keycloak user ID). Resolve owner names via search_workspace_members first.",
        +              "title": "FILTER_FIELD_ACCOUNT_OWNER_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_INDUSTRY",
        +              "description": "Filter by target account industry. Values are industry name strings (e.g. 'Software', 'Financial Services'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_INDUSTRY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_COUNTRY",
        +              "description": "Filter by target account's country. Values are country name strings (e.g. 'United States', 'Germany'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_COUNTRY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE",
        +              "description": "Filter by target account employee headcount range. Valid values: '1', '2-10', '11-50', '51-200', '201-500', '501-1000', '1001-5000', '5001-10000', '10001+'. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONFIDENCE",
        +              "description": "GPT scoring confidence level for the relationship assessment. Valid values: 'High', 'Medium', 'Low'. Use 'High' to restrict results to relationships the scoring model is most certain about. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONFIDENCE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_INTRO_VALUE",
        +              "description": "Assessed value of requesting an introduction through this relationship path. Valid values: 'High', 'Medium', 'Low'. Determined by the Boomerang scoring engine based on strength, seniority, and recency signals. Use 'High' to prioritize the best intro opportunities. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_INTRO_VALUE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_ID",
        +              "description": "Filter by CRM account UUID. Values are account ID strings. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_NAME",
        +              "description": "Filter by target account name (prefix match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_DOMAIN",
        +              "description": "Filter by target account website domain (e.g. 'acme.com'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_DOMAIN"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OWNER_NAME",
        +              "description": "Filter by CRM account owner first OR last name, prefix match on ONE name part only (e.g. [\"John\"] or [\"Smith\"] — NOT \"John Smith\" as one string, which silently returns zero results). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_ACCOUNT_OWNER_ID when user_id is known (resolve via search_workspace_members).",
        +              "title": "FILTER_FIELD_ACCOUNT_OWNER_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_ID",
        +              "description": "RECOMMENDED over FILTER_FIELD_CONTACT_NAME when the contact UUID is known. Exact match on target contact UUID. Resolve contact names via search_contacts first.",
        +              "title": "FILTER_FIELD_CONTACT_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_NAME",
        +              "description": "Filter by target contact first OR last name, prefix match on ONE name part only (e.g. [\"Jane\"] or [\"Doe\"] — NOT \"Jane Doe\" as one string, which silently returns zero results). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_CONTACT_ID when contact UUID is known (resolve via search_contacts).",
        +              "title": "FILTER_FIELD_CONTACT_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_EMAIL",
        +              "description": "Filter by target contact email address (prefix or exact match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONTACT_EMAIL"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_TITLE",
        +              "description": "Filter by target contact job title (prefix match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONTACT_TITLE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_COMPANY_NAME",
        +              "description": "Filter by the company name associated with the target contact — typically the target account name (prefix match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONTACT_COMPANY_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SUPER_CONNECTOR_NAME",
        +              "description": "Filter by super connector's first OR last name, prefix match on ONE name part only (e.g. [\"Steven\"] or [\"Hagler\"] — NOT \"Steven Hagler\" as a single combined string, which will silently return zero results rather than an error). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_CONNECTOR_ID instead whenever the connector's user_id is already known (e.g. from search_workspace_members) — it does an exact match and avoids the silent zero-result failure mode of name-based prefix matching, especially for people with common or multi-word names.",
        +              "title": "FILTER_FIELD_SUPER_CONNECTOR_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL",
        +              "description": "Filter by super connector email address (prefix or exact match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_ACCOUNT_ID",
        +              "description": "Filter by source company UUID — for Account→Account path types (COMMON_INVESTOR, COMMON_BOARD_HOP, ACCOUNT_ALUMNI, SELF_DECLARED_ACCOUNT, COMMON_INVESTOR_HOP, ACCOUNT_INSIGHT_BOARD_ADVISOR, etc.) where the source node is a company, not a user. Exact match. RECOMMENDED over FILTER_FIELD_SOURCE_ACCOUNT_NAME when the account UUID is known (resolve via search_accounts_with_filters first).",
        +              "title": "FILTER_FIELD_SOURCE_ACCOUNT_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_ACCOUNT_NAME",
        +              "description": "Filter by source company name (prefix/substring match) — for Account→Account path types. Use to answer questions like 'which accounts can Garuda Ventures help reach?'. ONE name token per value recommended for broad matching. Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_SOURCE_ACCOUNT_ID when the UUID is known.",
        +              "title": "FILTER_FIELD_SOURCE_ACCOUNT_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN",
        +              "description": "Filter by source company domain (exact or prefix match) — for Account→Account path types. E.g. 'garudaventures.com'. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_CONTACT_ID",
        +              "description": "Filter by source contact UUID — for Contact→Account path types (COMPANY_ALUMNI) where the source node is a contact. Exact match. RECOMMENDED over FILTER_FIELD_SOURCE_CONTACT_NAME when the UUID is known.",
        +              "title": "FILTER_FIELD_SOURCE_CONTACT_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_CONTACT_NAME",
        +              "description": "Filter by source contact first OR last name (prefix match) — for Contact→Account path types. ONE name token per value. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_SOURCE_CONTACT_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_ICP",
        +              "description": "Filter by target account ICP (Ideal Customer Profile) match status. Valid values: 'MATCH' (account matches ICP criteria), 'NO_MATCH' (account evaluated and does not match), 'NO_DATA' (insufficient data to evaluate), 'NO_ICP_DEFINED' (workspace has no ICP configured), 'PRE_MATCH' (pending evaluation). Use the special sentinel value 'null' to match accounts where the ICP field has not been set. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_ICP"
        +            },
        +            {
        +              "const": "FILTER_FIELD_TITLE_PERSONA",
        +              "description": "Buyer persona of the target contact, matched against the contact's title. Values are persona names, NOT job titles: 'BUYING_COMMITTEE' (functional buyers and users — the workspace's buying_committee_regex), 'EXTENDED_BUYING_COMMITTEE' (procurement / finance / IT / legal approval seats — extended_buying_committee_regex), 'LEADERSHIP' (C-suite and VP-level titles from the shared taxonomy, not board members, founders or partner/principal). Multiple values are OR-combined. A persona whose regex is not configured for the workspace is ignored.",
        +              "title": "FILTER_FIELD_TITLE_PERSONA"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_CATEGORY",
        +              "description": "Filter by the target account's category — the workspace's own classification of the account, distinct from ICP. Valid values: 'CUSTOMER', 'PROSPECT', 'OPEN_OPPORTUNITY', 'CLOSED_LOST', 'CHURNED', 'PARTNER', 'COMPETITOR', 'OTHER'. Use the special sentinel value 'null' to match accounts that have not been categorised. An account can carry several categories; multiple values are OR-combined (the account carries any of them), and NOT_IN keeps accounts carrying none of them. Do not confuse with FILTER_FIELD_CATEGORY, which filters on the super connector's category.",
        +              "title": "FILTER_FIELD_ACCOUNT_CATEGORY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONNECTOR_LOCATION",
        +              "description": "Location of the connector (super connector), matched case-insensitively against city, country, or ISO country code (e.g. 'US', 'San Francisco', 'United States'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONNECTOR_LOCATION"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY",
        +              "title": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OFFICE_STATE",
        +              "title": "FILTER_FIELD_ACCOUNT_OFFICE_STATE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OFFICE_CITY",
        +              "title": "FILTER_FIELD_ACCOUNT_OFFICE_CITY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_REFERENCE_ID",
        +              "description": "Filter by the target account's CRM record ID — exact match on reference_id (e.g. Salesforce 18-character Account ID '001xx000003DGbQAAW', HubSpot company ID). Values are CRM IDs, NOT internal UUIDs. Use directly when the user supplies Salesforce/HubSpot IDs — do NOT call search_accounts_with_filters first to resolve them to UUIDs. Pass the id exactly as the CRM stores it: a 15-character Salesforce short id does not match the stored 18-character form, and the match is silent — wrong form returns zero rows, not an error. Only CRM-sourced accounts have a CRM id; accounts created inside Boomerang carry an internal 'BOOM-…' reference_id and never match here. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_REFERENCE_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_STARRED",
        +              "title": "FILTER_FIELD_STARRED"
        +            }
        +          ]
        +        },
        +        "operator": {
        +          "description": "How values are matched. Omit (or 'IN') to keep only rows matching any of the values — the default. Use 'NOT_IN' (aliases: 'NOT_EQUAL_TO', 'NE') to EXCLUDE rows matching any of the values, e.g. field=FILTER_FIELD_ACCOUNT_CATEGORY, operator='NOT_IN', values=['CUSTOMER'] returns paths to accounts that are not customers. A NOT_IN filter keeps rows where the entity exists but the field has no value on record, and excludes paths that have no such entity at all — 'account category not CUSTOMER' returns only paths that target an account, never User→Contact paths. Text filters (names, titles, domains, emails) match by substring, so NOT_IN on them excludes every row CONTAINING a value, not only exact matches — 'account name not [Acme]' also drops 'Acme Holdings'. Not supported on FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY — pass 'true'/'false' with IN instead.",
        +          "type": "string"
        +        },
        +        "values": {
        +          "description": "One or more filter values. Multiple values are OR-combined within the same field, AND across different fields. For FILTER_FIELD_SENIORITY use stored values 'Owner/CXO', 'VP', 'DIRECTOR', 'MANAGER', 'IC' (OWNER_CXO alias accepted). For FILTER_FIELD_STRENGTH use: 'CONFIRMED', 'STRONG', 'LESS_LIKELY', 'UNLIKELY'. For FILTER_FIELD_CATEGORY use category UUIDs resolved from get_workspace_categories (filter to SUPER_CONNECTORS, match by label, use id). For FILTER_FIELD_RELATIONSHIP_PATH_TYPE use RelationshipPathType enum names as strings — User–Contact: 'LINKEDIN_CONNECTION', 'WORK_OVERLAP', 'EDUCATION_OVERLAP', 'CALENDAR_EVENT', 'SELF_DECLARED_CONTACT', 'SELF_DECLARED_CONTACT_DONT_KNOW', 'SUPER_CONNECTOR_APPROVED', 'SUPER_CONNECTOR_DECLINED', 'TESTIMONIAL', 'LINKEDIN_ENGAGEMENT', 'LINKEDIN_POST_MENTION', 'PATENT', 'PUBLICATION', 'AFFILIATION_OVERLAP'; User–Account: 'BOARD_MEMBER', 'COMMON_BOARD_HOP', 'ADVISOR', 'LEADERSHIP', 'EMPLOYEE', 'INVESTOR', 'ACCOUNT_ALUMNI', 'SELF_DECLARED_ACCOUNT', 'SELF_DECLARED_ACCOUNT_DONT_KNOW', 'FIRM_PORTFOLIO'; Company–Account: 'COMMON_INVESTOR', 'COMMON_INVESTOR_HOP', 'PORTFOLIO'; Contact–Account: 'COMPANY_ALUMNI'; Account insight: 'ACCOUNT_INSIGHT_BOARD_ADVISOR', 'ACCOUNT_INSIGHT_BOARD_ADVISOR_VIA_CONTACT'. For FILTER_FIELD_CONFIDENCE use: 'High', 'Medium', 'Low'. For FILTER_FIELD_INTRO_VALUE use: 'High', 'Medium', 'Low'. For FILTER_FIELD_SOURCE_ACCOUNT_ID/FILTER_FIELD_SOURCE_CONTACT_ID use UUIDs (resolve via search_accounts_with_filters or search_contacts first). For FILTER_FIELD_ACCOUNT_REFERENCE_ID pass CRM record IDs as-is (e.g. Salesforce '001xx000003DGbQAAW') — exact match, no UUID resolution needed. For FILTER_FIELD_ACCOUNT_ICP use: 'MATCH', 'NO_MATCH', 'NO_DATA', 'NO_ICP_DEFINED', 'PRE_MATCH', or the sentinel 'null' to match accounts with no ICP value set. Person-name filters (FILTER_FIELD_SUPER_CONNECTOR_NAME, FILTER_FIELD_CONTACT_NAME, FILTER_FIELD_ACCOUNT_OWNER_NAME, FILTER_FIELD_SOURCE_ACCOUNT_NAME, FILTER_FIELD_SOURCE_CONTACT_NAME): pass ONE first or last name token per value — never a full name like 'Jane Doe' or 'Garuda Ventures' as a single string, which silently returns zero results. Prefer ID-based filters when UUIDs are known.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / group_by
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
  2. 2 tool updates
    • Changedget_unique_filter_options1 field changed
      • changedInput schema / properties / filters / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "properties": {
        -        "fallback_fields": {
        -          "items": {
        -            "oneOf": [
        -              {
        -                "const": "FILTER_FIELD_SENIORITY",
        -                "title": "FILTER_FIELD_SENIORITY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_LOCATION",
        -                "title": "FILTER_FIELD_LOCATION"
        -              },
        -              {
        -                "const": "FILTER_FIELD_STRENGTH",
        -                "title": "FILTER_FIELD_STRENGTH"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CATEGORY",
        -                "title": "FILTER_FIELD_CATEGORY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONNECTOR_ID",
        -                "title": "FILTER_FIELD_CONNECTOR_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY",
        -                "title": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE",
        -                "title": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_DEPARTMENT",
        -                "title": "FILTER_FIELD_DEPARTMENT"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OWNER_ID",
        -                "title": "FILTER_FIELD_ACCOUNT_OWNER_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_INDUSTRY",
        -                "title": "FILTER_FIELD_ACCOUNT_INDUSTRY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_COUNTRY",
        -                "title": "FILTER_FIELD_ACCOUNT_COUNTRY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE",
        -                "title": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONFIDENCE",
        -                "title": "FILTER_FIELD_CONFIDENCE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_INTRO_VALUE",
        -                "title": "FILTER_FIELD_INTRO_VALUE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_ID",
        -                "title": "FILTER_FIELD_ACCOUNT_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_NAME",
        -                "title": "FILTER_FIELD_ACCOUNT_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_DOMAIN",
        -                "title": "FILTER_FIELD_ACCOUNT_DOMAIN"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OWNER_NAME",
        -                "title": "FILTER_FIELD_ACCOUNT_OWNER_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_ID",
        -                "title": "FILTER_FIELD_CONTACT_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_NAME",
        -                "title": "FILTER_FIELD_CONTACT_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_EMAIL",
        -                "title": "FILTER_FIELD_CONTACT_EMAIL"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_TITLE",
        -                "title": "FILTER_FIELD_CONTACT_TITLE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_COMPANY_NAME",
        -                "title": "FILTER_FIELD_CONTACT_COMPANY_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SUPER_CONNECTOR_NAME",
        -                "title": "FILTER_FIELD_SUPER_CONNECTOR_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL",
        -                "title": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_ACCOUNT_ID",
        -                "title": "FILTER_FIELD_SOURCE_ACCOUNT_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_ACCOUNT_NAME",
        -                "title": "FILTER_FIELD_SOURCE_ACCOUNT_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN",
        -                "title": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_CONTACT_ID",
        -                "title": "FILTER_FIELD_SOURCE_CONTACT_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_CONTACT_NAME",
        -                "title": "FILTER_FIELD_SOURCE_CONTACT_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_ICP",
        -                "title": "FILTER_FIELD_ACCOUNT_ICP"
        -              },
        -              {
        -                "const": "FILTER_FIELD_TITLE_PERSONA",
        -                "title": "FILTER_FIELD_TITLE_PERSONA"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_CATEGORY",
        -                "title": "FILTER_FIELD_ACCOUNT_CATEGORY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONNECTOR_LOCATION",
        -                "title": "FILTER_FIELD_CONNECTOR_LOCATION"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY",
        -                "title": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OFFICE_STATE",
        -                "title": "FILTER_FIELD_ACCOUNT_OFFICE_STATE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OFFICE_CITY",
        -                "title": "FILTER_FIELD_ACCOUNT_OFFICE_CITY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_REFERENCE_ID",
        -                "title": "FILTER_FIELD_ACCOUNT_REFERENCE_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_STARRED",
        -                "title": "FILTER_FIELD_STARRED"
        -              }
        -            ]
        -          },
        -          "type": "array"
        -        },
        -        "field": {
        -          "description": "Which attribute to filter on.",
        -          "oneOf": [
        -            {
        -              "const": "FILTER_FIELD_SENIORITY",
        -              "description": "Target contact seniority level. Use IN operator. Stored values: 'Owner/CXO', 'VP', 'DIRECTOR', 'MANAGER', 'IC'. Documented alias OWNER_CXO is also accepted. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_SENIORITY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_LOCATION",
        -              "description": "Target contact's location (country code or location name string). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_LOCATION"
        -            },
        -            {
        -              "const": "FILTER_FIELD_STRENGTH",
        -              "description": "Relationship strength between the connector and target contact. Valid values: 'CONFIRMED', 'STRONG', 'LESS_LIKELY', 'UNLIKELY'. Prefer CONFIRMED and STRONG when looking for high-quality intro paths.",
        -              "title": "FILTER_FIELD_STRENGTH"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CATEGORY",
        -              "description": "Relationship category describing who the super connector is in relation to the company (e.g. Investor, Advisor, Board Member, Customer, Champion, Alumni, Leadership). IMPORTANT: this is NOT the same as seniority (how senior the contact is) or strength (how strong the tie is). Trigger words: investor(s), customer(s), board member(s), advisor(s), champion(s), alumni, leadership, partner(s). Values must be category UUIDs — NOT label strings. Resolution flow: (1) call get_workspace_categories, (2) filter to relationship_type SUPER_CONNECTORS and is_deleted false, (3) match user intent to closest label(s) — OR all plausible matches, (4) use those id UUIDs as filter values.",
        -              "title": "FILTER_FIELD_CATEGORY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONNECTOR_ID",
        -              "description": "RECOMMENDED over FILTER_FIELD_SUPER_CONNECTOR_NAME when the connector user_id is known. Exact match on one or more connector user UUIDs (Keycloak user IDs). Resolve connector names via search_workspace_members first to avoid silent zero-result failures from name prefix matching.",
        -              "title": "FILTER_FIELD_CONNECTOR_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY",
        -              "description": "Include or exclude contacts who have left the tracked company. Values: 'true' or 'false'.",
        -              "title": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE",
        -              "description": "One or more path type evidence signals used to establish the relationship. Use string names from the RelationshipPathType enum. User–Contact: 'LINKEDIN_CONNECTION' (direct LinkedIn connection), 'WORK_OVERLAP' (same company same time), 'EDUCATION_OVERLAP' (same school), 'CALENDAR_EVENT' (meetings on record), 'SELF_DECLARED_CONTACT' (connector declared they know the contact), 'SELF_DECLARED_CONTACT_DONT_KNOW' (connector declared they do not know the contact), 'SUPER_CONNECTOR_APPROVED' (super connector approved the path), 'SUPER_CONNECTOR_DECLINED' (super connector declined), 'TESTIMONIAL' (LinkedIn recommendation one wrote for the other), 'LINKEDIN_ENGAGEMENT' (connector comments on the contact's LinkedIn posts), 'LINKEDIN_POST_MENTION' (connector tagged the contact in one of the connector's own LinkedIn posts). User–Account: 'BOARD_MEMBER', 'COMMON_BOARD_HOP' (P1 → P2 via shared board seat), 'ADVISOR', 'LEADERSHIP', 'EMPLOYEE', 'INVESTOR', 'ACCOUNT_ALUMNI' (connector previously worked at target account), 'SELF_DECLARED_ACCOUNT' (connector declared a relationship to the account), 'SELF_DECLARED_ACCOUNT_DONT_KNOW'. Company–Account: 'COMMON_INVESTOR', 'COMMON_INVESTOR_HOP', 'PORTFOLIO' (a portfolio company of this workspace's investor firm). Contact–Account: 'COMPANY_ALUMNI' (worked at same company at different times). Account insight: 'ACCOUNT_INSIGHT_BOARD_ADVISOR', 'ACCOUNT_INSIGHT_BOARD_ADVISOR_VIA_CONTACT'. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_DEPARTMENT",
        -              "description": "Target contact's department (free-text match). Values are department name strings (e.g. 'Engineering', 'Sales', 'Marketing'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_DEPARTMENT"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OWNER_ID",
        -              "description": "RECOMMENDED over FILTER_FIELD_ACCOUNT_OWNER_NAME when the owner user_id is known. Exact match on CRM account owner user UUID (Keycloak user ID). Resolve owner names via search_workspace_members first.",
        -              "title": "FILTER_FIELD_ACCOUNT_OWNER_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_INDUSTRY",
        -              "description": "Filter by target account industry. Values are industry name strings (e.g. 'Software', 'Financial Services'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_INDUSTRY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_COUNTRY",
        -              "description": "Filter by target account's country. Values are country name strings (e.g. 'United States', 'Germany'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_COUNTRY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE",
        -              "description": "Filter by target account employee headcount range. Valid values: '1', '2-10', '11-50', '51-200', '201-500', '501-1000', '1001-5000', '5001-10000', '10001+'. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONFIDENCE",
        -              "description": "GPT scoring confidence level for the relationship assessment. Valid values: 'High', 'Medium', 'Low'. Use 'High' to restrict results to relationships the scoring model is most certain about. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONFIDENCE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_INTRO_VALUE",
        -              "description": "Assessed value of requesting an introduction through this relationship path. Valid values: 'High', 'Medium', 'Low'. Determined by the Boomerang scoring engine based on strength, seniority, and recency signals. Use 'High' to prioritize the best intro opportunities. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_INTRO_VALUE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_ID",
        -              "description": "Filter by CRM account UUID. Values are account ID strings. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_NAME",
        -              "description": "Filter by target account name (prefix match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_DOMAIN",
        -              "description": "Filter by target account website domain (e.g. 'acme.com'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_DOMAIN"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OWNER_NAME",
        -              "description": "Filter by CRM account owner first OR last name, prefix match on ONE name part only (e.g. [\"John\"] or [\"Smith\"] — NOT \"John Smith\" as one string, which silently returns zero results). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_ACCOUNT_OWNER_ID when user_id is known (resolve via search_workspace_members).",
        -              "title": "FILTER_FIELD_ACCOUNT_OWNER_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_ID",
        -              "description": "RECOMMENDED over FILTER_FIELD_CONTACT_NAME when the contact UUID is known. Exact match on target contact UUID. Resolve contact names via search_contacts first.",
        -              "title": "FILTER_FIELD_CONTACT_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_NAME",
        -              "description": "Filter by target contact first OR last name, prefix match on ONE name part only (e.g. [\"Jane\"] or [\"Doe\"] — NOT \"Jane Doe\" as one string, which silently returns zero results). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_CONTACT_ID when contact UUID is known (resolve via search_contacts).",
        -              "title": "FILTER_FIELD_CONTACT_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_EMAIL",
        -              "description": "Filter by target contact email address (prefix or exact match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONTACT_EMAIL"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_TITLE",
        -              "description": "Filter by target contact job title (prefix match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONTACT_TITLE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_COMPANY_NAME",
        -              "description": "Filter by the company name associated with the target contact — typically the target account name (prefix match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONTACT_COMPANY_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SUPER_CONNECTOR_NAME",
        -              "description": "Filter by super connector's first OR last name, prefix match on ONE name part only (e.g. [\"Steven\"] or [\"Hagler\"] — NOT \"Steven Hagler\" as a single combined string, which will silently return zero results rather than an error). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_CONNECTOR_ID instead whenever the connector's user_id is already known (e.g. from search_workspace_members) — it does an exact match and avoids the silent zero-result failure mode of name-based prefix matching, especially for people with common or multi-word names.",
        -              "title": "FILTER_FIELD_SUPER_CONNECTOR_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL",
        -              "description": "Filter by super connector email address (prefix or exact match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_ACCOUNT_ID",
        -              "description": "Filter by source company UUID — for Account→Account path types (COMMON_INVESTOR, COMMON_BOARD_HOP, ACCOUNT_ALUMNI, SELF_DECLARED_ACCOUNT, COMMON_INVESTOR_HOP, ACCOUNT_INSIGHT_BOARD_ADVISOR, etc.) where the source node is a company, not a user. Exact match. RECOMMENDED over FILTER_FIELD_SOURCE_ACCOUNT_NAME when the account UUID is known (resolve via search_accounts_with_filters first).",
        -              "title": "FILTER_FIELD_SOURCE_ACCOUNT_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_ACCOUNT_NAME",
        -              "description": "Filter by source company name (prefix/substring match) — for Account→Account path types. Use to answer questions like 'which accounts can Garuda Ventures help reach?'. ONE name token per value recommended for broad matching. Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_SOURCE_ACCOUNT_ID when the UUID is known.",
        -              "title": "FILTER_FIELD_SOURCE_ACCOUNT_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN",
        -              "description": "Filter by source company domain (exact or prefix match) — for Account→Account path types. E.g. 'garudaventures.com'. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_CONTACT_ID",
        -              "description": "Filter by source contact UUID — for Contact→Account path types (COMPANY_ALUMNI) where the source node is a contact. Exact match. RECOMMENDED over FILTER_FIELD_SOURCE_CONTACT_NAME when the UUID is known.",
        -              "title": "FILTER_FIELD_SOURCE_CONTACT_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_CONTACT_NAME",
        -              "description": "Filter by source contact first OR last name (prefix match) — for Contact→Account path types. ONE name token per value. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_SOURCE_CONTACT_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_ICP",
        -              "description": "Filter by target account ICP (Ideal Customer Profile) match status. Valid values: 'MATCH' (account matches ICP criteria), 'NO_MATCH' (account evaluated and does not match), 'NO_DATA' (insufficient data to evaluate), 'NO_ICP_DEFINED' (workspace has no ICP configured), 'PRE_MATCH' (pending evaluation). Use the special sentinel value 'null' to match accounts where the ICP field has not been set. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_ICP"
        -            },
        -            {
        -              "const": "FILTER_FIELD_TITLE_PERSONA",
        -              "description": "Buyer persona of the target contact, matched against the contact's title. Values are persona names, NOT job titles: 'BUYING_COMMITTEE' (functional buyers and users — the workspace's buying_committee_regex), 'EXTENDED_BUYING_COMMITTEE' (procurement / finance / IT / legal approval seats — extended_buying_committee_regex), 'LEADERSHIP' (C-suite and VP-level titles from the shared taxonomy, not board members, founders or partner/principal). Multiple values are OR-combined. A persona whose regex is not configured for the workspace is ignored.",
        -              "title": "FILTER_FIELD_TITLE_PERSONA"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_CATEGORY",
        -              "description": "Filter by the target account's category — the workspace's own classification of the account, distinct from ICP. Valid values: 'CUSTOMER', 'PROSPECT', 'OPEN_OPPORTUNITY', 'CLOSED_LOST', 'CHURNED', 'PARTNER', 'COMPETITOR', 'OTHER'. Use the special sentinel value 'null' to match accounts that have not been categorised. An account can carry several categories; multiple values are OR-combined (the account carries any of them), and NOT_IN keeps accounts carrying none of them. Do not confuse with FILTER_FIELD_CATEGORY, which filters on the super connector's category.",
        -              "title": "FILTER_FIELD_ACCOUNT_CATEGORY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONNECTOR_LOCATION",
        -              "description": "Location of the connector (super connector), matched case-insensitively against city, country, or ISO country code (e.g. 'US', 'San Francisco', 'United States'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONNECTOR_LOCATION"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY",
        -              "title": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OFFICE_STATE",
        -              "title": "FILTER_FIELD_ACCOUNT_OFFICE_STATE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OFFICE_CITY",
        -              "title": "FILTER_FIELD_ACCOUNT_OFFICE_CITY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_REFERENCE_ID",
        -              "description": "Filter by the target account's CRM record ID — exact match on reference_id (e.g. Salesforce 18-character Account ID '001xx000003DGbQAAW', HubSpot company ID). Values are CRM IDs, NOT internal UUIDs. Use directly when the user supplies Salesforce/HubSpot IDs — do NOT call search_accounts_with_filters first to resolve them to UUIDs. Pass the id exactly as the CRM stores it: a 15-character Salesforce short id does not match the stored 18-character form, and the match is silent — wrong form returns zero rows, not an error. Only CRM-sourced accounts have a CRM id; accounts created inside Boomerang carry an internal 'BOOM-…' reference_id and never match here. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_REFERENCE_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_STARRED",
        -              "title": "FILTER_FIELD_STARRED"
        -            }
        -          ]
        -        },
        -        "operator": {
        -          "description": "How values are matched. Omit (or 'IN') to keep only rows matching any of the values — the default. Use 'NOT_IN' (aliases: 'NOT_EQUAL_TO', 'NE') to EXCLUDE rows matching any of the values, e.g. field=FILTER_FIELD_ACCOUNT_CATEGORY, operator='NOT_IN', values=['CUSTOMER'] returns paths to accounts that are not customers. A NOT_IN filter keeps rows where the entity exists but the field has no value on record, and excludes paths that have no such entity at all — 'account category not CUSTOMER' returns only paths that target an account, never User→Contact paths. Text filters (names, titles, domains, emails) match by substring, so NOT_IN on them excludes every row CONTAINING a value, not only exact matches — 'account name not [Acme]' also drops 'Acme Holdings'. Not supported on FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY — pass 'true'/'false' with IN instead.",
        -          "type": "string"
        -        },
        -        "values": {
        -          "description": "One or more filter values. Multiple values are OR-combined within the same field, AND across different fields. For FILTER_FIELD_SENIORITY use stored values 'Owner/CXO', 'VP', 'DIRECTOR', 'MANAGER', 'IC' (OWNER_CXO alias accepted). For FILTER_FIELD_STRENGTH use: 'CONFIRMED', 'STRONG', 'LESS_LIKELY', 'UNLIKELY'. For FILTER_FIELD_CATEGORY use category UUIDs resolved from get_workspace_categories (filter to SUPER_CONNECTORS, match by label, use id). For FILTER_FIELD_RELATIONSHIP_PATH_TYPE use RelationshipPathType enum names as strings — User–Contact: 'LINKEDIN_CONNECTION', 'WORK_OVERLAP', 'EDUCATION_OVERLAP', 'CALENDAR_EVENT', 'SELF_DECLARED_CONTACT', 'SELF_DECLARED_CONTACT_DONT_KNOW', 'SUPER_CONNECTOR_APPROVED', 'SUPER_CONNECTOR_DECLINED'; User–Account: 'BOARD_MEMBER', 'COMMON_BOARD_HOP', 'ADVISOR', 'LEADERSHIP', 'EMPLOYEE', 'INVESTOR', 'ACCOUNT_ALUMNI', 'SELF_DECLARED_ACCOUNT', 'SELF_DECLARED_ACCOUNT_DONT_KNOW'; Company–Account: 'COMMON_INVESTOR', 'COMMON_INVESTOR_HOP', 'PORTFOLIO'; Contact–Account: 'COMPANY_ALUMNI'; Account insight: 'ACCOUNT_INSIGHT_BOARD_ADVISOR', 'ACCOUNT_INSIGHT_BOARD_ADVISOR_VIA_CONTACT'. For FILTER_FIELD_CONFIDENCE use: 'High', 'Medium', 'Low'. For FILTER_FIELD_INTRO_VALUE use: 'High', 'Medium', 'Low'. For FILTER_FIELD_SOURCE_ACCOUNT_ID/FILTER_FIELD_SOURCE_CONTACT_ID use UUIDs (resolve via search_accounts_with_filters or search_contacts first). For FILTER_FIELD_ACCOUNT_REFERENCE_ID pass CRM record IDs as-is (e.g. Salesforce '001xx000003DGbQAAW') — exact match, no UUID resolution needed. For FILTER_FIELD_ACCOUNT_ICP use: 'MATCH', 'NO_MATCH', 'NO_DATA', 'NO_ICP_DEFINED', 'PRE_MATCH', or the sentinel 'null' to match accounts with no ICP value set. Person-name filters (FILTER_FIELD_SUPER_CONNECTOR_NAME, FILTER_FIELD_CONTACT_NAME, FILTER_FIELD_ACCOUNT_OWNER_NAME, FILTER_FIELD_SOURCE_ACCOUNT_NAME, FILTER_FIELD_SOURCE_CONTACT_NAME): pass ONE first or last name token per value — never a full name like 'Jane Doe' or 'Garuda Ventures' as a single string, which silently returns zero results. Prefer ID-based filters when UUIDs are known.",
        -          "items": {
        -            "type": "string"
        -          },
        -          "type": "array"
        -        }
        -      },
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "properties": {
        +        "fallback_fields": {
        +          "items": {
        +            "oneOf": [
        +              {
        +                "const": "FILTER_FIELD_SENIORITY",
        +                "title": "FILTER_FIELD_SENIORITY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_LOCATION",
        +                "title": "FILTER_FIELD_LOCATION"
        +              },
        +              {
        +                "const": "FILTER_FIELD_STRENGTH",
        +                "title": "FILTER_FIELD_STRENGTH"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CATEGORY",
        +                "title": "FILTER_FIELD_CATEGORY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONNECTOR_ID",
        +                "title": "FILTER_FIELD_CONNECTOR_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY",
        +                "title": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE",
        +                "title": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_DEPARTMENT",
        +                "title": "FILTER_FIELD_DEPARTMENT"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OWNER_ID",
        +                "title": "FILTER_FIELD_ACCOUNT_OWNER_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_INDUSTRY",
        +                "title": "FILTER_FIELD_ACCOUNT_INDUSTRY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_COUNTRY",
        +                "title": "FILTER_FIELD_ACCOUNT_COUNTRY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE",
        +                "title": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONFIDENCE",
        +                "title": "FILTER_FIELD_CONFIDENCE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_INTRO_VALUE",
        +                "title": "FILTER_FIELD_INTRO_VALUE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_ID",
        +                "title": "FILTER_FIELD_ACCOUNT_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_NAME",
        +                "title": "FILTER_FIELD_ACCOUNT_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_DOMAIN",
        +                "title": "FILTER_FIELD_ACCOUNT_DOMAIN"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OWNER_NAME",
        +                "title": "FILTER_FIELD_ACCOUNT_OWNER_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_ID",
        +                "title": "FILTER_FIELD_CONTACT_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_NAME",
        +                "title": "FILTER_FIELD_CONTACT_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_EMAIL",
        +                "title": "FILTER_FIELD_CONTACT_EMAIL"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_TITLE",
        +                "title": "FILTER_FIELD_CONTACT_TITLE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_COMPANY_NAME",
        +                "title": "FILTER_FIELD_CONTACT_COMPANY_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SUPER_CONNECTOR_NAME",
        +                "title": "FILTER_FIELD_SUPER_CONNECTOR_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL",
        +                "title": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_ACCOUNT_ID",
        +                "title": "FILTER_FIELD_SOURCE_ACCOUNT_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_ACCOUNT_NAME",
        +                "title": "FILTER_FIELD_SOURCE_ACCOUNT_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN",
        +                "title": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_CONTACT_ID",
        +                "title": "FILTER_FIELD_SOURCE_CONTACT_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_CONTACT_NAME",
        +                "title": "FILTER_FIELD_SOURCE_CONTACT_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_ICP",
        +                "title": "FILTER_FIELD_ACCOUNT_ICP"
        +              },
        +              {
        +                "const": "FILTER_FIELD_TITLE_PERSONA",
        +                "title": "FILTER_FIELD_TITLE_PERSONA"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_CATEGORY",
        +                "title": "FILTER_FIELD_ACCOUNT_CATEGORY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONNECTOR_LOCATION",
        +                "title": "FILTER_FIELD_CONNECTOR_LOCATION"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY",
        +                "title": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OFFICE_STATE",
        +                "title": "FILTER_FIELD_ACCOUNT_OFFICE_STATE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OFFICE_CITY",
        +                "title": "FILTER_FIELD_ACCOUNT_OFFICE_CITY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_REFERENCE_ID",
        +                "title": "FILTER_FIELD_ACCOUNT_REFERENCE_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_STARRED",
        +                "title": "FILTER_FIELD_STARRED"
        +              }
        +            ]
        +          },
        +          "type": "array"
        +        },
        +        "field": {
        +          "description": "Which attribute to filter on.",
        +          "oneOf": [
        +            {
        +              "const": "FILTER_FIELD_SENIORITY",
        +              "description": "Target contact seniority level. Use IN operator. Stored values: 'Owner/CXO', 'VP', 'DIRECTOR', 'MANAGER', 'IC'. Documented alias OWNER_CXO is also accepted. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_SENIORITY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_LOCATION",
        +              "description": "Target contact's location (country code or location name string). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_LOCATION"
        +            },
        +            {
        +              "const": "FILTER_FIELD_STRENGTH",
        +              "description": "Relationship strength between the connector and target contact. Valid values: 'CONFIRMED', 'STRONG', 'LESS_LIKELY', 'UNLIKELY'. Prefer CONFIRMED and STRONG when looking for high-quality intro paths.",
        +              "title": "FILTER_FIELD_STRENGTH"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CATEGORY",
        +              "description": "Relationship category describing who the super connector is in relation to the company (e.g. Investor, Advisor, Board Member, Customer, Champion, Alumni, Leadership). IMPORTANT: this is NOT the same as seniority (how senior the contact is) or strength (how strong the tie is). Trigger words: investor(s), customer(s), board member(s), advisor(s), champion(s), alumni, leadership, partner(s). Values must be category UUIDs — NOT label strings. Resolution flow: (1) call get_workspace_categories, (2) filter to relationship_type SUPER_CONNECTORS and is_deleted false, (3) match user intent to closest label(s) — OR all plausible matches, (4) use those id UUIDs as filter values.",
        +              "title": "FILTER_FIELD_CATEGORY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONNECTOR_ID",
        +              "description": "RECOMMENDED over FILTER_FIELD_SUPER_CONNECTOR_NAME when the connector user_id is known. Exact match on one or more connector user UUIDs (Keycloak user IDs). Resolve connector names via search_workspace_members first to avoid silent zero-result failures from name prefix matching.",
        +              "title": "FILTER_FIELD_CONNECTOR_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY",
        +              "description": "Include or exclude contacts who have left the tracked company. Values: 'true' or 'false'.",
        +              "title": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE",
        +              "description": "One or more path type evidence signals used to establish the relationship. Use string names from the RelationshipPathType enum. User–Contact: 'LINKEDIN_CONNECTION' (direct LinkedIn connection), 'WORK_OVERLAP' (same company same time), 'EDUCATION_OVERLAP' (same school), 'CALENDAR_EVENT' (meetings on record), 'SELF_DECLARED_CONTACT' (connector declared they know the contact), 'SELF_DECLARED_CONTACT_DONT_KNOW' (connector declared they do not know the contact), 'SUPER_CONNECTOR_APPROVED' (super connector approved the path), 'SUPER_CONNECTOR_DECLINED' (super connector declined), 'TESTIMONIAL' (LinkedIn recommendation one wrote for the other), 'LINKEDIN_ENGAGEMENT' (connector comments on the contact's LinkedIn posts), 'LINKEDIN_POST_MENTION' (connector tagged the contact in one of the connector's own LinkedIn posts), 'PATENT' (connector and contact are co-inventors on a patent), 'PUBLICATION' (connector and contact co-authored a paper or article). User–Account: 'BOARD_MEMBER', 'COMMON_BOARD_HOP' (P1 → P2 via shared board seat), 'ADVISOR', 'LEADERSHIP', 'EMPLOYEE', 'INVESTOR', 'ACCOUNT_ALUMNI' (connector previously worked at target account), 'SELF_DECLARED_ACCOUNT' (connector declared a relationship to the account), 'SELF_DECLARED_ACCOUNT_DONT_KNOW', 'FIRM_PORTFOLIO' (connector works at an investment firm that backed the account). Company–Account: 'COMMON_INVESTOR', 'COMMON_INVESTOR_HOP', 'PORTFOLIO' (a portfolio company of this workspace's investor firm). Contact–Account: 'COMPANY_ALUMNI' (worked at same company at different times). Account insight: 'ACCOUNT_INSIGHT_BOARD_ADVISOR', 'ACCOUNT_INSIGHT_BOARD_ADVISOR_VIA_CONTACT'. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_DEPARTMENT",
        +              "description": "Target contact's department (free-text match). Values are department name strings (e.g. 'Engineering', 'Sales', 'Marketing'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_DEPARTMENT"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OWNER_ID",
        +              "description": "RECOMMENDED over FILTER_FIELD_ACCOUNT_OWNER_NAME when the owner user_id is known. Exact match on CRM account owner user UUID (Keycloak user ID). Resolve owner names via search_workspace_members first.",
        +              "title": "FILTER_FIELD_ACCOUNT_OWNER_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_INDUSTRY",
        +              "description": "Filter by target account industry. Values are industry name strings (e.g. 'Software', 'Financial Services'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_INDUSTRY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_COUNTRY",
        +              "description": "Filter by target account's country. Values are country name strings (e.g. 'United States', 'Germany'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_COUNTRY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE",
        +              "description": "Filter by target account employee headcount range. Valid values: '1', '2-10', '11-50', '51-200', '201-500', '501-1000', '1001-5000', '5001-10000', '10001+'. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONFIDENCE",
        +              "description": "GPT scoring confidence level for the relationship assessment. Valid values: 'High', 'Medium', 'Low'. Use 'High' to restrict results to relationships the scoring model is most certain about. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONFIDENCE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_INTRO_VALUE",
        +              "description": "Assessed value of requesting an introduction through this relationship path. Valid values: 'High', 'Medium', 'Low'. Determined by the Boomerang scoring engine based on strength, seniority, and recency signals. Use 'High' to prioritize the best intro opportunities. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_INTRO_VALUE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_ID",
        +              "description": "Filter by CRM account UUID. Values are account ID strings. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_NAME",
        +              "description": "Filter by target account name (prefix match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_DOMAIN",
        +              "description": "Filter by target account website domain (e.g. 'acme.com'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_DOMAIN"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OWNER_NAME",
        +              "description": "Filter by CRM account owner first OR last name, prefix match on ONE name part only (e.g. [\"John\"] or [\"Smith\"] — NOT \"John Smith\" as one string, which silently returns zero results). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_ACCOUNT_OWNER_ID when user_id is known (resolve via search_workspace_members).",
        +              "title": "FILTER_FIELD_ACCOUNT_OWNER_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_ID",
        +              "description": "RECOMMENDED over FILTER_FIELD_CONTACT_NAME when the contact UUID is known. Exact match on target contact UUID. Resolve contact names via search_contacts first.",
        +              "title": "FILTER_FIELD_CONTACT_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_NAME",
        +              "description": "Filter by target contact first OR last name, prefix match on ONE name part only (e.g. [\"Jane\"] or [\"Doe\"] — NOT \"Jane Doe\" as one string, which silently returns zero results). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_CONTACT_ID when contact UUID is known (resolve via search_contacts).",
        +              "title": "FILTER_FIELD_CONTACT_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_EMAIL",
        +              "description": "Filter by target contact email address (prefix or exact match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONTACT_EMAIL"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_TITLE",
        +              "description": "Filter by target contact job title (prefix match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONTACT_TITLE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_COMPANY_NAME",
        +              "description": "Filter by the company name associated with the target contact — typically the target account name (prefix match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONTACT_COMPANY_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SUPER_CONNECTOR_NAME",
        +              "description": "Filter by super connector's first OR last name, prefix match on ONE name part only (e.g. [\"Steven\"] or [\"Hagler\"] — NOT \"Steven Hagler\" as a single combined string, which will silently return zero results rather than an error). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_CONNECTOR_ID instead whenever the connector's user_id is already known (e.g. from search_workspace_members) — it does an exact match and avoids the silent zero-result failure mode of name-based prefix matching, especially for people with common or multi-word names.",
        +              "title": "FILTER_FIELD_SUPER_CONNECTOR_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL",
        +              "description": "Filter by super connector email address (prefix or exact match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_ACCOUNT_ID",
        +              "description": "Filter by source company UUID — for Account→Account path types (COMMON_INVESTOR, COMMON_BOARD_HOP, ACCOUNT_ALUMNI, SELF_DECLARED_ACCOUNT, COMMON_INVESTOR_HOP, ACCOUNT_INSIGHT_BOARD_ADVISOR, etc.) where the source node is a company, not a user. Exact match. RECOMMENDED over FILTER_FIELD_SOURCE_ACCOUNT_NAME when the account UUID is known (resolve via search_accounts_with_filters first).",
        +              "title": "FILTER_FIELD_SOURCE_ACCOUNT_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_ACCOUNT_NAME",
        +              "description": "Filter by source company name (prefix/substring match) — for Account→Account path types. Use to answer questions like 'which accounts can Garuda Ventures help reach?'. ONE name token per value recommended for broad matching. Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_SOURCE_ACCOUNT_ID when the UUID is known.",
        +              "title": "FILTER_FIELD_SOURCE_ACCOUNT_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN",
        +              "description": "Filter by source company domain (exact or prefix match) — for Account→Account path types. E.g. 'garudaventures.com'. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_CONTACT_ID",
        +              "description": "Filter by source contact UUID — for Contact→Account path types (COMPANY_ALUMNI) where the source node is a contact. Exact match. RECOMMENDED over FILTER_FIELD_SOURCE_CONTACT_NAME when the UUID is known.",
        +              "title": "FILTER_FIELD_SOURCE_CONTACT_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_CONTACT_NAME",
        +              "description": "Filter by source contact first OR last name (prefix match) — for Contact→Account path types. ONE name token per value. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_SOURCE_CONTACT_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_ICP",
        +              "description": "Filter by target account ICP (Ideal Customer Profile) match status. Valid values: 'MATCH' (account matches ICP criteria), 'NO_MATCH' (account evaluated and does not match), 'NO_DATA' (insufficient data to evaluate), 'NO_ICP_DEFINED' (workspace has no ICP configured), 'PRE_MATCH' (pending evaluation). Use the special sentinel value 'null' to match accounts where the ICP field has not been set. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_ICP"
        +            },
        +            {
        +              "const": "FILTER_FIELD_TITLE_PERSONA",
        +              "description": "Buyer persona of the target contact, matched against the contact's title. Values are persona names, NOT job titles: 'BUYING_COMMITTEE' (functional buyers and users — the workspace's buying_committee_regex), 'EXTENDED_BUYING_COMMITTEE' (procurement / finance / IT / legal approval seats — extended_buying_committee_regex), 'LEADERSHIP' (C-suite and VP-level titles from the shared taxonomy, not board members, founders or partner/principal). Multiple values are OR-combined. A persona whose regex is not configured for the workspace is ignored.",
        +              "title": "FILTER_FIELD_TITLE_PERSONA"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_CATEGORY",
        +              "description": "Filter by the target account's category — the workspace's own classification of the account, distinct from ICP. Valid values: 'CUSTOMER', 'PROSPECT', 'OPEN_OPPORTUNITY', 'CLOSED_LOST', 'CHURNED', 'PARTNER', 'COMPETITOR', 'OTHER'. Use the special sentinel value 'null' to match accounts that have not been categorised. An account can carry several categories; multiple values are OR-combined (the account carries any of them), and NOT_IN keeps accounts carrying none of them. Do not confuse with FILTER_FIELD_CATEGORY, which filters on the super connector's category.",
        +              "title": "FILTER_FIELD_ACCOUNT_CATEGORY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONNECTOR_LOCATION",
        +              "description": "Location of the connector (super connector), matched case-insensitively against city, country, or ISO country code (e.g. 'US', 'San Francisco', 'United States'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONNECTOR_LOCATION"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY",
        +              "title": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OFFICE_STATE",
        +              "title": "FILTER_FIELD_ACCOUNT_OFFICE_STATE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OFFICE_CITY",
        +              "title": "FILTER_FIELD_ACCOUNT_OFFICE_CITY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_REFERENCE_ID",
        +              "description": "Filter by the target account's CRM record ID — exact match on reference_id (e.g. Salesforce 18-character Account ID '001xx000003DGbQAAW', HubSpot company ID). Values are CRM IDs, NOT internal UUIDs. Use directly when the user supplies Salesforce/HubSpot IDs — do NOT call search_accounts_with_filters first to resolve them to UUIDs. Pass the id exactly as the CRM stores it: a 15-character Salesforce short id does not match the stored 18-character form, and the match is silent — wrong form returns zero rows, not an error. Only CRM-sourced accounts have a CRM id; accounts created inside Boomerang carry an internal 'BOOM-…' reference_id and never match here. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_REFERENCE_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_STARRED",
        +              "title": "FILTER_FIELD_STARRED"
        +            }
        +          ]
        +        },
        +        "operator": {
        +          "description": "How values are matched. Omit (or 'IN') to keep only rows matching any of the values — the default. Use 'NOT_IN' (aliases: 'NOT_EQUAL_TO', 'NE') to EXCLUDE rows matching any of the values, e.g. field=FILTER_FIELD_ACCOUNT_CATEGORY, operator='NOT_IN', values=['CUSTOMER'] returns paths to accounts that are not customers. A NOT_IN filter keeps rows where the entity exists but the field has no value on record, and excludes paths that have no such entity at all — 'account category not CUSTOMER' returns only paths that target an account, never User→Contact paths. Text filters (names, titles, domains, emails) match by substring, so NOT_IN on them excludes every row CONTAINING a value, not only exact matches — 'account name not [Acme]' also drops 'Acme Holdings'. Not supported on FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY — pass 'true'/'false' with IN instead.",
        +          "type": "string"
        +        },
        +        "values": {
        +          "description": "One or more filter values. Multiple values are OR-combined within the same field, AND across different fields. For FILTER_FIELD_SENIORITY use stored values 'Owner/CXO', 'VP', 'DIRECTOR', 'MANAGER', 'IC' (OWNER_CXO alias accepted). For FILTER_FIELD_STRENGTH use: 'CONFIRMED', 'STRONG', 'LESS_LIKELY', 'UNLIKELY'. For FILTER_FIELD_CATEGORY use category UUIDs resolved from get_workspace_categories (filter to SUPER_CONNECTORS, match by label, use id). For FILTER_FIELD_RELATIONSHIP_PATH_TYPE use RelationshipPathType enum names as strings — User–Contact: 'LINKEDIN_CONNECTION', 'WORK_OVERLAP', 'EDUCATION_OVERLAP', 'CALENDAR_EVENT', 'SELF_DECLARED_CONTACT', 'SELF_DECLARED_CONTACT_DONT_KNOW', 'SUPER_CONNECTOR_APPROVED', 'SUPER_CONNECTOR_DECLINED', 'TESTIMONIAL', 'LINKEDIN_ENGAGEMENT', 'LINKEDIN_POST_MENTION', 'PATENT', 'PUBLICATION'; User–Account: 'BOARD_MEMBER', 'COMMON_BOARD_HOP', 'ADVISOR', 'LEADERSHIP', 'EMPLOYEE', 'INVESTOR', 'ACCOUNT_ALUMNI', 'SELF_DECLARED_ACCOUNT', 'SELF_DECLARED_ACCOUNT_DONT_KNOW', 'FIRM_PORTFOLIO'; Company–Account: 'COMMON_INVESTOR', 'COMMON_INVESTOR_HOP', 'PORTFOLIO'; Contact–Account: 'COMPANY_ALUMNI'; Account insight: 'ACCOUNT_INSIGHT_BOARD_ADVISOR', 'ACCOUNT_INSIGHT_BOARD_ADVISOR_VIA_CONTACT'. For FILTER_FIELD_CONFIDENCE use: 'High', 'Medium', 'Low'. For FILTER_FIELD_INTRO_VALUE use: 'High', 'Medium', 'Low'. For FILTER_FIELD_SOURCE_ACCOUNT_ID/FILTER_FIELD_SOURCE_CONTACT_ID use UUIDs (resolve via search_accounts_with_filters or search_contacts first). For FILTER_FIELD_ACCOUNT_REFERENCE_ID pass CRM record IDs as-is (e.g. Salesforce '001xx000003DGbQAAW') — exact match, no UUID resolution needed. For FILTER_FIELD_ACCOUNT_ICP use: 'MATCH', 'NO_MATCH', 'NO_DATA', 'NO_ICP_DEFINED', 'PRE_MATCH', or the sentinel 'null' to match accounts with no ICP value set. Person-name filters (FILTER_FIELD_SUPER_CONNECTOR_NAME, FILTER_FIELD_CONTACT_NAME, FILTER_FIELD_ACCOUNT_OWNER_NAME, FILTER_FIELD_SOURCE_ACCOUNT_NAME, FILTER_FIELD_SOURCE_CONTACT_NAME): pass ONE first or last name token per value — never a full name like 'Jane Doe' or 'Garuda Ventures' as a single string, which silently returns zero results. Prefer ID-based filters when UUIDs are known.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedsearch_warm_intro_relationships1 field changed
      • changedInput schema / properties / filters / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "properties": {
        -        "fallback_fields": {
        -          "items": {
        -            "oneOf": [
        -              {
        -                "const": "FILTER_FIELD_SENIORITY",
        -                "title": "FILTER_FIELD_SENIORITY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_LOCATION",
        -                "title": "FILTER_FIELD_LOCATION"
        -              },
        -              {
        -                "const": "FILTER_FIELD_STRENGTH",
        -                "title": "FILTER_FIELD_STRENGTH"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CATEGORY",
        -                "title": "FILTER_FIELD_CATEGORY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONNECTOR_ID",
        -                "title": "FILTER_FIELD_CONNECTOR_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY",
        -                "title": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE",
        -                "title": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_DEPARTMENT",
        -                "title": "FILTER_FIELD_DEPARTMENT"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OWNER_ID",
        -                "title": "FILTER_FIELD_ACCOUNT_OWNER_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_INDUSTRY",
        -                "title": "FILTER_FIELD_ACCOUNT_INDUSTRY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_COUNTRY",
        -                "title": "FILTER_FIELD_ACCOUNT_COUNTRY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE",
        -                "title": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONFIDENCE",
        -                "title": "FILTER_FIELD_CONFIDENCE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_INTRO_VALUE",
        -                "title": "FILTER_FIELD_INTRO_VALUE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_ID",
        -                "title": "FILTER_FIELD_ACCOUNT_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_NAME",
        -                "title": "FILTER_FIELD_ACCOUNT_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_DOMAIN",
        -                "title": "FILTER_FIELD_ACCOUNT_DOMAIN"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OWNER_NAME",
        -                "title": "FILTER_FIELD_ACCOUNT_OWNER_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_ID",
        -                "title": "FILTER_FIELD_CONTACT_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_NAME",
        -                "title": "FILTER_FIELD_CONTACT_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_EMAIL",
        -                "title": "FILTER_FIELD_CONTACT_EMAIL"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_TITLE",
        -                "title": "FILTER_FIELD_CONTACT_TITLE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_COMPANY_NAME",
        -                "title": "FILTER_FIELD_CONTACT_COMPANY_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SUPER_CONNECTOR_NAME",
        -                "title": "FILTER_FIELD_SUPER_CONNECTOR_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL",
        -                "title": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_ACCOUNT_ID",
        -                "title": "FILTER_FIELD_SOURCE_ACCOUNT_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_ACCOUNT_NAME",
        -                "title": "FILTER_FIELD_SOURCE_ACCOUNT_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN",
        -                "title": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_CONTACT_ID",
        -                "title": "FILTER_FIELD_SOURCE_CONTACT_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_CONTACT_NAME",
        -                "title": "FILTER_FIELD_SOURCE_CONTACT_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_ICP",
        -                "title": "FILTER_FIELD_ACCOUNT_ICP"
        -              },
        -              {
        -                "const": "FILTER_FIELD_TITLE_PERSONA",
        -                "title": "FILTER_FIELD_TITLE_PERSONA"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_CATEGORY",
        -                "title": "FILTER_FIELD_ACCOUNT_CATEGORY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONNECTOR_LOCATION",
        -                "title": "FILTER_FIELD_CONNECTOR_LOCATION"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY",
        -                "title": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OFFICE_STATE",
        -                "title": "FILTER_FIELD_ACCOUNT_OFFICE_STATE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OFFICE_CITY",
        -                "title": "FILTER_FIELD_ACCOUNT_OFFICE_CITY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_REFERENCE_ID",
        -                "title": "FILTER_FIELD_ACCOUNT_REFERENCE_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_STARRED",
        -                "title": "FILTER_FIELD_STARRED"
        -              }
        -            ]
        -          },
        -          "type": "array"
        -        },
        -        "field": {
        -          "description": "Which attribute to filter on.",
        -          "oneOf": [
        -            {
        -              "const": "FILTER_FIELD_SENIORITY",
        -              "description": "Target contact seniority level. Use IN operator. Stored values: 'Owner/CXO', 'VP', 'DIRECTOR', 'MANAGER', 'IC'. Documented alias OWNER_CXO is also accepted. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_SENIORITY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_LOCATION",
        -              "description": "Target contact's location (country code or location name string). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_LOCATION"
        -            },
        -            {
        -              "const": "FILTER_FIELD_STRENGTH",
        -              "description": "Relationship strength between the connector and target contact. Valid values: 'CONFIRMED', 'STRONG', 'LESS_LIKELY', 'UNLIKELY'. Prefer CONFIRMED and STRONG when looking for high-quality intro paths.",
        -              "title": "FILTER_FIELD_STRENGTH"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CATEGORY",
        -              "description": "Relationship category describing who the super connector is in relation to the company (e.g. Investor, Advisor, Board Member, Customer, Champion, Alumni, Leadership). IMPORTANT: this is NOT the same as seniority (how senior the contact is) or strength (how strong the tie is). Trigger words: investor(s), customer(s), board member(s), advisor(s), champion(s), alumni, leadership, partner(s). Values must be category UUIDs — NOT label strings. Resolution flow: (1) call get_workspace_categories, (2) filter to relationship_type SUPER_CONNECTORS and is_deleted false, (3) match user intent to closest label(s) — OR all plausible matches, (4) use those id UUIDs as filter values.",
        -              "title": "FILTER_FIELD_CATEGORY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONNECTOR_ID",
        -              "description": "RECOMMENDED over FILTER_FIELD_SUPER_CONNECTOR_NAME when the connector user_id is known. Exact match on one or more connector user UUIDs (Keycloak user IDs). Resolve connector names via search_workspace_members first to avoid silent zero-result failures from name prefix matching.",
        -              "title": "FILTER_FIELD_CONNECTOR_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY",
        -              "description": "Include or exclude contacts who have left the tracked company. Values: 'true' or 'false'.",
        -              "title": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE",
        -              "description": "One or more path type evidence signals used to establish the relationship. Use string names from the RelationshipPathType enum. User–Contact: 'LINKEDIN_CONNECTION' (direct LinkedIn connection), 'WORK_OVERLAP' (same company same time), 'EDUCATION_OVERLAP' (same school), 'CALENDAR_EVENT' (meetings on record), 'SELF_DECLARED_CONTACT' (connector declared they know the contact), 'SELF_DECLARED_CONTACT_DONT_KNOW' (connector declared they do not know the contact), 'SUPER_CONNECTOR_APPROVED' (super connector approved the path), 'SUPER_CONNECTOR_DECLINED' (super connector declined), 'TESTIMONIAL' (LinkedIn recommendation one wrote for the other), 'LINKEDIN_ENGAGEMENT' (connector comments on the contact's LinkedIn posts), 'LINKEDIN_POST_MENTION' (connector tagged the contact in one of the connector's own LinkedIn posts). User–Account: 'BOARD_MEMBER', 'COMMON_BOARD_HOP' (P1 → P2 via shared board seat), 'ADVISOR', 'LEADERSHIP', 'EMPLOYEE', 'INVESTOR', 'ACCOUNT_ALUMNI' (connector previously worked at target account), 'SELF_DECLARED_ACCOUNT' (connector declared a relationship to the account), 'SELF_DECLARED_ACCOUNT_DONT_KNOW'. Company–Account: 'COMMON_INVESTOR', 'COMMON_INVESTOR_HOP', 'PORTFOLIO' (a portfolio company of this workspace's investor firm). Contact–Account: 'COMPANY_ALUMNI' (worked at same company at different times). Account insight: 'ACCOUNT_INSIGHT_BOARD_ADVISOR', 'ACCOUNT_INSIGHT_BOARD_ADVISOR_VIA_CONTACT'. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_DEPARTMENT",
        -              "description": "Target contact's department (free-text match). Values are department name strings (e.g. 'Engineering', 'Sales', 'Marketing'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_DEPARTMENT"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OWNER_ID",
        -              "description": "RECOMMENDED over FILTER_FIELD_ACCOUNT_OWNER_NAME when the owner user_id is known. Exact match on CRM account owner user UUID (Keycloak user ID). Resolve owner names via search_workspace_members first.",
        -              "title": "FILTER_FIELD_ACCOUNT_OWNER_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_INDUSTRY",
        -              "description": "Filter by target account industry. Values are industry name strings (e.g. 'Software', 'Financial Services'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_INDUSTRY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_COUNTRY",
        -              "description": "Filter by target account's country. Values are country name strings (e.g. 'United States', 'Germany'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_COUNTRY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE",
        -              "description": "Filter by target account employee headcount range. Valid values: '1', '2-10', '11-50', '51-200', '201-500', '501-1000', '1001-5000', '5001-10000', '10001+'. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONFIDENCE",
        -              "description": "GPT scoring confidence level for the relationship assessment. Valid values: 'High', 'Medium', 'Low'. Use 'High' to restrict results to relationships the scoring model is most certain about. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONFIDENCE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_INTRO_VALUE",
        -              "description": "Assessed value of requesting an introduction through this relationship path. Valid values: 'High', 'Medium', 'Low'. Determined by the Boomerang scoring engine based on strength, seniority, and recency signals. Use 'High' to prioritize the best intro opportunities. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_INTRO_VALUE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_ID",
        -              "description": "Filter by CRM account UUID. Values are account ID strings. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_NAME",
        -              "description": "Filter by target account name (prefix match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_DOMAIN",
        -              "description": "Filter by target account website domain (e.g. 'acme.com'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_DOMAIN"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OWNER_NAME",
        -              "description": "Filter by CRM account owner first OR last name, prefix match on ONE name part only (e.g. [\"John\"] or [\"Smith\"] — NOT \"John Smith\" as one string, which silently returns zero results). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_ACCOUNT_OWNER_ID when user_id is known (resolve via search_workspace_members).",
        -              "title": "FILTER_FIELD_ACCOUNT_OWNER_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_ID",
        -              "description": "RECOMMENDED over FILTER_FIELD_CONTACT_NAME when the contact UUID is known. Exact match on target contact UUID. Resolve contact names via search_contacts first.",
        -              "title": "FILTER_FIELD_CONTACT_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_NAME",
        -              "description": "Filter by target contact first OR last name, prefix match on ONE name part only (e.g. [\"Jane\"] or [\"Doe\"] — NOT \"Jane Doe\" as one string, which silently returns zero results). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_CONTACT_ID when contact UUID is known (resolve via search_contacts).",
        -              "title": "FILTER_FIELD_CONTACT_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_EMAIL",
        -              "description": "Filter by target contact email address (prefix or exact match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONTACT_EMAIL"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_TITLE",
        -              "description": "Filter by target contact job title (prefix match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONTACT_TITLE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_COMPANY_NAME",
        -              "description": "Filter by the company name associated with the target contact — typically the target account name (prefix match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONTACT_COMPANY_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SUPER_CONNECTOR_NAME",
        -              "description": "Filter by super connector's first OR last name, prefix match on ONE name part only (e.g. [\"Steven\"] or [\"Hagler\"] — NOT \"Steven Hagler\" as a single combined string, which will silently return zero results rather than an error). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_CONNECTOR_ID instead whenever the connector's user_id is already known (e.g. from search_workspace_members) — it does an exact match and avoids the silent zero-result failure mode of name-based prefix matching, especially for people with common or multi-word names.",
        -              "title": "FILTER_FIELD_SUPER_CONNECTOR_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL",
        -              "description": "Filter by super connector email address (prefix or exact match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_ACCOUNT_ID",
        -              "description": "Filter by source company UUID — for Account→Account path types (COMMON_INVESTOR, COMMON_BOARD_HOP, ACCOUNT_ALUMNI, SELF_DECLARED_ACCOUNT, COMMON_INVESTOR_HOP, ACCOUNT_INSIGHT_BOARD_ADVISOR, etc.) where the source node is a company, not a user. Exact match. RECOMMENDED over FILTER_FIELD_SOURCE_ACCOUNT_NAME when the account UUID is known (resolve via search_accounts_with_filters first).",
        -              "title": "FILTER_FIELD_SOURCE_ACCOUNT_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_ACCOUNT_NAME",
        -              "description": "Filter by source company name (prefix/substring match) — for Account→Account path types. Use to answer questions like 'which accounts can Garuda Ventures help reach?'. ONE name token per value recommended for broad matching. Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_SOURCE_ACCOUNT_ID when the UUID is known.",
        -              "title": "FILTER_FIELD_SOURCE_ACCOUNT_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN",
        -              "description": "Filter by source company domain (exact or prefix match) — for Account→Account path types. E.g. 'garudaventures.com'. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_CONTACT_ID",
        -              "description": "Filter by source contact UUID — for Contact→Account path types (COMPANY_ALUMNI) where the source node is a contact. Exact match. RECOMMENDED over FILTER_FIELD_SOURCE_CONTACT_NAME when the UUID is known.",
        -              "title": "FILTER_FIELD_SOURCE_CONTACT_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_CONTACT_NAME",
        -              "description": "Filter by source contact first OR last name (prefix match) — for Contact→Account path types. ONE name token per value. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_SOURCE_CONTACT_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_ICP",
        -              "description": "Filter by target account ICP (Ideal Customer Profile) match status. Valid values: 'MATCH' (account matches ICP criteria), 'NO_MATCH' (account evaluated and does not match), 'NO_DATA' (insufficient data to evaluate), 'NO_ICP_DEFINED' (workspace has no ICP configured), 'PRE_MATCH' (pending evaluation). Use the special sentinel value 'null' to match accounts where the ICP field has not been set. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_ICP"
        -            },
        -            {
        -              "const": "FILTER_FIELD_TITLE_PERSONA",
        -              "description": "Buyer persona of the target contact, matched against the contact's title. Values are persona names, NOT job titles: 'BUYING_COMMITTEE' (functional buyers and users — the workspace's buying_committee_regex), 'EXTENDED_BUYING_COMMITTEE' (procurement / finance / IT / legal approval seats — extended_buying_committee_regex), 'LEADERSHIP' (C-suite and VP-level titles from the shared taxonomy, not board members, founders or partner/principal). Multiple values are OR-combined. A persona whose regex is not configured for the workspace is ignored.",
        -              "title": "FILTER_FIELD_TITLE_PERSONA"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_CATEGORY",
        -              "description": "Filter by the target account's category — the workspace's own classification of the account, distinct from ICP. Valid values: 'CUSTOMER', 'PROSPECT', 'OPEN_OPPORTUNITY', 'CLOSED_LOST', 'CHURNED', 'PARTNER', 'COMPETITOR', 'OTHER'. Use the special sentinel value 'null' to match accounts that have not been categorised. An account can carry several categories; multiple values are OR-combined (the account carries any of them), and NOT_IN keeps accounts carrying none of them. Do not confuse with FILTER_FIELD_CATEGORY, which filters on the super connector's category.",
        -              "title": "FILTER_FIELD_ACCOUNT_CATEGORY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONNECTOR_LOCATION",
        -              "description": "Location of the connector (super connector), matched case-insensitively against city, country, or ISO country code (e.g. 'US', 'San Francisco', 'United States'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONNECTOR_LOCATION"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY",
        -              "title": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OFFICE_STATE",
        -              "title": "FILTER_FIELD_ACCOUNT_OFFICE_STATE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OFFICE_CITY",
        -              "title": "FILTER_FIELD_ACCOUNT_OFFICE_CITY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_REFERENCE_ID",
        -              "description": "Filter by the target account's CRM record ID — exact match on reference_id (e.g. Salesforce 18-character Account ID '001xx000003DGbQAAW', HubSpot company ID). Values are CRM IDs, NOT internal UUIDs. Use directly when the user supplies Salesforce/HubSpot IDs — do NOT call search_accounts_with_filters first to resolve them to UUIDs. Pass the id exactly as the CRM stores it: a 15-character Salesforce short id does not match the stored 18-character form, and the match is silent — wrong form returns zero rows, not an error. Only CRM-sourced accounts have a CRM id; accounts created inside Boomerang carry an internal 'BOOM-…' reference_id and never match here. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_REFERENCE_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_STARRED",
        -              "title": "FILTER_FIELD_STARRED"
        -            }
        -          ]
        -        },
        -        "operator": {
        -          "description": "How values are matched. Omit (or 'IN') to keep only rows matching any of the values — the default. Use 'NOT_IN' (aliases: 'NOT_EQUAL_TO', 'NE') to EXCLUDE rows matching any of the values, e.g. field=FILTER_FIELD_ACCOUNT_CATEGORY, operator='NOT_IN', values=['CUSTOMER'] returns paths to accounts that are not customers. A NOT_IN filter keeps rows where the entity exists but the field has no value on record, and excludes paths that have no such entity at all — 'account category not CUSTOMER' returns only paths that target an account, never User→Contact paths. Text filters (names, titles, domains, emails) match by substring, so NOT_IN on them excludes every row CONTAINING a value, not only exact matches — 'account name not [Acme]' also drops 'Acme Holdings'. Not supported on FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY — pass 'true'/'false' with IN instead.",
        -          "type": "string"
        -        },
        -        "values": {
        -          "description": "One or more filter values. Multiple values are OR-combined within the same field, AND across different fields. For FILTER_FIELD_SENIORITY use stored values 'Owner/CXO', 'VP', 'DIRECTOR', 'MANAGER', 'IC' (OWNER_CXO alias accepted). For FILTER_FIELD_STRENGTH use: 'CONFIRMED', 'STRONG', 'LESS_LIKELY', 'UNLIKELY'. For FILTER_FIELD_CATEGORY use category UUIDs resolved from get_workspace_categories (filter to SUPER_CONNECTORS, match by label, use id). For FILTER_FIELD_RELATIONSHIP_PATH_TYPE use RelationshipPathType enum names as strings — User–Contact: 'LINKEDIN_CONNECTION', 'WORK_OVERLAP', 'EDUCATION_OVERLAP', 'CALENDAR_EVENT', 'SELF_DECLARED_CONTACT', 'SELF_DECLARED_CONTACT_DONT_KNOW', 'SUPER_CONNECTOR_APPROVED', 'SUPER_CONNECTOR_DECLINED'; User–Account: 'BOARD_MEMBER', 'COMMON_BOARD_HOP', 'ADVISOR', 'LEADERSHIP', 'EMPLOYEE', 'INVESTOR', 'ACCOUNT_ALUMNI', 'SELF_DECLARED_ACCOUNT', 'SELF_DECLARED_ACCOUNT_DONT_KNOW'; Company–Account: 'COMMON_INVESTOR', 'COMMON_INVESTOR_HOP', 'PORTFOLIO'; Contact–Account: 'COMPANY_ALUMNI'; Account insight: 'ACCOUNT_INSIGHT_BOARD_ADVISOR', 'ACCOUNT_INSIGHT_BOARD_ADVISOR_VIA_CONTACT'. For FILTER_FIELD_CONFIDENCE use: 'High', 'Medium', 'Low'. For FILTER_FIELD_INTRO_VALUE use: 'High', 'Medium', 'Low'. For FILTER_FIELD_SOURCE_ACCOUNT_ID/FILTER_FIELD_SOURCE_CONTACT_ID use UUIDs (resolve via search_accounts_with_filters or search_contacts first). For FILTER_FIELD_ACCOUNT_REFERENCE_ID pass CRM record IDs as-is (e.g. Salesforce '001xx000003DGbQAAW') — exact match, no UUID resolution needed. For FILTER_FIELD_ACCOUNT_ICP use: 'MATCH', 'NO_MATCH', 'NO_DATA', 'NO_ICP_DEFINED', 'PRE_MATCH', or the sentinel 'null' to match accounts with no ICP value set. Person-name filters (FILTER_FIELD_SUPER_CONNECTOR_NAME, FILTER_FIELD_CONTACT_NAME, FILTER_FIELD_ACCOUNT_OWNER_NAME, FILTER_FIELD_SOURCE_ACCOUNT_NAME, FILTER_FIELD_SOURCE_CONTACT_NAME): pass ONE first or last name token per value — never a full name like 'Jane Doe' or 'Garuda Ventures' as a single string, which silently returns zero results. Prefer ID-based filters when UUIDs are known.",
        -          "items": {
        -            "type": "string"
        -          },
        -          "type": "array"
        -        }
        -      },
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "properties": {
        +        "fallback_fields": {
        +          "items": {
        +            "oneOf": [
        +              {
        +                "const": "FILTER_FIELD_SENIORITY",
        +                "title": "FILTER_FIELD_SENIORITY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_LOCATION",
        +                "title": "FILTER_FIELD_LOCATION"
        +              },
        +              {
        +                "const": "FILTER_FIELD_STRENGTH",
        +                "title": "FILTER_FIELD_STRENGTH"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CATEGORY",
        +                "title": "FILTER_FIELD_CATEGORY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONNECTOR_ID",
        +                "title": "FILTER_FIELD_CONNECTOR_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY",
        +                "title": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE",
        +                "title": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_DEPARTMENT",
        +                "title": "FILTER_FIELD_DEPARTMENT"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OWNER_ID",
        +                "title": "FILTER_FIELD_ACCOUNT_OWNER_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_INDUSTRY",
        +                "title": "FILTER_FIELD_ACCOUNT_INDUSTRY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_COUNTRY",
        +                "title": "FILTER_FIELD_ACCOUNT_COUNTRY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE",
        +                "title": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONFIDENCE",
        +                "title": "FILTER_FIELD_CONFIDENCE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_INTRO_VALUE",
        +                "title": "FILTER_FIELD_INTRO_VALUE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_ID",
        +                "title": "FILTER_FIELD_ACCOUNT_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_NAME",
        +                "title": "FILTER_FIELD_ACCOUNT_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_DOMAIN",
        +                "title": "FILTER_FIELD_ACCOUNT_DOMAIN"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OWNER_NAME",
        +                "title": "FILTER_FIELD_ACCOUNT_OWNER_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_ID",
        +                "title": "FILTER_FIELD_CONTACT_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_NAME",
        +                "title": "FILTER_FIELD_CONTACT_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_EMAIL",
        +                "title": "FILTER_FIELD_CONTACT_EMAIL"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_TITLE",
        +                "title": "FILTER_FIELD_CONTACT_TITLE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_COMPANY_NAME",
        +                "title": "FILTER_FIELD_CONTACT_COMPANY_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SUPER_CONNECTOR_NAME",
        +                "title": "FILTER_FIELD_SUPER_CONNECTOR_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL",
        +                "title": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_ACCOUNT_ID",
        +                "title": "FILTER_FIELD_SOURCE_ACCOUNT_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_ACCOUNT_NAME",
        +                "title": "FILTER_FIELD_SOURCE_ACCOUNT_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN",
        +                "title": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_CONTACT_ID",
        +                "title": "FILTER_FIELD_SOURCE_CONTACT_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_CONTACT_NAME",
        +                "title": "FILTER_FIELD_SOURCE_CONTACT_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_ICP",
        +                "title": "FILTER_FIELD_ACCOUNT_ICP"
        +              },
        +              {
        +                "const": "FILTER_FIELD_TITLE_PERSONA",
        +                "title": "FILTER_FIELD_TITLE_PERSONA"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_CATEGORY",
        +                "title": "FILTER_FIELD_ACCOUNT_CATEGORY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONNECTOR_LOCATION",
        +                "title": "FILTER_FIELD_CONNECTOR_LOCATION"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY",
        +                "title": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OFFICE_STATE",
        +                "title": "FILTER_FIELD_ACCOUNT_OFFICE_STATE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OFFICE_CITY",
        +                "title": "FILTER_FIELD_ACCOUNT_OFFICE_CITY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_REFERENCE_ID",
        +                "title": "FILTER_FIELD_ACCOUNT_REFERENCE_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_STARRED",
        +                "title": "FILTER_FIELD_STARRED"
        +              }
        +            ]
        +          },
        +          "type": "array"
        +        },
        +        "field": {
        +          "description": "Which attribute to filter on.",
        +          "oneOf": [
        +            {
        +              "const": "FILTER_FIELD_SENIORITY",
        +              "description": "Target contact seniority level. Use IN operator. Stored values: 'Owner/CXO', 'VP', 'DIRECTOR', 'MANAGER', 'IC'. Documented alias OWNER_CXO is also accepted. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_SENIORITY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_LOCATION",
        +              "description": "Target contact's location (country code or location name string). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_LOCATION"
        +            },
        +            {
        +              "const": "FILTER_FIELD_STRENGTH",
        +              "description": "Relationship strength between the connector and target contact. Valid values: 'CONFIRMED', 'STRONG', 'LESS_LIKELY', 'UNLIKELY'. Prefer CONFIRMED and STRONG when looking for high-quality intro paths.",
        +              "title": "FILTER_FIELD_STRENGTH"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CATEGORY",
        +              "description": "Relationship category describing who the super connector is in relation to the company (e.g. Investor, Advisor, Board Member, Customer, Champion, Alumni, Leadership). IMPORTANT: this is NOT the same as seniority (how senior the contact is) or strength (how strong the tie is). Trigger words: investor(s), customer(s), board member(s), advisor(s), champion(s), alumni, leadership, partner(s). Values must be category UUIDs — NOT label strings. Resolution flow: (1) call get_workspace_categories, (2) filter to relationship_type SUPER_CONNECTORS and is_deleted false, (3) match user intent to closest label(s) — OR all plausible matches, (4) use those id UUIDs as filter values.",
        +              "title": "FILTER_FIELD_CATEGORY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONNECTOR_ID",
        +              "description": "RECOMMENDED over FILTER_FIELD_SUPER_CONNECTOR_NAME when the connector user_id is known. Exact match on one or more connector user UUIDs (Keycloak user IDs). Resolve connector names via search_workspace_members first to avoid silent zero-result failures from name prefix matching.",
        +              "title": "FILTER_FIELD_CONNECTOR_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY",
        +              "description": "Include or exclude contacts who have left the tracked company. Values: 'true' or 'false'.",
        +              "title": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE",
        +              "description": "One or more path type evidence signals used to establish the relationship. Use string names from the RelationshipPathType enum. User–Contact: 'LINKEDIN_CONNECTION' (direct LinkedIn connection), 'WORK_OVERLAP' (same company same time), 'EDUCATION_OVERLAP' (same school), 'CALENDAR_EVENT' (meetings on record), 'SELF_DECLARED_CONTACT' (connector declared they know the contact), 'SELF_DECLARED_CONTACT_DONT_KNOW' (connector declared they do not know the contact), 'SUPER_CONNECTOR_APPROVED' (super connector approved the path), 'SUPER_CONNECTOR_DECLINED' (super connector declined), 'TESTIMONIAL' (LinkedIn recommendation one wrote for the other), 'LINKEDIN_ENGAGEMENT' (connector comments on the contact's LinkedIn posts), 'LINKEDIN_POST_MENTION' (connector tagged the contact in one of the connector's own LinkedIn posts), 'PATENT' (connector and contact are co-inventors on a patent), 'PUBLICATION' (connector and contact co-authored a paper or article). User–Account: 'BOARD_MEMBER', 'COMMON_BOARD_HOP' (P1 → P2 via shared board seat), 'ADVISOR', 'LEADERSHIP', 'EMPLOYEE', 'INVESTOR', 'ACCOUNT_ALUMNI' (connector previously worked at target account), 'SELF_DECLARED_ACCOUNT' (connector declared a relationship to the account), 'SELF_DECLARED_ACCOUNT_DONT_KNOW', 'FIRM_PORTFOLIO' (connector works at an investment firm that backed the account). Company–Account: 'COMMON_INVESTOR', 'COMMON_INVESTOR_HOP', 'PORTFOLIO' (a portfolio company of this workspace's investor firm). Contact–Account: 'COMPANY_ALUMNI' (worked at same company at different times). Account insight: 'ACCOUNT_INSIGHT_BOARD_ADVISOR', 'ACCOUNT_INSIGHT_BOARD_ADVISOR_VIA_CONTACT'. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_DEPARTMENT",
        +              "description": "Target contact's department (free-text match). Values are department name strings (e.g. 'Engineering', 'Sales', 'Marketing'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_DEPARTMENT"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OWNER_ID",
        +              "description": "RECOMMENDED over FILTER_FIELD_ACCOUNT_OWNER_NAME when the owner user_id is known. Exact match on CRM account owner user UUID (Keycloak user ID). Resolve owner names via search_workspace_members first.",
        +              "title": "FILTER_FIELD_ACCOUNT_OWNER_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_INDUSTRY",
        +              "description": "Filter by target account industry. Values are industry name strings (e.g. 'Software', 'Financial Services'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_INDUSTRY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_COUNTRY",
        +              "description": "Filter by target account's country. Values are country name strings (e.g. 'United States', 'Germany'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_COUNTRY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE",
        +              "description": "Filter by target account employee headcount range. Valid values: '1', '2-10', '11-50', '51-200', '201-500', '501-1000', '1001-5000', '5001-10000', '10001+'. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONFIDENCE",
        +              "description": "GPT scoring confidence level for the relationship assessment. Valid values: 'High', 'Medium', 'Low'. Use 'High' to restrict results to relationships the scoring model is most certain about. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONFIDENCE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_INTRO_VALUE",
        +              "description": "Assessed value of requesting an introduction through this relationship path. Valid values: 'High', 'Medium', 'Low'. Determined by the Boomerang scoring engine based on strength, seniority, and recency signals. Use 'High' to prioritize the best intro opportunities. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_INTRO_VALUE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_ID",
        +              "description": "Filter by CRM account UUID. Values are account ID strings. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_NAME",
        +              "description": "Filter by target account name (prefix match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_DOMAIN",
        +              "description": "Filter by target account website domain (e.g. 'acme.com'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_DOMAIN"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OWNER_NAME",
        +              "description": "Filter by CRM account owner first OR last name, prefix match on ONE name part only (e.g. [\"John\"] or [\"Smith\"] — NOT \"John Smith\" as one string, which silently returns zero results). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_ACCOUNT_OWNER_ID when user_id is known (resolve via search_workspace_members).",
        +              "title": "FILTER_FIELD_ACCOUNT_OWNER_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_ID",
        +              "description": "RECOMMENDED over FILTER_FIELD_CONTACT_NAME when the contact UUID is known. Exact match on target contact UUID. Resolve contact names via search_contacts first.",
        +              "title": "FILTER_FIELD_CONTACT_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_NAME",
        +              "description": "Filter by target contact first OR last name, prefix match on ONE name part only (e.g. [\"Jane\"] or [\"Doe\"] — NOT \"Jane Doe\" as one string, which silently returns zero results). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_CONTACT_ID when contact UUID is known (resolve via search_contacts).",
        +              "title": "FILTER_FIELD_CONTACT_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_EMAIL",
        +              "description": "Filter by target contact email address (prefix or exact match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONTACT_EMAIL"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_TITLE",
        +              "description": "Filter by target contact job title (prefix match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONTACT_TITLE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_COMPANY_NAME",
        +              "description": "Filter by the company name associated with the target contact — typically the target account name (prefix match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONTACT_COMPANY_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SUPER_CONNECTOR_NAME",
        +              "description": "Filter by super connector's first OR last name, prefix match on ONE name part only (e.g. [\"Steven\"] or [\"Hagler\"] — NOT \"Steven Hagler\" as a single combined string, which will silently return zero results rather than an error). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_CONNECTOR_ID instead whenever the connector's user_id is already known (e.g. from search_workspace_members) — it does an exact match and avoids the silent zero-result failure mode of name-based prefix matching, especially for people with common or multi-word names.",
        +              "title": "FILTER_FIELD_SUPER_CONNECTOR_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL",
        +              "description": "Filter by super connector email address (prefix or exact match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_ACCOUNT_ID",
        +              "description": "Filter by source company UUID — for Account→Account path types (COMMON_INVESTOR, COMMON_BOARD_HOP, ACCOUNT_ALUMNI, SELF_DECLARED_ACCOUNT, COMMON_INVESTOR_HOP, ACCOUNT_INSIGHT_BOARD_ADVISOR, etc.) where the source node is a company, not a user. Exact match. RECOMMENDED over FILTER_FIELD_SOURCE_ACCOUNT_NAME when the account UUID is known (resolve via search_accounts_with_filters first).",
        +              "title": "FILTER_FIELD_SOURCE_ACCOUNT_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_ACCOUNT_NAME",
        +              "description": "Filter by source company name (prefix/substring match) — for Account→Account path types. Use to answer questions like 'which accounts can Garuda Ventures help reach?'. ONE name token per value recommended for broad matching. Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_SOURCE_ACCOUNT_ID when the UUID is known.",
        +              "title": "FILTER_FIELD_SOURCE_ACCOUNT_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN",
        +              "description": "Filter by source company domain (exact or prefix match) — for Account→Account path types. E.g. 'garudaventures.com'. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_CONTACT_ID",
        +              "description": "Filter by source contact UUID — for Contact→Account path types (COMPANY_ALUMNI) where the source node is a contact. Exact match. RECOMMENDED over FILTER_FIELD_SOURCE_CONTACT_NAME when the UUID is known.",
        +              "title": "FILTER_FIELD_SOURCE_CONTACT_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_CONTACT_NAME",
        +              "description": "Filter by source contact first OR last name (prefix match) — for Contact→Account path types. ONE name token per value. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_SOURCE_CONTACT_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_ICP",
        +              "description": "Filter by target account ICP (Ideal Customer Profile) match status. Valid values: 'MATCH' (account matches ICP criteria), 'NO_MATCH' (account evaluated and does not match), 'NO_DATA' (insufficient data to evaluate), 'NO_ICP_DEFINED' (workspace has no ICP configured), 'PRE_MATCH' (pending evaluation). Use the special sentinel value 'null' to match accounts where the ICP field has not been set. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_ICP"
        +            },
        +            {
        +              "const": "FILTER_FIELD_TITLE_PERSONA",
        +              "description": "Buyer persona of the target contact, matched against the contact's title. Values are persona names, NOT job titles: 'BUYING_COMMITTEE' (functional buyers and users — the workspace's buying_committee_regex), 'EXTENDED_BUYING_COMMITTEE' (procurement / finance / IT / legal approval seats — extended_buying_committee_regex), 'LEADERSHIP' (C-suite and VP-level titles from the shared taxonomy, not board members, founders or partner/principal). Multiple values are OR-combined. A persona whose regex is not configured for the workspace is ignored.",
        +              "title": "FILTER_FIELD_TITLE_PERSONA"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_CATEGORY",
        +              "description": "Filter by the target account's category — the workspace's own classification of the account, distinct from ICP. Valid values: 'CUSTOMER', 'PROSPECT', 'OPEN_OPPORTUNITY', 'CLOSED_LOST', 'CHURNED', 'PARTNER', 'COMPETITOR', 'OTHER'. Use the special sentinel value 'null' to match accounts that have not been categorised. An account can carry several categories; multiple values are OR-combined (the account carries any of them), and NOT_IN keeps accounts carrying none of them. Do not confuse with FILTER_FIELD_CATEGORY, which filters on the super connector's category.",
        +              "title": "FILTER_FIELD_ACCOUNT_CATEGORY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONNECTOR_LOCATION",
        +              "description": "Location of the connector (super connector), matched case-insensitively against city, country, or ISO country code (e.g. 'US', 'San Francisco', 'United States'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONNECTOR_LOCATION"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY",
        +              "title": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OFFICE_STATE",
        +              "title": "FILTER_FIELD_ACCOUNT_OFFICE_STATE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OFFICE_CITY",
        +              "title": "FILTER_FIELD_ACCOUNT_OFFICE_CITY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_REFERENCE_ID",
        +              "description": "Filter by the target account's CRM record ID — exact match on reference_id (e.g. Salesforce 18-character Account ID '001xx000003DGbQAAW', HubSpot company ID). Values are CRM IDs, NOT internal UUIDs. Use directly when the user supplies Salesforce/HubSpot IDs — do NOT call search_accounts_with_filters first to resolve them to UUIDs. Pass the id exactly as the CRM stores it: a 15-character Salesforce short id does not match the stored 18-character form, and the match is silent — wrong form returns zero rows, not an error. Only CRM-sourced accounts have a CRM id; accounts created inside Boomerang carry an internal 'BOOM-…' reference_id and never match here. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_REFERENCE_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_STARRED",
        +              "title": "FILTER_FIELD_STARRED"
        +            }
        +          ]
        +        },
        +        "operator": {
        +          "description": "How values are matched. Omit (or 'IN') to keep only rows matching any of the values — the default. Use 'NOT_IN' (aliases: 'NOT_EQUAL_TO', 'NE') to EXCLUDE rows matching any of the values, e.g. field=FILTER_FIELD_ACCOUNT_CATEGORY, operator='NOT_IN', values=['CUSTOMER'] returns paths to accounts that are not customers. A NOT_IN filter keeps rows where the entity exists but the field has no value on record, and excludes paths that have no such entity at all — 'account category not CUSTOMER' returns only paths that target an account, never User→Contact paths. Text filters (names, titles, domains, emails) match by substring, so NOT_IN on them excludes every row CONTAINING a value, not only exact matches — 'account name not [Acme]' also drops 'Acme Holdings'. Not supported on FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY — pass 'true'/'false' with IN instead.",
        +          "type": "string"
        +        },
        +        "values": {
        +          "description": "One or more filter values. Multiple values are OR-combined within the same field, AND across different fields. For FILTER_FIELD_SENIORITY use stored values 'Owner/CXO', 'VP', 'DIRECTOR', 'MANAGER', 'IC' (OWNER_CXO alias accepted). For FILTER_FIELD_STRENGTH use: 'CONFIRMED', 'STRONG', 'LESS_LIKELY', 'UNLIKELY'. For FILTER_FIELD_CATEGORY use category UUIDs resolved from get_workspace_categories (filter to SUPER_CONNECTORS, match by label, use id). For FILTER_FIELD_RELATIONSHIP_PATH_TYPE use RelationshipPathType enum names as strings — User–Contact: 'LINKEDIN_CONNECTION', 'WORK_OVERLAP', 'EDUCATION_OVERLAP', 'CALENDAR_EVENT', 'SELF_DECLARED_CONTACT', 'SELF_DECLARED_CONTACT_DONT_KNOW', 'SUPER_CONNECTOR_APPROVED', 'SUPER_CONNECTOR_DECLINED', 'TESTIMONIAL', 'LINKEDIN_ENGAGEMENT', 'LINKEDIN_POST_MENTION', 'PATENT', 'PUBLICATION'; User–Account: 'BOARD_MEMBER', 'COMMON_BOARD_HOP', 'ADVISOR', 'LEADERSHIP', 'EMPLOYEE', 'INVESTOR', 'ACCOUNT_ALUMNI', 'SELF_DECLARED_ACCOUNT', 'SELF_DECLARED_ACCOUNT_DONT_KNOW', 'FIRM_PORTFOLIO'; Company–Account: 'COMMON_INVESTOR', 'COMMON_INVESTOR_HOP', 'PORTFOLIO'; Contact–Account: 'COMPANY_ALUMNI'; Account insight: 'ACCOUNT_INSIGHT_BOARD_ADVISOR', 'ACCOUNT_INSIGHT_BOARD_ADVISOR_VIA_CONTACT'. For FILTER_FIELD_CONFIDENCE use: 'High', 'Medium', 'Low'. For FILTER_FIELD_INTRO_VALUE use: 'High', 'Medium', 'Low'. For FILTER_FIELD_SOURCE_ACCOUNT_ID/FILTER_FIELD_SOURCE_CONTACT_ID use UUIDs (resolve via search_accounts_with_filters or search_contacts first). For FILTER_FIELD_ACCOUNT_REFERENCE_ID pass CRM record IDs as-is (e.g. Salesforce '001xx000003DGbQAAW') — exact match, no UUID resolution needed. For FILTER_FIELD_ACCOUNT_ICP use: 'MATCH', 'NO_MATCH', 'NO_DATA', 'NO_ICP_DEFINED', 'PRE_MATCH', or the sentinel 'null' to match accounts with no ICP value set. Person-name filters (FILTER_FIELD_SUPER_CONNECTOR_NAME, FILTER_FIELD_CONTACT_NAME, FILTER_FIELD_ACCOUNT_OWNER_NAME, FILTER_FIELD_SOURCE_ACCOUNT_NAME, FILTER_FIELD_SOURCE_CONTACT_NAME): pass ONE first or last name token per value — never a full name like 'Jane Doe' or 'Garuda Ventures' as a single string, which silently returns zero results. Prefer ID-based filters when UUIDs are known.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
  3. 2 tool updates
    • Changedadd_role1 field changed
      • addedInput schema / properties / super_connector_state
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
    • Changedsearch_workspace_members1 field changed
      • changedInput schema / properties / filter_groups / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "properties": {
        -        "criteria": {
        -          "description": "One or more filter conditions. Each entry is {field: <enum>, operator: <enum>, values: [<strings>]}. At least one criterion required per group. Example by role: [{field: 'WORKSPACE_MEMBER_FILTER_FIELD_ROLE', operator: 'WORKSPACE_MEMBER_FILTER_OPERATOR_IN', values: ['ADMIN']}].",
        -          "items": {
        -            "properties": {
        -              "field": {
        -                "description": "Enum. The member attribute to filter on. Must pair with a compatible operator. Primary filters: WORKSPACE_MEMBER_FILTER_FIELD_NAME→CONTAINS or EQUALS | WORKSPACE_MEMBER_FILTER_FIELD_ROLE→IN | WORKSPACE_MEMBER_FILTER_FIELD_EMAIL→CONTAINS or EQUALS. Also: USER_ID→EQUALS | LINKEDIN_ID→CONTAINS or EQUALS | CREATED_AT→GTE or LTE | consent fields→IN | TITLE→REGEX.",
        -                "oneOf": [
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_ROLE",
        -                    "description": "Workspace role assignment. Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_IN only. Values: 'OWNER', 'ADMIN', 'SUPER_CONNECTOR', 'SUPER_CONNECTOR_ADMIN', 'REQUESTER', 'TECHNICAL_ADMIN'. Example: IN ['SUPER_CONNECTOR']. Member matches if ANY of their roles is in the list.",
        -                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_ROLE"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_CREATED_AT",
        -                    "description": "When the member joined. Operators: WORKSPACE_MEMBER_FILTER_OPERATOR_GTE (on/after) or WORKSPACE_MEMBER_FILTER_OPERATOR_LTE (on/before). Value: ISO-8601 datetime e.g. ['2024-06-01T00:00:00Z'].",
        -                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_CREATED_AT"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_EMAIL",
        -                    "description": "Email address. Operators: WORKSPACE_MEMBER_FILTER_OPERATOR_CONTAINS (partial/domain, e.g. ['@acme.com']) WORKSPACE_MEMBER_FILTER_OPERATOR_EQUALS (exact, e.g. ['jane@acme.com']) or WORKSPACE_MEMBER_FILTER_OPERATOR_IN (exact, any of several, e.g. ['jane@acme.com', 'bob@acme.com']). Case-insensitive.",
        -                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_EMAIL"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_NAME",
        -                    "description": "Member first or last name. Operators: WORKSPACE_MEMBER_FILTER_OPERATOR_CONTAINS (partial, e.g. ['smith']) or WORKSPACE_MEMBER_FILTER_OPERATOR_EQUALS (exact full name, e.g. ['John Smith']). Case-insensitive.",
        -                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_NAME"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_USER_ID",
        -                    "description": "Platform user UUID. Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_EQUALS only — IN is NOT valid for this field. Example: EQUALS ['550e8400-e29b-41d4-a716-446655440000']. To match multiple user IDs, add one EQUALS criterion per ID inside a WORKSPACE_MEMBER_FILTER_LOGIC_OR filter group, not a single IN criterion.",
        -                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_USER_ID"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_LINKEDIN_ID",
        -                    "description": "LinkedIn profile ID or URL. Operators: WORKSPACE_MEMBER_FILTER_OPERATOR_CONTAINS or WORKSPACE_MEMBER_FILTER_OPERATOR_EQUALS. Example CONTAINS: ['linkedin.com/in/johndoe'].",
        -                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_LINKEDIN_ID"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_WHATSAPP_CONSENT",
        -                    "description": "WhatsApp consent. Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_IN only. Values: 'WHATSAPP_CONSENT_PENDING', 'WHATSAPP_CONSENT_GRANTED', 'WHATSAPP_CONSENT_DENIED'.",
        -                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_WHATSAPP_CONSENT"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_SUPER_CONNECTOR_OPT_IN",
        -                    "description": "Super Connector opt-in status. Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_IN only. Values: 'SUPER_CONNECTOR_OPT_IN_GRANTED', 'SUPER_CONNECTOR_OPT_IN_DENIED'.",
        -                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_SUPER_CONNECTOR_OPT_IN"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_CONNECTION_CONSENT",
        -                    "description": "LinkedIn connection-sharing consent. Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_IN only. Values: 'CONNECTION_CONSENT_PENDING', 'CONNECTION_CONSENT_GRANTED', 'CONNECTION_CONSENT_DENIED'.",
        -                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_CONNECTION_CONSENT"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_SC_ONBOARDING_STATUS",
        -                    "description": "Super Connector onboarding stage. Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_IN only. Values: 'SC_ONBOARDING_NOT_STARTED', 'SC_ONBOARDING_IN_PROGRESS', 'SC_ONBOARDING_COMPLETED'.",
        -                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_SC_ONBOARDING_STATUS"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_CATEGORY",
        -                    "description": "Category tag(s) assigned to the member. Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_IN only. Pass one or more WorkspaceMemberCategoryName display values — the complete set is 'Leadership', 'Board', 'Advisors', 'Customers', 'Employees', 'Alumni', 'Investors', 'Others', 'Power User', 'Partners'. Matched exactly and case-sensitively; anything else returns no rows. Member matches if ANY of their categories is in the list. No UUID lookup needed.",
        -                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_CATEGORY"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_LOCATION",
        -                    "description": "Location of the workspace member. Matched case-insensitively against city, country, or ISO country code (e.g. 'US', 'San Francisco', 'United States'). Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_IN. Multiple values are OR-combined.",
        -                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_LOCATION"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_TAG",
        -                    "description": "Workspace-defined tags assigned to the member. Values are tag UUIDs from Tagging.ListTags, not names. Operators: WORKSPACE_MEMBER_FILTER_OPERATOR_IN (member carries ANY of the given tags) or WORKSPACE_MEMBER_FILTER_OPERATOR_NOT_IN (member carries NONE of the given tags). Example: IN ['dd491a85-3563-408d-bb2e-d9a4ee7ddda9'].",
        -                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_TAG"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_TITLE",
        -                    "description": "Member's current job title(s), enriched from profile_data. Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_REGEX only. Pass exactly one Postgres regex pattern, e.g. ['(?i)^VP.*Sales'] for a case-insensitive prefix match. Only current employment is searched — a member whose title changed and is no longer current will not match on the old title.",
        -                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_TITLE"
        -                  }
        -                ]
        -              },
        -              "operator": {
        -                "description": "Enum. Comparison operator — must be valid for the chosen field. IN→ROLE, CATEGORY, TAG, consent fields. NOT_IN→TAG only. CONTAINS→NAME, EMAIL, LINKEDIN_ID. EQUALS→NAME, EMAIL, USER_ID, LINKEDIN_ID. GTE/LTE→CREATED_AT only. REGEX→TITLE only. Wrong pair returns no results or an error.",
        -                "oneOf": [
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_OPERATOR_IN",
        -                    "description": "Value is in the provided list (any match). Valid fields: WORKSPACE_MEMBER_FILTER_FIELD_ROLE ('OWNER', 'ADMIN', 'SUPER_CONNECTOR', etc.), WORKSPACE_MEMBER_FILTER_FIELD_CATEGORY (display names e.g. 'Investors', 'Board'), WORKSPACE_MEMBER_FILTER_FIELD_TAG (tag UUIDs), WORKSPACE_MEMBER_FILTER_FIELD_EMAIL (exact addresses, case-insensitive), and consent fields. Pass one or more exact strings in values.",
        -                    "title": "WORKSPACE_MEMBER_FILTER_OPERATOR_IN"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_OPERATOR_CONTAINS",
        -                    "description": "Case-insensitive substring match. Valid fields: WORKSPACE_MEMBER_FILTER_FIELD_NAME, WORKSPACE_MEMBER_FILTER_FIELD_EMAIL, WORKSPACE_MEMBER_FILTER_FIELD_LINKEDIN_ID. Pass exactly one string e.g. ['smith'] or ['@acme.com'].",
        -                    "title": "WORKSPACE_MEMBER_FILTER_OPERATOR_CONTAINS"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_OPERATOR_GTE",
        -                    "description": "Greater than or equal (date). Valid field: WORKSPACE_MEMBER_FILTER_FIELD_CREATED_AT only. Pass one ISO-8601 datetime e.g. ['2024-01-01T00:00:00Z'].",
        -                    "title": "WORKSPACE_MEMBER_FILTER_OPERATOR_GTE"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_OPERATOR_LTE",
        -                    "description": "Less than or equal (date). Valid field: WORKSPACE_MEMBER_FILTER_FIELD_CREATED_AT only. Pass one ISO-8601 datetime.",
        -                    "title": "WORKSPACE_MEMBER_FILTER_OPERATOR_LTE"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_OPERATOR_EQUALS",
        -                    "description": "Exact match (case-insensitive for text). Valid fields: WORKSPACE_MEMBER_FILTER_FIELD_NAME, WORKSPACE_MEMBER_FILTER_FIELD_EMAIL, WORKSPACE_MEMBER_FILTER_FIELD_USER_ID, WORKSPACE_MEMBER_FILTER_FIELD_LINKEDIN_ID. Pass exactly one value.",
        -                    "title": "WORKSPACE_MEMBER_FILTER_OPERATOR_EQUALS"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_OPERATOR_NOT_IN",
        -                    "description": "Value is NOT in the provided list (exclusion). Valid field: WORKSPACE_MEMBER_FILTER_FIELD_TAG only. Member matches if none of their tags are in the list. Pass one or more tag UUIDs.",
        -                    "title": "WORKSPACE_MEMBER_FILTER_OPERATOR_NOT_IN"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_OPERATOR_REGEX",
        -                    "description": "Case-insensitive-capable Postgres regular expression match (use an inline '(?i)' flag for case-insensitivity). Valid field: WORKSPACE_MEMBER_FILTER_FIELD_TITLE only. Pass exactly one pattern, e.g. ['(?i)^VP.*Sales'] or ['(?i)(chief|head).*(sales|revenue)'].",
        -                    "title": "WORKSPACE_MEMBER_FILTER_OPERATOR_REGEX"
        -                  }
        -                ]
        -              },
        -              "values": {
        -                "description": "Filter value(s) as a JSON array of strings — NEVER a bare string. NAME CONTAINS→['partial']; NAME EQUALS→['John Smith']; ROLE IN→['ADMIN'] or ['SUPER_CONNECTOR','SUPER_CONNECTOR_ADMIN']; EMAIL CONTAINS→['@domain.com']; EMAIL EQUALS→['user@company.com']; USER_ID EQUALS→['<uuid>']; LINKEDIN_ID CONTAINS→['linkedin.com/in/handle']; CREATED_AT GTE/LTE→['2024-01-01T00:00:00Z']; TITLE REGEX→['(?i)^VP.*Sales']. Role and consent enum strings are case-sensitive.",
        -                "items": {
        -                  "type": "string"
        -                },
        -                "type": "array"
        -              }
        -            },
        -            "type": "object"
        -          },
        -          "type": "array"
        -        },
        -        "logic": {
        -          "description": "Enum. Combines criteria within this group. WORKSPACE_MEMBER_FILTER_LOGIC_AND = every criterion must match. WORKSPACE_MEMBER_FILTER_LOGIC_OR = at least one criterion must match. Defaults to AND if omitted. Multiple filter_groups are always AND-combined.",
        -          "oneOf": [
        -            {
        -              "const": "WORKSPACE_MEMBER_FILTER_LOGIC_AND",
        -              "description": "Intersection — all criteria must match. Example: ROLE IN ['ADMIN'] AND NAME CONTAINS ['john'] in one group.",
        -              "title": "WORKSPACE_MEMBER_FILTER_LOGIC_AND"
        -            },
        -            {
        -              "const": "WORKSPACE_MEMBER_FILTER_LOGIC_OR",
        -              "description": "Union — any criterion may match. Example: NAME CONTAINS ['john'] OR EMAIL CONTAINS ['john'] in one group.",
        -              "title": "WORKSPACE_MEMBER_FILTER_LOGIC_OR"
        -            }
        -          ]
        -        }
        -      },
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "properties": {
        +        "criteria": {
        +          "description": "One or more filter conditions. Each entry is {field: <enum>, operator: <enum>, values: [<strings>]}. At least one criterion required per group. Example by role: [{field: 'WORKSPACE_MEMBER_FILTER_FIELD_ROLE', operator: 'WORKSPACE_MEMBER_FILTER_OPERATOR_IN', values: ['ADMIN']}].",
        +          "items": {
        +            "properties": {
        +              "field": {
        +                "description": "Enum. The member attribute to filter on. Must pair with a compatible operator. Primary filters: WORKSPACE_MEMBER_FILTER_FIELD_NAME→CONTAINS or EQUALS | WORKSPACE_MEMBER_FILTER_FIELD_ROLE→IN | WORKSPACE_MEMBER_FILTER_FIELD_EMAIL→CONTAINS or EQUALS. Also: USER_ID→EQUALS | LINKEDIN_ID→CONTAINS or EQUALS | CREATED_AT→GTE or LTE | consent fields→IN | TITLE→REGEX.",
        +                "oneOf": [
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_ROLE",
        +                    "description": "Workspace role assignment. Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_IN only. Values: 'OWNER', 'ADMIN', 'SUPER_CONNECTOR', 'SUPER_CONNECTOR_ADMIN', 'REQUESTER', 'TECHNICAL_ADMIN'. Example: IN ['SUPER_CONNECTOR']. Member matches if ANY of their roles is in the list.",
        +                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_ROLE"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_CREATED_AT",
        +                    "description": "When the member joined. Operators: WORKSPACE_MEMBER_FILTER_OPERATOR_GTE (on/after) or WORKSPACE_MEMBER_FILTER_OPERATOR_LTE (on/before). Value: ISO-8601 datetime e.g. ['2024-06-01T00:00:00Z'].",
        +                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_CREATED_AT"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_EMAIL",
        +                    "description": "Email address. Operators: WORKSPACE_MEMBER_FILTER_OPERATOR_CONTAINS (partial/domain, e.g. ['@acme.com']) WORKSPACE_MEMBER_FILTER_OPERATOR_EQUALS (exact, e.g. ['jane@acme.com']) or WORKSPACE_MEMBER_FILTER_OPERATOR_IN (exact, any of several, e.g. ['jane@acme.com', 'bob@acme.com']). Case-insensitive.",
        +                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_EMAIL"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_NAME",
        +                    "description": "Member first or last name. Operators: WORKSPACE_MEMBER_FILTER_OPERATOR_CONTAINS (partial, e.g. ['smith']) or WORKSPACE_MEMBER_FILTER_OPERATOR_EQUALS (exact full name, e.g. ['John Smith']). Case-insensitive.",
        +                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_NAME"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_USER_ID",
        +                    "description": "Platform user UUID. Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_EQUALS only — IN is NOT valid for this field. Example: EQUALS ['550e8400-e29b-41d4-a716-446655440000']. To match multiple user IDs, add one EQUALS criterion per ID inside a WORKSPACE_MEMBER_FILTER_LOGIC_OR filter group, not a single IN criterion.",
        +                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_USER_ID"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_LINKEDIN_ID",
        +                    "description": "LinkedIn profile ID or URL. Operators: WORKSPACE_MEMBER_FILTER_OPERATOR_CONTAINS or WORKSPACE_MEMBER_FILTER_OPERATOR_EQUALS. Example CONTAINS: ['linkedin.com/in/johndoe'].",
        +                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_LINKEDIN_ID"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_WHATSAPP_CONSENT",
        +                    "description": "WhatsApp consent. Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_IN only. Values: 'WHATSAPP_CONSENT_PENDING', 'WHATSAPP_CONSENT_GRANTED', 'WHATSAPP_CONSENT_DENIED'.",
        +                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_WHATSAPP_CONSENT"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_SUPER_CONNECTOR_OPT_IN",
        +                    "description": "Super Connector opt-in status. Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_IN only. Values: 'SUPER_CONNECTOR_OPT_IN_GRANTED', 'SUPER_CONNECTOR_OPT_IN_DENIED'.",
        +                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_SUPER_CONNECTOR_OPT_IN"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_CONNECTION_CONSENT",
        +                    "description": "LinkedIn connection-sharing consent. Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_IN only. Values: 'CONNECTION_CONSENT_PENDING', 'CONNECTION_CONSENT_GRANTED', 'CONNECTION_CONSENT_DENIED'.",
        +                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_CONNECTION_CONSENT"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_SC_ONBOARDING_STATUS",
        +                    "description": "Super Connector onboarding stage. Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_IN only. Values: 'SC_ONBOARDING_NOT_STARTED', 'SC_ONBOARDING_IN_PROGRESS', 'SC_ONBOARDING_COMPLETED'.",
        +                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_SC_ONBOARDING_STATUS"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_CATEGORY",
        +                    "description": "Category tag(s) assigned to the member. Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_IN only. Pass one or more WorkspaceMemberCategoryName display values — the complete set is 'Leadership', 'Board', 'Advisors', 'Customers', 'Employees', 'Alumni', 'Investors', 'Others', 'Power User', 'Partners'. Matched exactly and case-sensitively; anything else returns no rows. Member matches if ANY of their categories is in the list. No UUID lookup needed.",
        +                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_CATEGORY"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_LOCATION",
        +                    "description": "Location of the workspace member. Matched case-insensitively against city, country, or ISO country code (e.g. 'US', 'San Francisco', 'United States'). Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_IN. Multiple values are OR-combined.",
        +                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_LOCATION"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_TAG",
        +                    "description": "Workspace-defined tags assigned to the member. Values are tag UUIDs from Tagging.ListTags, not names. Operators: WORKSPACE_MEMBER_FILTER_OPERATOR_IN (member carries ANY of the given tags) or WORKSPACE_MEMBER_FILTER_OPERATOR_NOT_IN (member carries NONE of the given tags). Example: IN ['dd491a85-3563-408d-bb2e-d9a4ee7ddda9'].",
        +                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_TAG"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_TITLE",
        +                    "description": "Member's current job title(s), enriched from profile_data. Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_REGEX only. Pass exactly one Postgres regex pattern, e.g. ['(?i)^VP.*Sales'] for a case-insensitive prefix match. Only current employment is searched — a member whose title changed and is no longer current will not match on the old title.",
        +                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_TITLE"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_SC_STATE",
        +                    "description": "Super Connector state. Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_IN only. Values: 'ACTIVE', 'DORMANT'. Only Super Connectors match. Example: IN ['DORMANT'] lists the parked Super Connectors, which add_role with super_connector_state ACTIVE can activate.",
        +                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_SC_STATE"
        +                  }
        +                ]
        +              },
        +              "operator": {
        +                "description": "Enum. Comparison operator — must be valid for the chosen field. IN→ROLE, CATEGORY, TAG, consent fields. NOT_IN→TAG only. CONTAINS→NAME, EMAIL, LINKEDIN_ID. EQUALS→NAME, EMAIL, USER_ID, LINKEDIN_ID. GTE/LTE→CREATED_AT only. REGEX→TITLE only. IN→SC_STATE. Wrong pair returns no results or an error.",
        +                "oneOf": [
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_OPERATOR_IN",
        +                    "description": "Value is in the provided list (any match). Valid fields: WORKSPACE_MEMBER_FILTER_FIELD_ROLE ('OWNER', 'ADMIN', 'SUPER_CONNECTOR', etc.), WORKSPACE_MEMBER_FILTER_FIELD_CATEGORY (display names e.g. 'Investors', 'Board'), WORKSPACE_MEMBER_FILTER_FIELD_TAG (tag UUIDs), WORKSPACE_MEMBER_FILTER_FIELD_EMAIL (exact addresses, case-insensitive), and consent fields. Pass one or more exact strings in values.",
        +                    "title": "WORKSPACE_MEMBER_FILTER_OPERATOR_IN"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_OPERATOR_CONTAINS",
        +                    "description": "Case-insensitive substring match. Valid fields: WORKSPACE_MEMBER_FILTER_FIELD_NAME, WORKSPACE_MEMBER_FILTER_FIELD_EMAIL, WORKSPACE_MEMBER_FILTER_FIELD_LINKEDIN_ID. Pass exactly one string e.g. ['smith'] or ['@acme.com'].",
        +                    "title": "WORKSPACE_MEMBER_FILTER_OPERATOR_CONTAINS"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_OPERATOR_GTE",
        +                    "description": "Greater than or equal (date). Valid field: WORKSPACE_MEMBER_FILTER_FIELD_CREATED_AT only. Pass one ISO-8601 datetime e.g. ['2024-01-01T00:00:00Z'].",
        +                    "title": "WORKSPACE_MEMBER_FILTER_OPERATOR_GTE"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_OPERATOR_LTE",
        +                    "description": "Less than or equal (date). Valid field: WORKSPACE_MEMBER_FILTER_FIELD_CREATED_AT only. Pass one ISO-8601 datetime.",
        +                    "title": "WORKSPACE_MEMBER_FILTER_OPERATOR_LTE"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_OPERATOR_EQUALS",
        +                    "description": "Exact match (case-insensitive for text). Valid fields: WORKSPACE_MEMBER_FILTER_FIELD_NAME, WORKSPACE_MEMBER_FILTER_FIELD_EMAIL, WORKSPACE_MEMBER_FILTER_FIELD_USER_ID, WORKSPACE_MEMBER_FILTER_FIELD_LINKEDIN_ID. Pass exactly one value.",
        +                    "title": "WORKSPACE_MEMBER_FILTER_OPERATOR_EQUALS"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_OPERATOR_NOT_IN",
        +                    "description": "Value is NOT in the provided list (exclusion). Valid field: WORKSPACE_MEMBER_FILTER_FIELD_TAG only. Member matches if none of their tags are in the list. Pass one or more tag UUIDs.",
        +                    "title": "WORKSPACE_MEMBER_FILTER_OPERATOR_NOT_IN"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_OPERATOR_REGEX",
        +                    "description": "Case-insensitive-capable Postgres regular expression match (use an inline '(?i)' flag for case-insensitivity). Valid field: WORKSPACE_MEMBER_FILTER_FIELD_TITLE only. Pass exactly one pattern, e.g. ['(?i)^VP.*Sales'] or ['(?i)(chief|head).*(sales|revenue)'].",
        +                    "title": "WORKSPACE_MEMBER_FILTER_OPERATOR_REGEX"
        +                  }
        +                ]
        +              },
        +              "values": {
        +                "description": "Filter value(s) as a JSON array of strings — NEVER a bare string. NAME CONTAINS→['partial']; NAME EQUALS→['John Smith']; ROLE IN→['ADMIN'] or ['SUPER_CONNECTOR','SUPER_CONNECTOR_ADMIN']; EMAIL CONTAINS→['@domain.com']; EMAIL EQUALS→['user@company.com']; USER_ID EQUALS→['<uuid>']; LINKEDIN_ID CONTAINS→['linkedin.com/in/handle']; CREATED_AT GTE/LTE→['2024-01-01T00:00:00Z']; TITLE REGEX→['(?i)^VP.*Sales']. Role and consent enum strings are case-sensitive.",
        +                "items": {
        +                  "type": "string"
        +                },
        +                "type": "array"
        +              }
        +            },
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "logic": {
        +          "description": "Enum. Combines criteria within this group. WORKSPACE_MEMBER_FILTER_LOGIC_AND = every criterion must match. WORKSPACE_MEMBER_FILTER_LOGIC_OR = at least one criterion must match. Defaults to AND if omitted. Multiple filter_groups are always AND-combined.",
        +          "oneOf": [
        +            {
        +              "const": "WORKSPACE_MEMBER_FILTER_LOGIC_AND",
        +              "description": "Intersection — all criteria must match. Example: ROLE IN ['ADMIN'] AND NAME CONTAINS ['john'] in one group.",
        +              "title": "WORKSPACE_MEMBER_FILTER_LOGIC_AND"
        +            },
        +            {
        +              "const": "WORKSPACE_MEMBER_FILTER_LOGIC_OR",
        +              "description": "Union — any criterion may match. Example: NAME CONTAINS ['john'] OR EMAIL CONTAINS ['john'] in one group.",
        +              "title": "WORKSPACE_MEMBER_FILTER_LOGIC_OR"
        +            }
        +          ]
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
  4. 5 tool updates
    • Addedbulk_add_account_categories
    • Addedbulk_remove_account_categories
    • Changedbulk_set_account_category1 field changed
      • addedInput schema / properties / categories
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {},
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
    • Changedget_unique_filter_options1 field changed
      • changedInput schema / properties / filters / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "properties": {
        -        "fallback_fields": {
        -          "items": {
        -            "oneOf": [
        -              {
        -                "const": "FILTER_FIELD_SENIORITY",
        -                "title": "FILTER_FIELD_SENIORITY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_LOCATION",
        -                "title": "FILTER_FIELD_LOCATION"
        -              },
        -              {
        -                "const": "FILTER_FIELD_STRENGTH",
        -                "title": "FILTER_FIELD_STRENGTH"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CATEGORY",
        -                "title": "FILTER_FIELD_CATEGORY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONNECTOR_ID",
        -                "title": "FILTER_FIELD_CONNECTOR_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY",
        -                "title": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE",
        -                "title": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_DEPARTMENT",
        -                "title": "FILTER_FIELD_DEPARTMENT"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OWNER_ID",
        -                "title": "FILTER_FIELD_ACCOUNT_OWNER_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_INDUSTRY",
        -                "title": "FILTER_FIELD_ACCOUNT_INDUSTRY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_COUNTRY",
        -                "title": "FILTER_FIELD_ACCOUNT_COUNTRY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE",
        -                "title": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONFIDENCE",
        -                "title": "FILTER_FIELD_CONFIDENCE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_INTRO_VALUE",
        -                "title": "FILTER_FIELD_INTRO_VALUE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_ID",
        -                "title": "FILTER_FIELD_ACCOUNT_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_NAME",
        -                "title": "FILTER_FIELD_ACCOUNT_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_DOMAIN",
        -                "title": "FILTER_FIELD_ACCOUNT_DOMAIN"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OWNER_NAME",
        -                "title": "FILTER_FIELD_ACCOUNT_OWNER_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_ID",
        -                "title": "FILTER_FIELD_CONTACT_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_NAME",
        -                "title": "FILTER_FIELD_CONTACT_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_EMAIL",
        -                "title": "FILTER_FIELD_CONTACT_EMAIL"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_TITLE",
        -                "title": "FILTER_FIELD_CONTACT_TITLE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_COMPANY_NAME",
        -                "title": "FILTER_FIELD_CONTACT_COMPANY_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SUPER_CONNECTOR_NAME",
        -                "title": "FILTER_FIELD_SUPER_CONNECTOR_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL",
        -                "title": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_ACCOUNT_ID",
        -                "title": "FILTER_FIELD_SOURCE_ACCOUNT_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_ACCOUNT_NAME",
        -                "title": "FILTER_FIELD_SOURCE_ACCOUNT_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN",
        -                "title": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_CONTACT_ID",
        -                "title": "FILTER_FIELD_SOURCE_CONTACT_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_CONTACT_NAME",
        -                "title": "FILTER_FIELD_SOURCE_CONTACT_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_ICP",
        -                "title": "FILTER_FIELD_ACCOUNT_ICP"
        -              },
        -              {
        -                "const": "FILTER_FIELD_TITLE_PERSONA",
        -                "title": "FILTER_FIELD_TITLE_PERSONA"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_CATEGORY",
        -                "title": "FILTER_FIELD_ACCOUNT_CATEGORY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONNECTOR_LOCATION",
        -                "title": "FILTER_FIELD_CONNECTOR_LOCATION"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY",
        -                "title": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OFFICE_STATE",
        -                "title": "FILTER_FIELD_ACCOUNT_OFFICE_STATE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OFFICE_CITY",
        -                "title": "FILTER_FIELD_ACCOUNT_OFFICE_CITY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_REFERENCE_ID",
        -                "title": "FILTER_FIELD_ACCOUNT_REFERENCE_ID"
        -              }
        -            ]
        -          },
        -          "type": "array"
        -        },
        -        "field": {
        -          "description": "Which attribute to filter on.",
        -          "oneOf": [
        -            {
        -              "const": "FILTER_FIELD_SENIORITY",
        -              "description": "Target contact seniority level. Use IN operator. Stored values: 'Owner/CXO', 'VP', 'DIRECTOR', 'MANAGER', 'IC'. Documented alias OWNER_CXO is also accepted. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_SENIORITY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_LOCATION",
        -              "description": "Target contact's location (country code or location name string). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_LOCATION"
        -            },
        -            {
        -              "const": "FILTER_FIELD_STRENGTH",
        -              "description": "Relationship strength between the connector and target contact. Valid values: 'CONFIRMED', 'STRONG', 'LESS_LIKELY', 'UNLIKELY'. Prefer CONFIRMED and STRONG when looking for high-quality intro paths.",
        -              "title": "FILTER_FIELD_STRENGTH"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CATEGORY",
        -              "description": "Relationship category describing who the super connector is in relation to the company (e.g. Investor, Advisor, Board Member, Customer, Champion, Alumni, Leadership). IMPORTANT: this is NOT the same as seniority (how senior the contact is) or strength (how strong the tie is). Trigger words: investor(s), customer(s), board member(s), advisor(s), champion(s), alumni, leadership, partner(s). Values must be category UUIDs — NOT label strings. Resolution flow: (1) call get_workspace_categories, (2) filter to relationship_type SUPER_CONNECTORS and is_deleted false, (3) match user intent to closest label(s) — OR all plausible matches, (4) use those id UUIDs as filter values.",
        -              "title": "FILTER_FIELD_CATEGORY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONNECTOR_ID",
        -              "description": "RECOMMENDED over FILTER_FIELD_SUPER_CONNECTOR_NAME when the connector user_id is known. Exact match on one or more connector user UUIDs (Keycloak user IDs). Resolve connector names via search_workspace_members first to avoid silent zero-result failures from name prefix matching.",
        -              "title": "FILTER_FIELD_CONNECTOR_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY",
        -              "description": "Include or exclude contacts who have left the tracked company. Values: 'true' or 'false'.",
        -              "title": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE",
        -              "description": "One or more path type evidence signals used to establish the relationship. Use string names from the RelationshipPathType enum. User–Contact: 'LINKEDIN_CONNECTION' (direct LinkedIn connection), 'WORK_OVERLAP' (same company same time), 'EDUCATION_OVERLAP' (same school), 'CALENDAR_EVENT' (meetings on record), 'SELF_DECLARED_CONTACT' (connector declared they know the contact), 'SELF_DECLARED_CONTACT_DONT_KNOW' (connector declared they do not know the contact), 'SUPER_CONNECTOR_APPROVED' (super connector approved the path), 'SUPER_CONNECTOR_DECLINED' (super connector declined), 'TESTIMONIAL' (LinkedIn recommendation one wrote for the other), 'LINKEDIN_ENGAGEMENT' (connector comments on the contact's LinkedIn posts), 'LINKEDIN_POST_MENTION' (connector tagged the contact in one of the connector's own LinkedIn posts). User–Account: 'BOARD_MEMBER', 'COMMON_BOARD_HOP' (P1 → P2 via shared board seat), 'ADVISOR', 'LEADERSHIP', 'EMPLOYEE', 'INVESTOR', 'ACCOUNT_ALUMNI' (connector previously worked at target account), 'SELF_DECLARED_ACCOUNT' (connector declared a relationship to the account), 'SELF_DECLARED_ACCOUNT_DONT_KNOW'. Company–Account: 'COMMON_INVESTOR', 'COMMON_INVESTOR_HOP', 'PORTFOLIO' (a portfolio company of this workspace's investor firm). Contact–Account: 'COMPANY_ALUMNI' (worked at same company at different times). Account insight: 'ACCOUNT_INSIGHT_BOARD_ADVISOR', 'ACCOUNT_INSIGHT_BOARD_ADVISOR_VIA_CONTACT'. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_DEPARTMENT",
        -              "description": "Target contact's department (free-text match). Values are department name strings (e.g. 'Engineering', 'Sales', 'Marketing'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_DEPARTMENT"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OWNER_ID",
        -              "description": "RECOMMENDED over FILTER_FIELD_ACCOUNT_OWNER_NAME when the owner user_id is known. Exact match on CRM account owner user UUID (Keycloak user ID). Resolve owner names via search_workspace_members first.",
        -              "title": "FILTER_FIELD_ACCOUNT_OWNER_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_INDUSTRY",
        -              "description": "Filter by target account industry. Values are industry name strings (e.g. 'Software', 'Financial Services'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_INDUSTRY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_COUNTRY",
        -              "description": "Filter by target account's country. Values are country name strings (e.g. 'United States', 'Germany'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_COUNTRY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE",
        -              "description": "Filter by target account employee headcount range. Valid values: '1', '2-10', '11-50', '51-200', '201-500', '501-1000', '1001-5000', '5001-10000', '10001+'. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONFIDENCE",
        -              "description": "GPT scoring confidence level for the relationship assessment. Valid values: 'High', 'Medium', 'Low'. Use 'High' to restrict results to relationships the scoring model is most certain about. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONFIDENCE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_INTRO_VALUE",
        -              "description": "Assessed value of requesting an introduction through this relationship path. Valid values: 'High', 'Medium', 'Low'. Determined by the Boomerang scoring engine based on strength, seniority, and recency signals. Use 'High' to prioritize the best intro opportunities. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_INTRO_VALUE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_ID",
        -              "description": "Filter by CRM account UUID. Values are account ID strings. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_NAME",
        -              "description": "Filter by target account name (prefix match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_DOMAIN",
        -              "description": "Filter by target account website domain (e.g. 'acme.com'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_DOMAIN"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OWNER_NAME",
        -              "description": "Filter by CRM account owner first OR last name, prefix match on ONE name part only (e.g. [\"John\"] or [\"Smith\"] — NOT \"John Smith\" as one string, which silently returns zero results). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_ACCOUNT_OWNER_ID when user_id is known (resolve via search_workspace_members).",
        -              "title": "FILTER_FIELD_ACCOUNT_OWNER_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_ID",
        -              "description": "RECOMMENDED over FILTER_FIELD_CONTACT_NAME when the contact UUID is known. Exact match on target contact UUID. Resolve contact names via search_contacts first.",
        -              "title": "FILTER_FIELD_CONTACT_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_NAME",
        -              "description": "Filter by target contact first OR last name, prefix match on ONE name part only (e.g. [\"Jane\"] or [\"Doe\"] — NOT \"Jane Doe\" as one string, which silently returns zero results). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_CONTACT_ID when contact UUID is known (resolve via search_contacts).",
        -              "title": "FILTER_FIELD_CONTACT_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_EMAIL",
        -              "description": "Filter by target contact email address (prefix or exact match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONTACT_EMAIL"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_TITLE",
        -              "description": "Filter by target contact job title (prefix match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONTACT_TITLE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_COMPANY_NAME",
        -              "description": "Filter by the company name associated with the target contact — typically the target account name (prefix match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONTACT_COMPANY_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SUPER_CONNECTOR_NAME",
        -              "description": "Filter by super connector's first OR last name, prefix match on ONE name part only (e.g. [\"Steven\"] or [\"Hagler\"] — NOT \"Steven Hagler\" as a single combined string, which will silently return zero results rather than an error). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_CONNECTOR_ID instead whenever the connector's user_id is already known (e.g. from search_workspace_members) — it does an exact match and avoids the silent zero-result failure mode of name-based prefix matching, especially for people with common or multi-word names.",
        -              "title": "FILTER_FIELD_SUPER_CONNECTOR_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL",
        -              "description": "Filter by super connector email address (prefix or exact match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_ACCOUNT_ID",
        -              "description": "Filter by source company UUID — for Account→Account path types (COMMON_INVESTOR, COMMON_BOARD_HOP, ACCOUNT_ALUMNI, SELF_DECLARED_ACCOUNT, COMMON_INVESTOR_HOP, ACCOUNT_INSIGHT_BOARD_ADVISOR, etc.) where the source node is a company, not a user. Exact match. RECOMMENDED over FILTER_FIELD_SOURCE_ACCOUNT_NAME when the account UUID is known (resolve via search_accounts_with_filters first).",
        -              "title": "FILTER_FIELD_SOURCE_ACCOUNT_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_ACCOUNT_NAME",
        -              "description": "Filter by source company name (prefix/substring match) — for Account→Account path types. Use to answer questions like 'which accounts can Garuda Ventures help reach?'. ONE name token per value recommended for broad matching. Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_SOURCE_ACCOUNT_ID when the UUID is known.",
        -              "title": "FILTER_FIELD_SOURCE_ACCOUNT_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN",
        -              "description": "Filter by source company domain (exact or prefix match) — for Account→Account path types. E.g. 'garudaventures.com'. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_CONTACT_ID",
        -              "description": "Filter by source contact UUID — for Contact→Account path types (COMPANY_ALUMNI) where the source node is a contact. Exact match. RECOMMENDED over FILTER_FIELD_SOURCE_CONTACT_NAME when the UUID is known.",
        -              "title": "FILTER_FIELD_SOURCE_CONTACT_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_CONTACT_NAME",
        -              "description": "Filter by source contact first OR last name (prefix match) — for Contact→Account path types. ONE name token per value. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_SOURCE_CONTACT_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_ICP",
        -              "description": "Filter by target account ICP (Ideal Customer Profile) match status. Valid values: 'MATCH' (account matches ICP criteria), 'NO_MATCH' (account evaluated and does not match), 'NO_DATA' (insufficient data to evaluate), 'NO_ICP_DEFINED' (workspace has no ICP configured), 'PRE_MATCH' (pending evaluation). Use the special sentinel value 'null' to match accounts where the ICP field has not been set. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_ICP"
        -            },
        -            {
        -              "const": "FILTER_FIELD_TITLE_PERSONA",
        -              "description": "Buyer persona of the target contact, matched against the contact's title. Values are persona names, NOT job titles: 'BUYING_COMMITTEE' (functional buyers and users — the workspace's buying_committee_regex), 'EXTENDED_BUYING_COMMITTEE' (procurement / finance / IT / legal approval seats — extended_buying_committee_regex), 'LEADERSHIP' (C-suite and VP-level titles from the shared taxonomy, not board members, founders or partner/principal). Multiple values are OR-combined. A persona whose regex is not configured for the workspace is ignored.",
        -              "title": "FILTER_FIELD_TITLE_PERSONA"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_CATEGORY",
        -              "description": "Filter by the target account's category — the workspace's own classification of the account, distinct from ICP. Valid values: 'CUSTOMER', 'PROSPECT', 'OPEN_OPPORTUNITY', 'CLOSED_LOST', 'CHURNED', 'PARTNER', 'INVESTOR_PORTFOLIO', 'COMPETITOR', 'OTHER'. Use the special sentinel value 'null' to match accounts that have not been categorised. Multiple values are OR-combined. Do not confuse with FILTER_FIELD_CATEGORY, which filters on the super connector's category.",
        -              "title": "FILTER_FIELD_ACCOUNT_CATEGORY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONNECTOR_LOCATION",
        -              "description": "Location of the connector (super connector), matched case-insensitively against city, country, or ISO country code (e.g. 'US', 'San Francisco', 'United States'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONNECTOR_LOCATION"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY",
        -              "title": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OFFICE_STATE",
        -              "title": "FILTER_FIELD_ACCOUNT_OFFICE_STATE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OFFICE_CITY",
        -              "title": "FILTER_FIELD_ACCOUNT_OFFICE_CITY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_REFERENCE_ID",
        -              "description": "Filter by the target account's CRM record ID — exact match on reference_id (e.g. Salesforce 18-character Account ID '001xx000003DGbQAAW', HubSpot company ID). Values are CRM IDs, NOT internal UUIDs. Use directly when the user supplies Salesforce/HubSpot IDs — do NOT call search_accounts_with_filters first to resolve them to UUIDs. Pass the id exactly as the CRM stores it: a 15-character Salesforce short id does not match the stored 18-character form, and the match is silent — wrong form returns zero rows, not an error. Only CRM-sourced accounts have a CRM id; accounts created inside Boomerang carry an internal 'BOOM-…' reference_id and never match here. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_REFERENCE_ID"
        -            }
        -          ]
        -        },
        -        "operator": {
        -          "description": "How values are matched. Omit (or 'IN') to keep only rows matching any of the values — the default. Use 'NOT_IN' (aliases: 'NOT_EQUAL_TO', 'NE') to EXCLUDE rows matching any of the values, e.g. field=FILTER_FIELD_ACCOUNT_CATEGORY, operator='NOT_IN', values=['CUSTOMER'] returns paths to accounts that are not customers. A NOT_IN filter keeps rows where the entity exists but the field has no value on record, and excludes paths that have no such entity at all — 'account category not CUSTOMER' returns only paths that target an account, never User→Contact paths. Text filters (names, titles, domains, emails) match by substring, so NOT_IN on them excludes every row CONTAINING a value, not only exact matches — 'account name not [Acme]' also drops 'Acme Holdings'. Not supported on FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY — pass 'true'/'false' with IN instead.",
        -          "type": "string"
        -        },
        -        "values": {
        -          "description": "One or more filter values. Multiple values are OR-combined within the same field, AND across different fields. For FILTER_FIELD_SENIORITY use stored values 'Owner/CXO', 'VP', 'DIRECTOR', 'MANAGER', 'IC' (OWNER_CXO alias accepted). For FILTER_FIELD_STRENGTH use: 'CONFIRMED', 'STRONG', 'LESS_LIKELY', 'UNLIKELY'. For FILTER_FIELD_CATEGORY use category UUIDs resolved from get_workspace_categories (filter to SUPER_CONNECTORS, match by label, use id). For FILTER_FIELD_RELATIONSHIP_PATH_TYPE use RelationshipPathType enum names as strings — User–Contact: 'LINKEDIN_CONNECTION', 'WORK_OVERLAP', 'EDUCATION_OVERLAP', 'CALENDAR_EVENT', 'SELF_DECLARED_CONTACT', 'SELF_DECLARED_CONTACT_DONT_KNOW', 'SUPER_CONNECTOR_APPROVED', 'SUPER_CONNECTOR_DECLINED'; User–Account: 'BOARD_MEMBER', 'COMMON_BOARD_HOP', 'ADVISOR', 'LEADERSHIP', 'EMPLOYEE', 'INVESTOR', 'ACCOUNT_ALUMNI', 'SELF_DECLARED_ACCOUNT', 'SELF_DECLARED_ACCOUNT_DONT_KNOW'; Company–Account: 'COMMON_INVESTOR', 'COMMON_INVESTOR_HOP', 'PORTFOLIO'; Contact–Account: 'COMPANY_ALUMNI'; Account insight: 'ACCOUNT_INSIGHT_BOARD_ADVISOR', 'ACCOUNT_INSIGHT_BOARD_ADVISOR_VIA_CONTACT'. For FILTER_FIELD_CONFIDENCE use: 'High', 'Medium', 'Low'. For FILTER_FIELD_INTRO_VALUE use: 'High', 'Medium', 'Low'. For FILTER_FIELD_SOURCE_ACCOUNT_ID/FILTER_FIELD_SOURCE_CONTACT_ID use UUIDs (resolve via search_accounts_with_filters or search_contacts first). For FILTER_FIELD_ACCOUNT_REFERENCE_ID pass CRM record IDs as-is (e.g. Salesforce '001xx000003DGbQAAW') — exact match, no UUID resolution needed. For FILTER_FIELD_ACCOUNT_ICP use: 'MATCH', 'NO_MATCH', 'NO_DATA', 'NO_ICP_DEFINED', 'PRE_MATCH', or the sentinel 'null' to match accounts with no ICP value set. Person-name filters (FILTER_FIELD_SUPER_CONNECTOR_NAME, FILTER_FIELD_CONTACT_NAME, FILTER_FIELD_ACCOUNT_OWNER_NAME, FILTER_FIELD_SOURCE_ACCOUNT_NAME, FILTER_FIELD_SOURCE_CONTACT_NAME): pass ONE first or last name token per value — never a full name like 'Jane Doe' or 'Garuda Ventures' as a single string, which silently returns zero results. Prefer ID-based filters when UUIDs are known.",
        -          "items": {
        -            "type": "string"
        -          },
        -          "type": "array"
        -        }
        -      },
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "properties": {
        +        "fallback_fields": {
        +          "items": {
        +            "oneOf": [
        +              {
        +                "const": "FILTER_FIELD_SENIORITY",
        +                "title": "FILTER_FIELD_SENIORITY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_LOCATION",
        +                "title": "FILTER_FIELD_LOCATION"
        +              },
        +              {
        +                "const": "FILTER_FIELD_STRENGTH",
        +                "title": "FILTER_FIELD_STRENGTH"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CATEGORY",
        +                "title": "FILTER_FIELD_CATEGORY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONNECTOR_ID",
        +                "title": "FILTER_FIELD_CONNECTOR_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY",
        +                "title": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE",
        +                "title": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_DEPARTMENT",
        +                "title": "FILTER_FIELD_DEPARTMENT"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OWNER_ID",
        +                "title": "FILTER_FIELD_ACCOUNT_OWNER_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_INDUSTRY",
        +                "title": "FILTER_FIELD_ACCOUNT_INDUSTRY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_COUNTRY",
        +                "title": "FILTER_FIELD_ACCOUNT_COUNTRY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE",
        +                "title": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONFIDENCE",
        +                "title": "FILTER_FIELD_CONFIDENCE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_INTRO_VALUE",
        +                "title": "FILTER_FIELD_INTRO_VALUE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_ID",
        +                "title": "FILTER_FIELD_ACCOUNT_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_NAME",
        +                "title": "FILTER_FIELD_ACCOUNT_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_DOMAIN",
        +                "title": "FILTER_FIELD_ACCOUNT_DOMAIN"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OWNER_NAME",
        +                "title": "FILTER_FIELD_ACCOUNT_OWNER_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_ID",
        +                "title": "FILTER_FIELD_CONTACT_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_NAME",
        +                "title": "FILTER_FIELD_CONTACT_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_EMAIL",
        +                "title": "FILTER_FIELD_CONTACT_EMAIL"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_TITLE",
        +                "title": "FILTER_FIELD_CONTACT_TITLE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_COMPANY_NAME",
        +                "title": "FILTER_FIELD_CONTACT_COMPANY_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SUPER_CONNECTOR_NAME",
        +                "title": "FILTER_FIELD_SUPER_CONNECTOR_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL",
        +                "title": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_ACCOUNT_ID",
        +                "title": "FILTER_FIELD_SOURCE_ACCOUNT_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_ACCOUNT_NAME",
        +                "title": "FILTER_FIELD_SOURCE_ACCOUNT_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN",
        +                "title": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_CONTACT_ID",
        +                "title": "FILTER_FIELD_SOURCE_CONTACT_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_CONTACT_NAME",
        +                "title": "FILTER_FIELD_SOURCE_CONTACT_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_ICP",
        +                "title": "FILTER_FIELD_ACCOUNT_ICP"
        +              },
        +              {
        +                "const": "FILTER_FIELD_TITLE_PERSONA",
        +                "title": "FILTER_FIELD_TITLE_PERSONA"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_CATEGORY",
        +                "title": "FILTER_FIELD_ACCOUNT_CATEGORY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONNECTOR_LOCATION",
        +                "title": "FILTER_FIELD_CONNECTOR_LOCATION"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY",
        +                "title": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OFFICE_STATE",
        +                "title": "FILTER_FIELD_ACCOUNT_OFFICE_STATE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OFFICE_CITY",
        +                "title": "FILTER_FIELD_ACCOUNT_OFFICE_CITY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_REFERENCE_ID",
        +                "title": "FILTER_FIELD_ACCOUNT_REFERENCE_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_STARRED",
        +                "title": "FILTER_FIELD_STARRED"
        +              }
        +            ]
        +          },
        +          "type": "array"
        +        },
        +        "field": {
        +          "description": "Which attribute to filter on.",
        +          "oneOf": [
        +            {
        +              "const": "FILTER_FIELD_SENIORITY",
        +              "description": "Target contact seniority level. Use IN operator. Stored values: 'Owner/CXO', 'VP', 'DIRECTOR', 'MANAGER', 'IC'. Documented alias OWNER_CXO is also accepted. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_SENIORITY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_LOCATION",
        +              "description": "Target contact's location (country code or location name string). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_LOCATION"
        +            },
        +            {
        +              "const": "FILTER_FIELD_STRENGTH",
        +              "description": "Relationship strength between the connector and target contact. Valid values: 'CONFIRMED', 'STRONG', 'LESS_LIKELY', 'UNLIKELY'. Prefer CONFIRMED and STRONG when looking for high-quality intro paths.",
        +              "title": "FILTER_FIELD_STRENGTH"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CATEGORY",
        +              "description": "Relationship category describing who the super connector is in relation to the company (e.g. Investor, Advisor, Board Member, Customer, Champion, Alumni, Leadership). IMPORTANT: this is NOT the same as seniority (how senior the contact is) or strength (how strong the tie is). Trigger words: investor(s), customer(s), board member(s), advisor(s), champion(s), alumni, leadership, partner(s). Values must be category UUIDs — NOT label strings. Resolution flow: (1) call get_workspace_categories, (2) filter to relationship_type SUPER_CONNECTORS and is_deleted false, (3) match user intent to closest label(s) — OR all plausible matches, (4) use those id UUIDs as filter values.",
        +              "title": "FILTER_FIELD_CATEGORY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONNECTOR_ID",
        +              "description": "RECOMMENDED over FILTER_FIELD_SUPER_CONNECTOR_NAME when the connector user_id is known. Exact match on one or more connector user UUIDs (Keycloak user IDs). Resolve connector names via search_workspace_members first to avoid silent zero-result failures from name prefix matching.",
        +              "title": "FILTER_FIELD_CONNECTOR_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY",
        +              "description": "Include or exclude contacts who have left the tracked company. Values: 'true' or 'false'.",
        +              "title": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE",
        +              "description": "One or more path type evidence signals used to establish the relationship. Use string names from the RelationshipPathType enum. User–Contact: 'LINKEDIN_CONNECTION' (direct LinkedIn connection), 'WORK_OVERLAP' (same company same time), 'EDUCATION_OVERLAP' (same school), 'CALENDAR_EVENT' (meetings on record), 'SELF_DECLARED_CONTACT' (connector declared they know the contact), 'SELF_DECLARED_CONTACT_DONT_KNOW' (connector declared they do not know the contact), 'SUPER_CONNECTOR_APPROVED' (super connector approved the path), 'SUPER_CONNECTOR_DECLINED' (super connector declined), 'TESTIMONIAL' (LinkedIn recommendation one wrote for the other), 'LINKEDIN_ENGAGEMENT' (connector comments on the contact's LinkedIn posts), 'LINKEDIN_POST_MENTION' (connector tagged the contact in one of the connector's own LinkedIn posts). User–Account: 'BOARD_MEMBER', 'COMMON_BOARD_HOP' (P1 → P2 via shared board seat), 'ADVISOR', 'LEADERSHIP', 'EMPLOYEE', 'INVESTOR', 'ACCOUNT_ALUMNI' (connector previously worked at target account), 'SELF_DECLARED_ACCOUNT' (connector declared a relationship to the account), 'SELF_DECLARED_ACCOUNT_DONT_KNOW'. Company–Account: 'COMMON_INVESTOR', 'COMMON_INVESTOR_HOP', 'PORTFOLIO' (a portfolio company of this workspace's investor firm). Contact–Account: 'COMPANY_ALUMNI' (worked at same company at different times). Account insight: 'ACCOUNT_INSIGHT_BOARD_ADVISOR', 'ACCOUNT_INSIGHT_BOARD_ADVISOR_VIA_CONTACT'. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_DEPARTMENT",
        +              "description": "Target contact's department (free-text match). Values are department name strings (e.g. 'Engineering', 'Sales', 'Marketing'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_DEPARTMENT"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OWNER_ID",
        +              "description": "RECOMMENDED over FILTER_FIELD_ACCOUNT_OWNER_NAME when the owner user_id is known. Exact match on CRM account owner user UUID (Keycloak user ID). Resolve owner names via search_workspace_members first.",
        +              "title": "FILTER_FIELD_ACCOUNT_OWNER_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_INDUSTRY",
        +              "description": "Filter by target account industry. Values are industry name strings (e.g. 'Software', 'Financial Services'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_INDUSTRY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_COUNTRY",
        +              "description": "Filter by target account's country. Values are country name strings (e.g. 'United States', 'Germany'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_COUNTRY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE",
        +              "description": "Filter by target account employee headcount range. Valid values: '1', '2-10', '11-50', '51-200', '201-500', '501-1000', '1001-5000', '5001-10000', '10001+'. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONFIDENCE",
        +              "description": "GPT scoring confidence level for the relationship assessment. Valid values: 'High', 'Medium', 'Low'. Use 'High' to restrict results to relationships the scoring model is most certain about. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONFIDENCE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_INTRO_VALUE",
        +              "description": "Assessed value of requesting an introduction through this relationship path. Valid values: 'High', 'Medium', 'Low'. Determined by the Boomerang scoring engine based on strength, seniority, and recency signals. Use 'High' to prioritize the best intro opportunities. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_INTRO_VALUE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_ID",
        +              "description": "Filter by CRM account UUID. Values are account ID strings. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_NAME",
        +              "description": "Filter by target account name (prefix match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_DOMAIN",
        +              "description": "Filter by target account website domain (e.g. 'acme.com'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_DOMAIN"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OWNER_NAME",
        +              "description": "Filter by CRM account owner first OR last name, prefix match on ONE name part only (e.g. [\"John\"] or [\"Smith\"] — NOT \"John Smith\" as one string, which silently returns zero results). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_ACCOUNT_OWNER_ID when user_id is known (resolve via search_workspace_members).",
        +              "title": "FILTER_FIELD_ACCOUNT_OWNER_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_ID",
        +              "description": "RECOMMENDED over FILTER_FIELD_CONTACT_NAME when the contact UUID is known. Exact match on target contact UUID. Resolve contact names via search_contacts first.",
        +              "title": "FILTER_FIELD_CONTACT_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_NAME",
        +              "description": "Filter by target contact first OR last name, prefix match on ONE name part only (e.g. [\"Jane\"] or [\"Doe\"] — NOT \"Jane Doe\" as one string, which silently returns zero results). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_CONTACT_ID when contact UUID is known (resolve via search_contacts).",
        +              "title": "FILTER_FIELD_CONTACT_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_EMAIL",
        +              "description": "Filter by target contact email address (prefix or exact match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONTACT_EMAIL"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_TITLE",
        +              "description": "Filter by target contact job title (prefix match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONTACT_TITLE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_COMPANY_NAME",
        +              "description": "Filter by the company name associated with the target contact — typically the target account name (prefix match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONTACT_COMPANY_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SUPER_CONNECTOR_NAME",
        +              "description": "Filter by super connector's first OR last name, prefix match on ONE name part only (e.g. [\"Steven\"] or [\"Hagler\"] — NOT \"Steven Hagler\" as a single combined string, which will silently return zero results rather than an error). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_CONNECTOR_ID instead whenever the connector's user_id is already known (e.g. from search_workspace_members) — it does an exact match and avoids the silent zero-result failure mode of name-based prefix matching, especially for people with common or multi-word names.",
        +              "title": "FILTER_FIELD_SUPER_CONNECTOR_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL",
        +              "description": "Filter by super connector email address (prefix or exact match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_ACCOUNT_ID",
        +              "description": "Filter by source company UUID — for Account→Account path types (COMMON_INVESTOR, COMMON_BOARD_HOP, ACCOUNT_ALUMNI, SELF_DECLARED_ACCOUNT, COMMON_INVESTOR_HOP, ACCOUNT_INSIGHT_BOARD_ADVISOR, etc.) where the source node is a company, not a user. Exact match. RECOMMENDED over FILTER_FIELD_SOURCE_ACCOUNT_NAME when the account UUID is known (resolve via search_accounts_with_filters first).",
        +              "title": "FILTER_FIELD_SOURCE_ACCOUNT_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_ACCOUNT_NAME",
        +              "description": "Filter by source company name (prefix/substring match) — for Account→Account path types. Use to answer questions like 'which accounts can Garuda Ventures help reach?'. ONE name token per value recommended for broad matching. Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_SOURCE_ACCOUNT_ID when the UUID is known.",
        +              "title": "FILTER_FIELD_SOURCE_ACCOUNT_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN",
        +              "description": "Filter by source company domain (exact or prefix match) — for Account→Account path types. E.g. 'garudaventures.com'. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_CONTACT_ID",
        +              "description": "Filter by source contact UUID — for Contact→Account path types (COMPANY_ALUMNI) where the source node is a contact. Exact match. RECOMMENDED over FILTER_FIELD_SOURCE_CONTACT_NAME when the UUID is known.",
        +              "title": "FILTER_FIELD_SOURCE_CONTACT_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_CONTACT_NAME",
        +              "description": "Filter by source contact first OR last name (prefix match) — for Contact→Account path types. ONE name token per value. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_SOURCE_CONTACT_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_ICP",
        +              "description": "Filter by target account ICP (Ideal Customer Profile) match status. Valid values: 'MATCH' (account matches ICP criteria), 'NO_MATCH' (account evaluated and does not match), 'NO_DATA' (insufficient data to evaluate), 'NO_ICP_DEFINED' (workspace has no ICP configured), 'PRE_MATCH' (pending evaluation). Use the special sentinel value 'null' to match accounts where the ICP field has not been set. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_ICP"
        +            },
        +            {
        +              "const": "FILTER_FIELD_TITLE_PERSONA",
        +              "description": "Buyer persona of the target contact, matched against the contact's title. Values are persona names, NOT job titles: 'BUYING_COMMITTEE' (functional buyers and users — the workspace's buying_committee_regex), 'EXTENDED_BUYING_COMMITTEE' (procurement / finance / IT / legal approval seats — extended_buying_committee_regex), 'LEADERSHIP' (C-suite and VP-level titles from the shared taxonomy, not board members, founders or partner/principal). Multiple values are OR-combined. A persona whose regex is not configured for the workspace is ignored.",
        +              "title": "FILTER_FIELD_TITLE_PERSONA"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_CATEGORY",
        +              "description": "Filter by the target account's category — the workspace's own classification of the account, distinct from ICP. Valid values: 'CUSTOMER', 'PROSPECT', 'OPEN_OPPORTUNITY', 'CLOSED_LOST', 'CHURNED', 'PARTNER', 'COMPETITOR', 'OTHER'. Use the special sentinel value 'null' to match accounts that have not been categorised. An account can carry several categories; multiple values are OR-combined (the account carries any of them), and NOT_IN keeps accounts carrying none of them. Do not confuse with FILTER_FIELD_CATEGORY, which filters on the super connector's category.",
        +              "title": "FILTER_FIELD_ACCOUNT_CATEGORY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONNECTOR_LOCATION",
        +              "description": "Location of the connector (super connector), matched case-insensitively against city, country, or ISO country code (e.g. 'US', 'San Francisco', 'United States'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONNECTOR_LOCATION"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY",
        +              "title": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OFFICE_STATE",
        +              "title": "FILTER_FIELD_ACCOUNT_OFFICE_STATE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OFFICE_CITY",
        +              "title": "FILTER_FIELD_ACCOUNT_OFFICE_CITY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_REFERENCE_ID",
        +              "description": "Filter by the target account's CRM record ID — exact match on reference_id (e.g. Salesforce 18-character Account ID '001xx000003DGbQAAW', HubSpot company ID). Values are CRM IDs, NOT internal UUIDs. Use directly when the user supplies Salesforce/HubSpot IDs — do NOT call search_accounts_with_filters first to resolve them to UUIDs. Pass the id exactly as the CRM stores it: a 15-character Salesforce short id does not match the stored 18-character form, and the match is silent — wrong form returns zero rows, not an error. Only CRM-sourced accounts have a CRM id; accounts created inside Boomerang carry an internal 'BOOM-…' reference_id and never match here. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_REFERENCE_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_STARRED",
        +              "title": "FILTER_FIELD_STARRED"
        +            }
        +          ]
        +        },
        +        "operator": {
        +          "description": "How values are matched. Omit (or 'IN') to keep only rows matching any of the values — the default. Use 'NOT_IN' (aliases: 'NOT_EQUAL_TO', 'NE') to EXCLUDE rows matching any of the values, e.g. field=FILTER_FIELD_ACCOUNT_CATEGORY, operator='NOT_IN', values=['CUSTOMER'] returns paths to accounts that are not customers. A NOT_IN filter keeps rows where the entity exists but the field has no value on record, and excludes paths that have no such entity at all — 'account category not CUSTOMER' returns only paths that target an account, never User→Contact paths. Text filters (names, titles, domains, emails) match by substring, so NOT_IN on them excludes every row CONTAINING a value, not only exact matches — 'account name not [Acme]' also drops 'Acme Holdings'. Not supported on FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY — pass 'true'/'false' with IN instead.",
        +          "type": "string"
        +        },
        +        "values": {
        +          "description": "One or more filter values. Multiple values are OR-combined within the same field, AND across different fields. For FILTER_FIELD_SENIORITY use stored values 'Owner/CXO', 'VP', 'DIRECTOR', 'MANAGER', 'IC' (OWNER_CXO alias accepted). For FILTER_FIELD_STRENGTH use: 'CONFIRMED', 'STRONG', 'LESS_LIKELY', 'UNLIKELY'. For FILTER_FIELD_CATEGORY use category UUIDs resolved from get_workspace_categories (filter to SUPER_CONNECTORS, match by label, use id). For FILTER_FIELD_RELATIONSHIP_PATH_TYPE use RelationshipPathType enum names as strings — User–Contact: 'LINKEDIN_CONNECTION', 'WORK_OVERLAP', 'EDUCATION_OVERLAP', 'CALENDAR_EVENT', 'SELF_DECLARED_CONTACT', 'SELF_DECLARED_CONTACT_DONT_KNOW', 'SUPER_CONNECTOR_APPROVED', 'SUPER_CONNECTOR_DECLINED'; User–Account: 'BOARD_MEMBER', 'COMMON_BOARD_HOP', 'ADVISOR', 'LEADERSHIP', 'EMPLOYEE', 'INVESTOR', 'ACCOUNT_ALUMNI', 'SELF_DECLARED_ACCOUNT', 'SELF_DECLARED_ACCOUNT_DONT_KNOW'; Company–Account: 'COMMON_INVESTOR', 'COMMON_INVESTOR_HOP', 'PORTFOLIO'; Contact–Account: 'COMPANY_ALUMNI'; Account insight: 'ACCOUNT_INSIGHT_BOARD_ADVISOR', 'ACCOUNT_INSIGHT_BOARD_ADVISOR_VIA_CONTACT'. For FILTER_FIELD_CONFIDENCE use: 'High', 'Medium', 'Low'. For FILTER_FIELD_INTRO_VALUE use: 'High', 'Medium', 'Low'. For FILTER_FIELD_SOURCE_ACCOUNT_ID/FILTER_FIELD_SOURCE_CONTACT_ID use UUIDs (resolve via search_accounts_with_filters or search_contacts first). For FILTER_FIELD_ACCOUNT_REFERENCE_ID pass CRM record IDs as-is (e.g. Salesforce '001xx000003DGbQAAW') — exact match, no UUID resolution needed. For FILTER_FIELD_ACCOUNT_ICP use: 'MATCH', 'NO_MATCH', 'NO_DATA', 'NO_ICP_DEFINED', 'PRE_MATCH', or the sentinel 'null' to match accounts with no ICP value set. Person-name filters (FILTER_FIELD_SUPER_CONNECTOR_NAME, FILTER_FIELD_CONTACT_NAME, FILTER_FIELD_ACCOUNT_OWNER_NAME, FILTER_FIELD_SOURCE_ACCOUNT_NAME, FILTER_FIELD_SOURCE_CONTACT_NAME): pass ONE first or last name token per value — never a full name like 'Jane Doe' or 'Garuda Ventures' as a single string, which silently returns zero results. Prefer ID-based filters when UUIDs are known.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedsearch_warm_intro_relationships1 field changed
      • changedInput schema / properties / filters / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "properties": {
        -        "fallback_fields": {
        -          "items": {
        -            "oneOf": [
        -              {
        -                "const": "FILTER_FIELD_SENIORITY",
        -                "title": "FILTER_FIELD_SENIORITY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_LOCATION",
        -                "title": "FILTER_FIELD_LOCATION"
        -              },
        -              {
        -                "const": "FILTER_FIELD_STRENGTH",
        -                "title": "FILTER_FIELD_STRENGTH"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CATEGORY",
        -                "title": "FILTER_FIELD_CATEGORY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONNECTOR_ID",
        -                "title": "FILTER_FIELD_CONNECTOR_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY",
        -                "title": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE",
        -                "title": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_DEPARTMENT",
        -                "title": "FILTER_FIELD_DEPARTMENT"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OWNER_ID",
        -                "title": "FILTER_FIELD_ACCOUNT_OWNER_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_INDUSTRY",
        -                "title": "FILTER_FIELD_ACCOUNT_INDUSTRY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_COUNTRY",
        -                "title": "FILTER_FIELD_ACCOUNT_COUNTRY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE",
        -                "title": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONFIDENCE",
        -                "title": "FILTER_FIELD_CONFIDENCE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_INTRO_VALUE",
        -                "title": "FILTER_FIELD_INTRO_VALUE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_ID",
        -                "title": "FILTER_FIELD_ACCOUNT_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_NAME",
        -                "title": "FILTER_FIELD_ACCOUNT_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_DOMAIN",
        -                "title": "FILTER_FIELD_ACCOUNT_DOMAIN"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OWNER_NAME",
        -                "title": "FILTER_FIELD_ACCOUNT_OWNER_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_ID",
        -                "title": "FILTER_FIELD_CONTACT_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_NAME",
        -                "title": "FILTER_FIELD_CONTACT_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_EMAIL",
        -                "title": "FILTER_FIELD_CONTACT_EMAIL"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_TITLE",
        -                "title": "FILTER_FIELD_CONTACT_TITLE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_COMPANY_NAME",
        -                "title": "FILTER_FIELD_CONTACT_COMPANY_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SUPER_CONNECTOR_NAME",
        -                "title": "FILTER_FIELD_SUPER_CONNECTOR_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL",
        -                "title": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_ACCOUNT_ID",
        -                "title": "FILTER_FIELD_SOURCE_ACCOUNT_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_ACCOUNT_NAME",
        -                "title": "FILTER_FIELD_SOURCE_ACCOUNT_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN",
        -                "title": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_CONTACT_ID",
        -                "title": "FILTER_FIELD_SOURCE_CONTACT_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_CONTACT_NAME",
        -                "title": "FILTER_FIELD_SOURCE_CONTACT_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_ICP",
        -                "title": "FILTER_FIELD_ACCOUNT_ICP"
        -              },
        -              {
        -                "const": "FILTER_FIELD_TITLE_PERSONA",
        -                "title": "FILTER_FIELD_TITLE_PERSONA"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_CATEGORY",
        -                "title": "FILTER_FIELD_ACCOUNT_CATEGORY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONNECTOR_LOCATION",
        -                "title": "FILTER_FIELD_CONNECTOR_LOCATION"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY",
        -                "title": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OFFICE_STATE",
        -                "title": "FILTER_FIELD_ACCOUNT_OFFICE_STATE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OFFICE_CITY",
        -                "title": "FILTER_FIELD_ACCOUNT_OFFICE_CITY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_REFERENCE_ID",
        -                "title": "FILTER_FIELD_ACCOUNT_REFERENCE_ID"
        -              }
        -            ]
        -          },
        -          "type": "array"
        -        },
        -        "field": {
        -          "description": "Which attribute to filter on.",
        -          "oneOf": [
        -            {
        -              "const": "FILTER_FIELD_SENIORITY",
        -              "description": "Target contact seniority level. Use IN operator. Stored values: 'Owner/CXO', 'VP', 'DIRECTOR', 'MANAGER', 'IC'. Documented alias OWNER_CXO is also accepted. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_SENIORITY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_LOCATION",
        -              "description": "Target contact's location (country code or location name string). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_LOCATION"
        -            },
        -            {
        -              "const": "FILTER_FIELD_STRENGTH",
        -              "description": "Relationship strength between the connector and target contact. Valid values: 'CONFIRMED', 'STRONG', 'LESS_LIKELY', 'UNLIKELY'. Prefer CONFIRMED and STRONG when looking for high-quality intro paths.",
        -              "title": "FILTER_FIELD_STRENGTH"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CATEGORY",
        -              "description": "Relationship category describing who the super connector is in relation to the company (e.g. Investor, Advisor, Board Member, Customer, Champion, Alumni, Leadership). IMPORTANT: this is NOT the same as seniority (how senior the contact is) or strength (how strong the tie is). Trigger words: investor(s), customer(s), board member(s), advisor(s), champion(s), alumni, leadership, partner(s). Values must be category UUIDs — NOT label strings. Resolution flow: (1) call get_workspace_categories, (2) filter to relationship_type SUPER_CONNECTORS and is_deleted false, (3) match user intent to closest label(s) — OR all plausible matches, (4) use those id UUIDs as filter values.",
        -              "title": "FILTER_FIELD_CATEGORY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONNECTOR_ID",
        -              "description": "RECOMMENDED over FILTER_FIELD_SUPER_CONNECTOR_NAME when the connector user_id is known. Exact match on one or more connector user UUIDs (Keycloak user IDs). Resolve connector names via search_workspace_members first to avoid silent zero-result failures from name prefix matching.",
        -              "title": "FILTER_FIELD_CONNECTOR_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY",
        -              "description": "Include or exclude contacts who have left the tracked company. Values: 'true' or 'false'.",
        -              "title": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE",
        -              "description": "One or more path type evidence signals used to establish the relationship. Use string names from the RelationshipPathType enum. User–Contact: 'LINKEDIN_CONNECTION' (direct LinkedIn connection), 'WORK_OVERLAP' (same company same time), 'EDUCATION_OVERLAP' (same school), 'CALENDAR_EVENT' (meetings on record), 'SELF_DECLARED_CONTACT' (connector declared they know the contact), 'SELF_DECLARED_CONTACT_DONT_KNOW' (connector declared they do not know the contact), 'SUPER_CONNECTOR_APPROVED' (super connector approved the path), 'SUPER_CONNECTOR_DECLINED' (super connector declined), 'TESTIMONIAL' (LinkedIn recommendation one wrote for the other), 'LINKEDIN_ENGAGEMENT' (connector comments on the contact's LinkedIn posts), 'LINKEDIN_POST_MENTION' (connector tagged the contact in one of the connector's own LinkedIn posts). User–Account: 'BOARD_MEMBER', 'COMMON_BOARD_HOP' (P1 → P2 via shared board seat), 'ADVISOR', 'LEADERSHIP', 'EMPLOYEE', 'INVESTOR', 'ACCOUNT_ALUMNI' (connector previously worked at target account), 'SELF_DECLARED_ACCOUNT' (connector declared a relationship to the account), 'SELF_DECLARED_ACCOUNT_DONT_KNOW'. Company–Account: 'COMMON_INVESTOR', 'COMMON_INVESTOR_HOP', 'PORTFOLIO' (a portfolio company of this workspace's investor firm). Contact–Account: 'COMPANY_ALUMNI' (worked at same company at different times). Account insight: 'ACCOUNT_INSIGHT_BOARD_ADVISOR', 'ACCOUNT_INSIGHT_BOARD_ADVISOR_VIA_CONTACT'. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_DEPARTMENT",
        -              "description": "Target contact's department (free-text match). Values are department name strings (e.g. 'Engineering', 'Sales', 'Marketing'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_DEPARTMENT"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OWNER_ID",
        -              "description": "RECOMMENDED over FILTER_FIELD_ACCOUNT_OWNER_NAME when the owner user_id is known. Exact match on CRM account owner user UUID (Keycloak user ID). Resolve owner names via search_workspace_members first.",
        -              "title": "FILTER_FIELD_ACCOUNT_OWNER_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_INDUSTRY",
        -              "description": "Filter by target account industry. Values are industry name strings (e.g. 'Software', 'Financial Services'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_INDUSTRY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_COUNTRY",
        -              "description": "Filter by target account's country. Values are country name strings (e.g. 'United States', 'Germany'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_COUNTRY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE",
        -              "description": "Filter by target account employee headcount range. Valid values: '1', '2-10', '11-50', '51-200', '201-500', '501-1000', '1001-5000', '5001-10000', '10001+'. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONFIDENCE",
        -              "description": "GPT scoring confidence level for the relationship assessment. Valid values: 'High', 'Medium', 'Low'. Use 'High' to restrict results to relationships the scoring model is most certain about. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONFIDENCE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_INTRO_VALUE",
        -              "description": "Assessed value of requesting an introduction through this relationship path. Valid values: 'High', 'Medium', 'Low'. Determined by the Boomerang scoring engine based on strength, seniority, and recency signals. Use 'High' to prioritize the best intro opportunities. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_INTRO_VALUE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_ID",
        -              "description": "Filter by CRM account UUID. Values are account ID strings. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_NAME",
        -              "description": "Filter by target account name (prefix match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_DOMAIN",
        -              "description": "Filter by target account website domain (e.g. 'acme.com'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_DOMAIN"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OWNER_NAME",
        -              "description": "Filter by CRM account owner first OR last name, prefix match on ONE name part only (e.g. [\"John\"] or [\"Smith\"] — NOT \"John Smith\" as one string, which silently returns zero results). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_ACCOUNT_OWNER_ID when user_id is known (resolve via search_workspace_members).",
        -              "title": "FILTER_FIELD_ACCOUNT_OWNER_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_ID",
        -              "description": "RECOMMENDED over FILTER_FIELD_CONTACT_NAME when the contact UUID is known. Exact match on target contact UUID. Resolve contact names via search_contacts first.",
        -              "title": "FILTER_FIELD_CONTACT_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_NAME",
        -              "description": "Filter by target contact first OR last name, prefix match on ONE name part only (e.g. [\"Jane\"] or [\"Doe\"] — NOT \"Jane Doe\" as one string, which silently returns zero results). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_CONTACT_ID when contact UUID is known (resolve via search_contacts).",
        -              "title": "FILTER_FIELD_CONTACT_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_EMAIL",
        -              "description": "Filter by target contact email address (prefix or exact match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONTACT_EMAIL"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_TITLE",
        -              "description": "Filter by target contact job title (prefix match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONTACT_TITLE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_COMPANY_NAME",
        -              "description": "Filter by the company name associated with the target contact — typically the target account name (prefix match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONTACT_COMPANY_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SUPER_CONNECTOR_NAME",
        -              "description": "Filter by super connector's first OR last name, prefix match on ONE name part only (e.g. [\"Steven\"] or [\"Hagler\"] — NOT \"Steven Hagler\" as a single combined string, which will silently return zero results rather than an error). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_CONNECTOR_ID instead whenever the connector's user_id is already known (e.g. from search_workspace_members) — it does an exact match and avoids the silent zero-result failure mode of name-based prefix matching, especially for people with common or multi-word names.",
        -              "title": "FILTER_FIELD_SUPER_CONNECTOR_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL",
        -              "description": "Filter by super connector email address (prefix or exact match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_ACCOUNT_ID",
        -              "description": "Filter by source company UUID — for Account→Account path types (COMMON_INVESTOR, COMMON_BOARD_HOP, ACCOUNT_ALUMNI, SELF_DECLARED_ACCOUNT, COMMON_INVESTOR_HOP, ACCOUNT_INSIGHT_BOARD_ADVISOR, etc.) where the source node is a company, not a user. Exact match. RECOMMENDED over FILTER_FIELD_SOURCE_ACCOUNT_NAME when the account UUID is known (resolve via search_accounts_with_filters first).",
        -              "title": "FILTER_FIELD_SOURCE_ACCOUNT_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_ACCOUNT_NAME",
        -              "description": "Filter by source company name (prefix/substring match) — for Account→Account path types. Use to answer questions like 'which accounts can Garuda Ventures help reach?'. ONE name token per value recommended for broad matching. Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_SOURCE_ACCOUNT_ID when the UUID is known.",
        -              "title": "FILTER_FIELD_SOURCE_ACCOUNT_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN",
        -              "description": "Filter by source company domain (exact or prefix match) — for Account→Account path types. E.g. 'garudaventures.com'. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_CONTACT_ID",
        -              "description": "Filter by source contact UUID — for Contact→Account path types (COMPANY_ALUMNI) where the source node is a contact. Exact match. RECOMMENDED over FILTER_FIELD_SOURCE_CONTACT_NAME when the UUID is known.",
        -              "title": "FILTER_FIELD_SOURCE_CONTACT_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_CONTACT_NAME",
        -              "description": "Filter by source contact first OR last name (prefix match) — for Contact→Account path types. ONE name token per value. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_SOURCE_CONTACT_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_ICP",
        -              "description": "Filter by target account ICP (Ideal Customer Profile) match status. Valid values: 'MATCH' (account matches ICP criteria), 'NO_MATCH' (account evaluated and does not match), 'NO_DATA' (insufficient data to evaluate), 'NO_ICP_DEFINED' (workspace has no ICP configured), 'PRE_MATCH' (pending evaluation). Use the special sentinel value 'null' to match accounts where the ICP field has not been set. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_ICP"
        -            },
        -            {
        -              "const": "FILTER_FIELD_TITLE_PERSONA",
        -              "description": "Buyer persona of the target contact, matched against the contact's title. Values are persona names, NOT job titles: 'BUYING_COMMITTEE' (functional buyers and users — the workspace's buying_committee_regex), 'EXTENDED_BUYING_COMMITTEE' (procurement / finance / IT / legal approval seats — extended_buying_committee_regex), 'LEADERSHIP' (C-suite and VP-level titles from the shared taxonomy, not board members, founders or partner/principal). Multiple values are OR-combined. A persona whose regex is not configured for the workspace is ignored.",
        -              "title": "FILTER_FIELD_TITLE_PERSONA"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_CATEGORY",
        -              "description": "Filter by the target account's category — the workspace's own classification of the account, distinct from ICP. Valid values: 'CUSTOMER', 'PROSPECT', 'OPEN_OPPORTUNITY', 'CLOSED_LOST', 'CHURNED', 'PARTNER', 'INVESTOR_PORTFOLIO', 'COMPETITOR', 'OTHER'. Use the special sentinel value 'null' to match accounts that have not been categorised. Multiple values are OR-combined. Do not confuse with FILTER_FIELD_CATEGORY, which filters on the super connector's category.",
        -              "title": "FILTER_FIELD_ACCOUNT_CATEGORY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONNECTOR_LOCATION",
        -              "description": "Location of the connector (super connector), matched case-insensitively against city, country, or ISO country code (e.g. 'US', 'San Francisco', 'United States'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONNECTOR_LOCATION"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY",
        -              "title": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OFFICE_STATE",
        -              "title": "FILTER_FIELD_ACCOUNT_OFFICE_STATE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OFFICE_CITY",
        -              "title": "FILTER_FIELD_ACCOUNT_OFFICE_CITY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_REFERENCE_ID",
        -              "description": "Filter by the target account's CRM record ID — exact match on reference_id (e.g. Salesforce 18-character Account ID '001xx000003DGbQAAW', HubSpot company ID). Values are CRM IDs, NOT internal UUIDs. Use directly when the user supplies Salesforce/HubSpot IDs — do NOT call search_accounts_with_filters first to resolve them to UUIDs. Pass the id exactly as the CRM stores it: a 15-character Salesforce short id does not match the stored 18-character form, and the match is silent — wrong form returns zero rows, not an error. Only CRM-sourced accounts have a CRM id; accounts created inside Boomerang carry an internal 'BOOM-…' reference_id and never match here. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_REFERENCE_ID"
        -            }
        -          ]
        -        },
        -        "operator": {
        -          "description": "How values are matched. Omit (or 'IN') to keep only rows matching any of the values — the default. Use 'NOT_IN' (aliases: 'NOT_EQUAL_TO', 'NE') to EXCLUDE rows matching any of the values, e.g. field=FILTER_FIELD_ACCOUNT_CATEGORY, operator='NOT_IN', values=['CUSTOMER'] returns paths to accounts that are not customers. A NOT_IN filter keeps rows where the entity exists but the field has no value on record, and excludes paths that have no such entity at all — 'account category not CUSTOMER' returns only paths that target an account, never User→Contact paths. Text filters (names, titles, domains, emails) match by substring, so NOT_IN on them excludes every row CONTAINING a value, not only exact matches — 'account name not [Acme]' also drops 'Acme Holdings'. Not supported on FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY — pass 'true'/'false' with IN instead.",
        -          "type": "string"
        -        },
        -        "values": {
        -          "description": "One or more filter values. Multiple values are OR-combined within the same field, AND across different fields. For FILTER_FIELD_SENIORITY use stored values 'Owner/CXO', 'VP', 'DIRECTOR', 'MANAGER', 'IC' (OWNER_CXO alias accepted). For FILTER_FIELD_STRENGTH use: 'CONFIRMED', 'STRONG', 'LESS_LIKELY', 'UNLIKELY'. For FILTER_FIELD_CATEGORY use category UUIDs resolved from get_workspace_categories (filter to SUPER_CONNECTORS, match by label, use id). For FILTER_FIELD_RELATIONSHIP_PATH_TYPE use RelationshipPathType enum names as strings — User–Contact: 'LINKEDIN_CONNECTION', 'WORK_OVERLAP', 'EDUCATION_OVERLAP', 'CALENDAR_EVENT', 'SELF_DECLARED_CONTACT', 'SELF_DECLARED_CONTACT_DONT_KNOW', 'SUPER_CONNECTOR_APPROVED', 'SUPER_CONNECTOR_DECLINED'; User–Account: 'BOARD_MEMBER', 'COMMON_BOARD_HOP', 'ADVISOR', 'LEADERSHIP', 'EMPLOYEE', 'INVESTOR', 'ACCOUNT_ALUMNI', 'SELF_DECLARED_ACCOUNT', 'SELF_DECLARED_ACCOUNT_DONT_KNOW'; Company–Account: 'COMMON_INVESTOR', 'COMMON_INVESTOR_HOP', 'PORTFOLIO'; Contact–Account: 'COMPANY_ALUMNI'; Account insight: 'ACCOUNT_INSIGHT_BOARD_ADVISOR', 'ACCOUNT_INSIGHT_BOARD_ADVISOR_VIA_CONTACT'. For FILTER_FIELD_CONFIDENCE use: 'High', 'Medium', 'Low'. For FILTER_FIELD_INTRO_VALUE use: 'High', 'Medium', 'Low'. For FILTER_FIELD_SOURCE_ACCOUNT_ID/FILTER_FIELD_SOURCE_CONTACT_ID use UUIDs (resolve via search_accounts_with_filters or search_contacts first). For FILTER_FIELD_ACCOUNT_REFERENCE_ID pass CRM record IDs as-is (e.g. Salesforce '001xx000003DGbQAAW') — exact match, no UUID resolution needed. For FILTER_FIELD_ACCOUNT_ICP use: 'MATCH', 'NO_MATCH', 'NO_DATA', 'NO_ICP_DEFINED', 'PRE_MATCH', or the sentinel 'null' to match accounts with no ICP value set. Person-name filters (FILTER_FIELD_SUPER_CONNECTOR_NAME, FILTER_FIELD_CONTACT_NAME, FILTER_FIELD_ACCOUNT_OWNER_NAME, FILTER_FIELD_SOURCE_ACCOUNT_NAME, FILTER_FIELD_SOURCE_CONTACT_NAME): pass ONE first or last name token per value — never a full name like 'Jane Doe' or 'Garuda Ventures' as a single string, which silently returns zero results. Prefer ID-based filters when UUIDs are known.",
        -          "items": {
        -            "type": "string"
        -          },
        -          "type": "array"
        -        }
        -      },
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "properties": {
        +        "fallback_fields": {
        +          "items": {
        +            "oneOf": [
        +              {
        +                "const": "FILTER_FIELD_SENIORITY",
        +                "title": "FILTER_FIELD_SENIORITY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_LOCATION",
        +                "title": "FILTER_FIELD_LOCATION"
        +              },
        +              {
        +                "const": "FILTER_FIELD_STRENGTH",
        +                "title": "FILTER_FIELD_STRENGTH"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CATEGORY",
        +                "title": "FILTER_FIELD_CATEGORY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONNECTOR_ID",
        +                "title": "FILTER_FIELD_CONNECTOR_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY",
        +                "title": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE",
        +                "title": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_DEPARTMENT",
        +                "title": "FILTER_FIELD_DEPARTMENT"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OWNER_ID",
        +                "title": "FILTER_FIELD_ACCOUNT_OWNER_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_INDUSTRY",
        +                "title": "FILTER_FIELD_ACCOUNT_INDUSTRY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_COUNTRY",
        +                "title": "FILTER_FIELD_ACCOUNT_COUNTRY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE",
        +                "title": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONFIDENCE",
        +                "title": "FILTER_FIELD_CONFIDENCE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_INTRO_VALUE",
        +                "title": "FILTER_FIELD_INTRO_VALUE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_ID",
        +                "title": "FILTER_FIELD_ACCOUNT_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_NAME",
        +                "title": "FILTER_FIELD_ACCOUNT_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_DOMAIN",
        +                "title": "FILTER_FIELD_ACCOUNT_DOMAIN"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OWNER_NAME",
        +                "title": "FILTER_FIELD_ACCOUNT_OWNER_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_ID",
        +                "title": "FILTER_FIELD_CONTACT_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_NAME",
        +                "title": "FILTER_FIELD_CONTACT_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_EMAIL",
        +                "title": "FILTER_FIELD_CONTACT_EMAIL"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_TITLE",
        +                "title": "FILTER_FIELD_CONTACT_TITLE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_COMPANY_NAME",
        +                "title": "FILTER_FIELD_CONTACT_COMPANY_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SUPER_CONNECTOR_NAME",
        +                "title": "FILTER_FIELD_SUPER_CONNECTOR_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL",
        +                "title": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_ACCOUNT_ID",
        +                "title": "FILTER_FIELD_SOURCE_ACCOUNT_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_ACCOUNT_NAME",
        +                "title": "FILTER_FIELD_SOURCE_ACCOUNT_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN",
        +                "title": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_CONTACT_ID",
        +                "title": "FILTER_FIELD_SOURCE_CONTACT_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_CONTACT_NAME",
        +                "title": "FILTER_FIELD_SOURCE_CONTACT_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_ICP",
        +                "title": "FILTER_FIELD_ACCOUNT_ICP"
        +              },
        +              {
        +                "const": "FILTER_FIELD_TITLE_PERSONA",
        +                "title": "FILTER_FIELD_TITLE_PERSONA"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_CATEGORY",
        +                "title": "FILTER_FIELD_ACCOUNT_CATEGORY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONNECTOR_LOCATION",
        +                "title": "FILTER_FIELD_CONNECTOR_LOCATION"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY",
        +                "title": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OFFICE_STATE",
        +                "title": "FILTER_FIELD_ACCOUNT_OFFICE_STATE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OFFICE_CITY",
        +                "title": "FILTER_FIELD_ACCOUNT_OFFICE_CITY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_REFERENCE_ID",
        +                "title": "FILTER_FIELD_ACCOUNT_REFERENCE_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_STARRED",
        +                "title": "FILTER_FIELD_STARRED"
        +              }
        +            ]
        +          },
        +          "type": "array"
        +        },
        +        "field": {
        +          "description": "Which attribute to filter on.",
        +          "oneOf": [
        +            {
        +              "const": "FILTER_FIELD_SENIORITY",
        +              "description": "Target contact seniority level. Use IN operator. Stored values: 'Owner/CXO', 'VP', 'DIRECTOR', 'MANAGER', 'IC'. Documented alias OWNER_CXO is also accepted. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_SENIORITY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_LOCATION",
        +              "description": "Target contact's location (country code or location name string). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_LOCATION"
        +            },
        +            {
        +              "const": "FILTER_FIELD_STRENGTH",
        +              "description": "Relationship strength between the connector and target contact. Valid values: 'CONFIRMED', 'STRONG', 'LESS_LIKELY', 'UNLIKELY'. Prefer CONFIRMED and STRONG when looking for high-quality intro paths.",
        +              "title": "FILTER_FIELD_STRENGTH"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CATEGORY",
        +              "description": "Relationship category describing who the super connector is in relation to the company (e.g. Investor, Advisor, Board Member, Customer, Champion, Alumni, Leadership). IMPORTANT: this is NOT the same as seniority (how senior the contact is) or strength (how strong the tie is). Trigger words: investor(s), customer(s), board member(s), advisor(s), champion(s), alumni, leadership, partner(s). Values must be category UUIDs — NOT label strings. Resolution flow: (1) call get_workspace_categories, (2) filter to relationship_type SUPER_CONNECTORS and is_deleted false, (3) match user intent to closest label(s) — OR all plausible matches, (4) use those id UUIDs as filter values.",
        +              "title": "FILTER_FIELD_CATEGORY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONNECTOR_ID",
        +              "description": "RECOMMENDED over FILTER_FIELD_SUPER_CONNECTOR_NAME when the connector user_id is known. Exact match on one or more connector user UUIDs (Keycloak user IDs). Resolve connector names via search_workspace_members first to avoid silent zero-result failures from name prefix matching.",
        +              "title": "FILTER_FIELD_CONNECTOR_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY",
        +              "description": "Include or exclude contacts who have left the tracked company. Values: 'true' or 'false'.",
        +              "title": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE",
        +              "description": "One or more path type evidence signals used to establish the relationship. Use string names from the RelationshipPathType enum. User–Contact: 'LINKEDIN_CONNECTION' (direct LinkedIn connection), 'WORK_OVERLAP' (same company same time), 'EDUCATION_OVERLAP' (same school), 'CALENDAR_EVENT' (meetings on record), 'SELF_DECLARED_CONTACT' (connector declared they know the contact), 'SELF_DECLARED_CONTACT_DONT_KNOW' (connector declared they do not know the contact), 'SUPER_CONNECTOR_APPROVED' (super connector approved the path), 'SUPER_CONNECTOR_DECLINED' (super connector declined), 'TESTIMONIAL' (LinkedIn recommendation one wrote for the other), 'LINKEDIN_ENGAGEMENT' (connector comments on the contact's LinkedIn posts), 'LINKEDIN_POST_MENTION' (connector tagged the contact in one of the connector's own LinkedIn posts). User–Account: 'BOARD_MEMBER', 'COMMON_BOARD_HOP' (P1 → P2 via shared board seat), 'ADVISOR', 'LEADERSHIP', 'EMPLOYEE', 'INVESTOR', 'ACCOUNT_ALUMNI' (connector previously worked at target account), 'SELF_DECLARED_ACCOUNT' (connector declared a relationship to the account), 'SELF_DECLARED_ACCOUNT_DONT_KNOW'. Company–Account: 'COMMON_INVESTOR', 'COMMON_INVESTOR_HOP', 'PORTFOLIO' (a portfolio company of this workspace's investor firm). Contact–Account: 'COMPANY_ALUMNI' (worked at same company at different times). Account insight: 'ACCOUNT_INSIGHT_BOARD_ADVISOR', 'ACCOUNT_INSIGHT_BOARD_ADVISOR_VIA_CONTACT'. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_DEPARTMENT",
        +              "description": "Target contact's department (free-text match). Values are department name strings (e.g. 'Engineering', 'Sales', 'Marketing'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_DEPARTMENT"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OWNER_ID",
        +              "description": "RECOMMENDED over FILTER_FIELD_ACCOUNT_OWNER_NAME when the owner user_id is known. Exact match on CRM account owner user UUID (Keycloak user ID). Resolve owner names via search_workspace_members first.",
        +              "title": "FILTER_FIELD_ACCOUNT_OWNER_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_INDUSTRY",
        +              "description": "Filter by target account industry. Values are industry name strings (e.g. 'Software', 'Financial Services'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_INDUSTRY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_COUNTRY",
        +              "description": "Filter by target account's country. Values are country name strings (e.g. 'United States', 'Germany'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_COUNTRY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE",
        +              "description": "Filter by target account employee headcount range. Valid values: '1', '2-10', '11-50', '51-200', '201-500', '501-1000', '1001-5000', '5001-10000', '10001+'. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONFIDENCE",
        +              "description": "GPT scoring confidence level for the relationship assessment. Valid values: 'High', 'Medium', 'Low'. Use 'High' to restrict results to relationships the scoring model is most certain about. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONFIDENCE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_INTRO_VALUE",
        +              "description": "Assessed value of requesting an introduction through this relationship path. Valid values: 'High', 'Medium', 'Low'. Determined by the Boomerang scoring engine based on strength, seniority, and recency signals. Use 'High' to prioritize the best intro opportunities. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_INTRO_VALUE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_ID",
        +              "description": "Filter by CRM account UUID. Values are account ID strings. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_NAME",
        +              "description": "Filter by target account name (prefix match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_DOMAIN",
        +              "description": "Filter by target account website domain (e.g. 'acme.com'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_DOMAIN"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OWNER_NAME",
        +              "description": "Filter by CRM account owner first OR last name, prefix match on ONE name part only (e.g. [\"John\"] or [\"Smith\"] — NOT \"John Smith\" as one string, which silently returns zero results). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_ACCOUNT_OWNER_ID when user_id is known (resolve via search_workspace_members).",
        +              "title": "FILTER_FIELD_ACCOUNT_OWNER_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_ID",
        +              "description": "RECOMMENDED over FILTER_FIELD_CONTACT_NAME when the contact UUID is known. Exact match on target contact UUID. Resolve contact names via search_contacts first.",
        +              "title": "FILTER_FIELD_CONTACT_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_NAME",
        +              "description": "Filter by target contact first OR last name, prefix match on ONE name part only (e.g. [\"Jane\"] or [\"Doe\"] — NOT \"Jane Doe\" as one string, which silently returns zero results). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_CONTACT_ID when contact UUID is known (resolve via search_contacts).",
        +              "title": "FILTER_FIELD_CONTACT_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_EMAIL",
        +              "description": "Filter by target contact email address (prefix or exact match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONTACT_EMAIL"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_TITLE",
        +              "description": "Filter by target contact job title (prefix match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONTACT_TITLE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_COMPANY_NAME",
        +              "description": "Filter by the company name associated with the target contact — typically the target account name (prefix match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONTACT_COMPANY_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SUPER_CONNECTOR_NAME",
        +              "description": "Filter by super connector's first OR last name, prefix match on ONE name part only (e.g. [\"Steven\"] or [\"Hagler\"] — NOT \"Steven Hagler\" as a single combined string, which will silently return zero results rather than an error). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_CONNECTOR_ID instead whenever the connector's user_id is already known (e.g. from search_workspace_members) — it does an exact match and avoids the silent zero-result failure mode of name-based prefix matching, especially for people with common or multi-word names.",
        +              "title": "FILTER_FIELD_SUPER_CONNECTOR_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL",
        +              "description": "Filter by super connector email address (prefix or exact match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_ACCOUNT_ID",
        +              "description": "Filter by source company UUID — for Account→Account path types (COMMON_INVESTOR, COMMON_BOARD_HOP, ACCOUNT_ALUMNI, SELF_DECLARED_ACCOUNT, COMMON_INVESTOR_HOP, ACCOUNT_INSIGHT_BOARD_ADVISOR, etc.) where the source node is a company, not a user. Exact match. RECOMMENDED over FILTER_FIELD_SOURCE_ACCOUNT_NAME when the account UUID is known (resolve via search_accounts_with_filters first).",
        +              "title": "FILTER_FIELD_SOURCE_ACCOUNT_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_ACCOUNT_NAME",
        +              "description": "Filter by source company name (prefix/substring match) — for Account→Account path types. Use to answer questions like 'which accounts can Garuda Ventures help reach?'. ONE name token per value recommended for broad matching. Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_SOURCE_ACCOUNT_ID when the UUID is known.",
        +              "title": "FILTER_FIELD_SOURCE_ACCOUNT_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN",
        +              "description": "Filter by source company domain (exact or prefix match) — for Account→Account path types. E.g. 'garudaventures.com'. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_CONTACT_ID",
        +              "description": "Filter by source contact UUID — for Contact→Account path types (COMPANY_ALUMNI) where the source node is a contact. Exact match. RECOMMENDED over FILTER_FIELD_SOURCE_CONTACT_NAME when the UUID is known.",
        +              "title": "FILTER_FIELD_SOURCE_CONTACT_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_CONTACT_NAME",
        +              "description": "Filter by source contact first OR last name (prefix match) — for Contact→Account path types. ONE name token per value. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_SOURCE_CONTACT_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_ICP",
        +              "description": "Filter by target account ICP (Ideal Customer Profile) match status. Valid values: 'MATCH' (account matches ICP criteria), 'NO_MATCH' (account evaluated and does not match), 'NO_DATA' (insufficient data to evaluate), 'NO_ICP_DEFINED' (workspace has no ICP configured), 'PRE_MATCH' (pending evaluation). Use the special sentinel value 'null' to match accounts where the ICP field has not been set. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_ICP"
        +            },
        +            {
        +              "const": "FILTER_FIELD_TITLE_PERSONA",
        +              "description": "Buyer persona of the target contact, matched against the contact's title. Values are persona names, NOT job titles: 'BUYING_COMMITTEE' (functional buyers and users — the workspace's buying_committee_regex), 'EXTENDED_BUYING_COMMITTEE' (procurement / finance / IT / legal approval seats — extended_buying_committee_regex), 'LEADERSHIP' (C-suite and VP-level titles from the shared taxonomy, not board members, founders or partner/principal). Multiple values are OR-combined. A persona whose regex is not configured for the workspace is ignored.",
        +              "title": "FILTER_FIELD_TITLE_PERSONA"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_CATEGORY",
        +              "description": "Filter by the target account's category — the workspace's own classification of the account, distinct from ICP. Valid values: 'CUSTOMER', 'PROSPECT', 'OPEN_OPPORTUNITY', 'CLOSED_LOST', 'CHURNED', 'PARTNER', 'COMPETITOR', 'OTHER'. Use the special sentinel value 'null' to match accounts that have not been categorised. An account can carry several categories; multiple values are OR-combined (the account carries any of them), and NOT_IN keeps accounts carrying none of them. Do not confuse with FILTER_FIELD_CATEGORY, which filters on the super connector's category.",
        +              "title": "FILTER_FIELD_ACCOUNT_CATEGORY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONNECTOR_LOCATION",
        +              "description": "Location of the connector (super connector), matched case-insensitively against city, country, or ISO country code (e.g. 'US', 'San Francisco', 'United States'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONNECTOR_LOCATION"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY",
        +              "title": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OFFICE_STATE",
        +              "title": "FILTER_FIELD_ACCOUNT_OFFICE_STATE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OFFICE_CITY",
        +              "title": "FILTER_FIELD_ACCOUNT_OFFICE_CITY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_REFERENCE_ID",
        +              "description": "Filter by the target account's CRM record ID — exact match on reference_id (e.g. Salesforce 18-character Account ID '001xx000003DGbQAAW', HubSpot company ID). Values are CRM IDs, NOT internal UUIDs. Use directly when the user supplies Salesforce/HubSpot IDs — do NOT call search_accounts_with_filters first to resolve them to UUIDs. Pass the id exactly as the CRM stores it: a 15-character Salesforce short id does not match the stored 18-character form, and the match is silent — wrong form returns zero rows, not an error. Only CRM-sourced accounts have a CRM id; accounts created inside Boomerang carry an internal 'BOOM-…' reference_id and never match here. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_REFERENCE_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_STARRED",
        +              "title": "FILTER_FIELD_STARRED"
        +            }
        +          ]
        +        },
        +        "operator": {
        +          "description": "How values are matched. Omit (or 'IN') to keep only rows matching any of the values — the default. Use 'NOT_IN' (aliases: 'NOT_EQUAL_TO', 'NE') to EXCLUDE rows matching any of the values, e.g. field=FILTER_FIELD_ACCOUNT_CATEGORY, operator='NOT_IN', values=['CUSTOMER'] returns paths to accounts that are not customers. A NOT_IN filter keeps rows where the entity exists but the field has no value on record, and excludes paths that have no such entity at all — 'account category not CUSTOMER' returns only paths that target an account, never User→Contact paths. Text filters (names, titles, domains, emails) match by substring, so NOT_IN on them excludes every row CONTAINING a value, not only exact matches — 'account name not [Acme]' also drops 'Acme Holdings'. Not supported on FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY — pass 'true'/'false' with IN instead.",
        +          "type": "string"
        +        },
        +        "values": {
        +          "description": "One or more filter values. Multiple values are OR-combined within the same field, AND across different fields. For FILTER_FIELD_SENIORITY use stored values 'Owner/CXO', 'VP', 'DIRECTOR', 'MANAGER', 'IC' (OWNER_CXO alias accepted). For FILTER_FIELD_STRENGTH use: 'CONFIRMED', 'STRONG', 'LESS_LIKELY', 'UNLIKELY'. For FILTER_FIELD_CATEGORY use category UUIDs resolved from get_workspace_categories (filter to SUPER_CONNECTORS, match by label, use id). For FILTER_FIELD_RELATIONSHIP_PATH_TYPE use RelationshipPathType enum names as strings — User–Contact: 'LINKEDIN_CONNECTION', 'WORK_OVERLAP', 'EDUCATION_OVERLAP', 'CALENDAR_EVENT', 'SELF_DECLARED_CONTACT', 'SELF_DECLARED_CONTACT_DONT_KNOW', 'SUPER_CONNECTOR_APPROVED', 'SUPER_CONNECTOR_DECLINED'; User–Account: 'BOARD_MEMBER', 'COMMON_BOARD_HOP', 'ADVISOR', 'LEADERSHIP', 'EMPLOYEE', 'INVESTOR', 'ACCOUNT_ALUMNI', 'SELF_DECLARED_ACCOUNT', 'SELF_DECLARED_ACCOUNT_DONT_KNOW'; Company–Account: 'COMMON_INVESTOR', 'COMMON_INVESTOR_HOP', 'PORTFOLIO'; Contact–Account: 'COMPANY_ALUMNI'; Account insight: 'ACCOUNT_INSIGHT_BOARD_ADVISOR', 'ACCOUNT_INSIGHT_BOARD_ADVISOR_VIA_CONTACT'. For FILTER_FIELD_CONFIDENCE use: 'High', 'Medium', 'Low'. For FILTER_FIELD_INTRO_VALUE use: 'High', 'Medium', 'Low'. For FILTER_FIELD_SOURCE_ACCOUNT_ID/FILTER_FIELD_SOURCE_CONTACT_ID use UUIDs (resolve via search_accounts_with_filters or search_contacts first). For FILTER_FIELD_ACCOUNT_REFERENCE_ID pass CRM record IDs as-is (e.g. Salesforce '001xx000003DGbQAAW') — exact match, no UUID resolution needed. For FILTER_FIELD_ACCOUNT_ICP use: 'MATCH', 'NO_MATCH', 'NO_DATA', 'NO_ICP_DEFINED', 'PRE_MATCH', or the sentinel 'null' to match accounts with no ICP value set. Person-name filters (FILTER_FIELD_SUPER_CONNECTOR_NAME, FILTER_FIELD_CONTACT_NAME, FILTER_FIELD_ACCOUNT_OWNER_NAME, FILTER_FIELD_SOURCE_ACCOUNT_NAME, FILTER_FIELD_SOURCE_CONTACT_NAME): pass ONE first or last name token per value — never a full name like 'Jane Doe' or 'Garuda Ventures' as a single string, which silently returns zero results. Prefer ID-based filters when UUIDs are known.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
  5. 3 tool updates
    • Changedsearch_contacts1 field changed
      • changedInput schema / properties / page_number / default
        Previous value: -0New value: +1
    • Removedsearch_users
    • Changedsearch_workspace_members1 field changed
      • changedInput schema / properties / filter_groups / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "properties": {
        -        "criteria": {
        -          "description": "One or more filter conditions. Each entry is {field: <enum>, operator: <enum>, values: [<strings>]}. At least one criterion required per group. Example by role: [{field: 'WORKSPACE_MEMBER_FILTER_FIELD_ROLE', operator: 'WORKSPACE_MEMBER_FILTER_OPERATOR_IN', values: ['ADMIN']}].",
        -          "items": {
        -            "properties": {
        -              "field": {
        -                "description": "Enum. The member attribute to filter on. Must pair with a compatible operator. Primary filters: WORKSPACE_MEMBER_FILTER_FIELD_NAME→CONTAINS or EQUALS | WORKSPACE_MEMBER_FILTER_FIELD_ROLE→IN | WORKSPACE_MEMBER_FILTER_FIELD_EMAIL→CONTAINS or EQUALS. Also: USER_ID→EQUALS | LINKEDIN_ID→CONTAINS or EQUALS | CREATED_AT→GTE or LTE | consent fields→IN | TITLE→REGEX.",
        -                "oneOf": [
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_ROLE",
        -                    "description": "Workspace role assignment. Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_IN only. Values: 'OWNER', 'ADMIN', 'SUPER_CONNECTOR', 'SUPER_CONNECTOR_ADMIN', 'REQUESTER', 'TECHNICAL_ADMIN'. Example: IN ['SUPER_CONNECTOR']. Member matches if ANY of their roles is in the list.",
        -                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_ROLE"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_CREATED_AT",
        -                    "description": "When the member joined. Operators: WORKSPACE_MEMBER_FILTER_OPERATOR_GTE (on/after) or WORKSPACE_MEMBER_FILTER_OPERATOR_LTE (on/before). Value: ISO-8601 datetime e.g. ['2024-06-01T00:00:00Z'].",
        -                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_CREATED_AT"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_EMAIL",
        -                    "description": "Email address. Operators: WORKSPACE_MEMBER_FILTER_OPERATOR_CONTAINS (partial/domain, e.g. ['@acme.com']) or WORKSPACE_MEMBER_FILTER_OPERATOR_EQUALS (exact, e.g. ['jane@acme.com']). Case-insensitive.",
        -                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_EMAIL"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_NAME",
        -                    "description": "Member first or last name. Operators: WORKSPACE_MEMBER_FILTER_OPERATOR_CONTAINS (partial, e.g. ['smith']) or WORKSPACE_MEMBER_FILTER_OPERATOR_EQUALS (exact full name, e.g. ['John Smith']). Case-insensitive.",
        -                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_NAME"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_USER_ID",
        -                    "description": "Platform user UUID. Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_EQUALS only — IN is NOT valid for this field. Example: EQUALS ['550e8400-e29b-41d4-a716-446655440000']. To match multiple user IDs, add one EQUALS criterion per ID inside a WORKSPACE_MEMBER_FILTER_LOGIC_OR filter group, not a single IN criterion.",
        -                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_USER_ID"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_LINKEDIN_ID",
        -                    "description": "LinkedIn profile ID or URL. Operators: WORKSPACE_MEMBER_FILTER_OPERATOR_CONTAINS or WORKSPACE_MEMBER_FILTER_OPERATOR_EQUALS. Example CONTAINS: ['linkedin.com/in/johndoe'].",
        -                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_LINKEDIN_ID"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_WHATSAPP_CONSENT",
        -                    "description": "WhatsApp consent. Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_IN only. Values: 'WHATSAPP_CONSENT_PENDING', 'WHATSAPP_CONSENT_GRANTED', 'WHATSAPP_CONSENT_DENIED'.",
        -                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_WHATSAPP_CONSENT"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_SUPER_CONNECTOR_OPT_IN",
        -                    "description": "Super Connector opt-in status. Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_IN only. Values: 'SUPER_CONNECTOR_OPT_IN_GRANTED', 'SUPER_CONNECTOR_OPT_IN_DENIED'.",
        -                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_SUPER_CONNECTOR_OPT_IN"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_CONNECTION_CONSENT",
        -                    "description": "LinkedIn connection-sharing consent. Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_IN only. Values: 'CONNECTION_CONSENT_PENDING', 'CONNECTION_CONSENT_GRANTED', 'CONNECTION_CONSENT_DENIED'.",
        -                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_CONNECTION_CONSENT"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_SC_ONBOARDING_STATUS",
        -                    "description": "Super Connector onboarding stage. Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_IN only. Values: 'SC_ONBOARDING_NOT_STARTED', 'SC_ONBOARDING_IN_PROGRESS', 'SC_ONBOARDING_COMPLETED'.",
        -                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_SC_ONBOARDING_STATUS"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_CATEGORY",
        -                    "description": "Category tag(s) assigned to the member. Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_IN only. Pass one or more WorkspaceMemberCategoryName display values — the complete set is 'Leadership', 'Board', 'Advisors', 'Customers', 'Employees', 'Alumni', 'Investors', 'Others', 'Power User', 'Partners'. Matched exactly and case-sensitively; anything else returns no rows. Member matches if ANY of their categories is in the list. No UUID lookup needed.",
        -                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_CATEGORY"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_LOCATION",
        -                    "description": "Location of the workspace member. Matched case-insensitively against city, country, or ISO country code (e.g. 'US', 'San Francisco', 'United States'). Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_IN. Multiple values are OR-combined.",
        -                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_LOCATION"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_TAG",
        -                    "description": "Workspace-defined tags assigned to the member. Values are tag UUIDs from Tagging.ListTags, not names. Operators: WORKSPACE_MEMBER_FILTER_OPERATOR_IN (member carries ANY of the given tags) or WORKSPACE_MEMBER_FILTER_OPERATOR_NOT_IN (member carries NONE of the given tags). Example: IN ['dd491a85-3563-408d-bb2e-d9a4ee7ddda9'].",
        -                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_TAG"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_TITLE",
        -                    "description": "Member's current job title(s), enriched from profile_data. Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_REGEX only. Pass exactly one Postgres regex pattern, e.g. ['(?i)^VP.*Sales'] for a case-insensitive prefix match. Only current employment is searched — a member whose title changed and is no longer current will not match on the old title.",
        -                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_TITLE"
        -                  }
        -                ]
        -              },
        -              "operator": {
        -                "description": "Enum. Comparison operator — must be valid for the chosen field. IN→ROLE, CATEGORY, TAG, consent fields. NOT_IN→TAG only. CONTAINS→NAME, EMAIL, LINKEDIN_ID. EQUALS→NAME, EMAIL, USER_ID, LINKEDIN_ID. GTE/LTE→CREATED_AT only. REGEX→TITLE only. Wrong pair returns no results or an error.",
        -                "oneOf": [
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_OPERATOR_IN",
        -                    "description": "Value is in the provided list (any match). Valid fields: WORKSPACE_MEMBER_FILTER_FIELD_ROLE ('OWNER', 'ADMIN', 'SUPER_CONNECTOR', etc.), WORKSPACE_MEMBER_FILTER_FIELD_CATEGORY (display names e.g. 'Investors', 'Board'), WORKSPACE_MEMBER_FILTER_FIELD_TAG (tag UUIDs), and consent fields. Pass one or more exact strings in values.",
        -                    "title": "WORKSPACE_MEMBER_FILTER_OPERATOR_IN"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_OPERATOR_CONTAINS",
        -                    "description": "Case-insensitive substring match. Valid fields: WORKSPACE_MEMBER_FILTER_FIELD_NAME, WORKSPACE_MEMBER_FILTER_FIELD_EMAIL, WORKSPACE_MEMBER_FILTER_FIELD_LINKEDIN_ID. Pass exactly one string e.g. ['smith'] or ['@acme.com'].",
        -                    "title": "WORKSPACE_MEMBER_FILTER_OPERATOR_CONTAINS"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_OPERATOR_GTE",
        -                    "description": "Greater than or equal (date). Valid field: WORKSPACE_MEMBER_FILTER_FIELD_CREATED_AT only. Pass one ISO-8601 datetime e.g. ['2024-01-01T00:00:00Z'].",
        -                    "title": "WORKSPACE_MEMBER_FILTER_OPERATOR_GTE"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_OPERATOR_LTE",
        -                    "description": "Less than or equal (date). Valid field: WORKSPACE_MEMBER_FILTER_FIELD_CREATED_AT only. Pass one ISO-8601 datetime.",
        -                    "title": "WORKSPACE_MEMBER_FILTER_OPERATOR_LTE"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_OPERATOR_EQUALS",
        -                    "description": "Exact match (case-insensitive for text). Valid fields: WORKSPACE_MEMBER_FILTER_FIELD_NAME, WORKSPACE_MEMBER_FILTER_FIELD_EMAIL, WORKSPACE_MEMBER_FILTER_FIELD_USER_ID, WORKSPACE_MEMBER_FILTER_FIELD_LINKEDIN_ID. Pass exactly one value.",
        -                    "title": "WORKSPACE_MEMBER_FILTER_OPERATOR_EQUALS"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_OPERATOR_NOT_IN",
        -                    "description": "Value is NOT in the provided list (exclusion). Valid field: WORKSPACE_MEMBER_FILTER_FIELD_TAG only. Member matches if none of their tags are in the list. Pass one or more tag UUIDs.",
        -                    "title": "WORKSPACE_MEMBER_FILTER_OPERATOR_NOT_IN"
        -                  },
        -                  {
        -                    "const": "WORKSPACE_MEMBER_FILTER_OPERATOR_REGEX",
        -                    "description": "Case-insensitive-capable Postgres regular expression match (use an inline '(?i)' flag for case-insensitivity). Valid field: WORKSPACE_MEMBER_FILTER_FIELD_TITLE only. Pass exactly one pattern, e.g. ['(?i)^VP.*Sales'] or ['(?i)(chief|head).*(sales|revenue)'].",
        -                    "title": "WORKSPACE_MEMBER_FILTER_OPERATOR_REGEX"
        -                  }
        -                ]
        -              },
        -              "values": {
        -                "description": "Filter value(s) as a JSON array of strings — NEVER a bare string. NAME CONTAINS→['partial']; NAME EQUALS→['John Smith']; ROLE IN→['ADMIN'] or ['SUPER_CONNECTOR','SUPER_CONNECTOR_ADMIN']; EMAIL CONTAINS→['@domain.com']; EMAIL EQUALS→['user@company.com']; USER_ID EQUALS→['<uuid>']; LINKEDIN_ID CONTAINS→['linkedin.com/in/handle']; CREATED_AT GTE/LTE→['2024-01-01T00:00:00Z']; TITLE REGEX→['(?i)^VP.*Sales']. Role and consent enum strings are case-sensitive.",
        -                "items": {
        -                  "type": "string"
        -                },
        -                "type": "array"
        -              }
        -            },
        -            "type": "object"
        -          },
        -          "type": "array"
        -        },
        -        "logic": {
        -          "description": "Enum. Combines criteria within this group. WORKSPACE_MEMBER_FILTER_LOGIC_AND = every criterion must match. WORKSPACE_MEMBER_FILTER_LOGIC_OR = at least one criterion must match. Defaults to AND if omitted. Multiple filter_groups are always AND-combined.",
        -          "oneOf": [
        -            {
        -              "const": "WORKSPACE_MEMBER_FILTER_LOGIC_AND",
        -              "description": "Intersection — all criteria must match. Example: ROLE IN ['ADMIN'] AND NAME CONTAINS ['john'] in one group.",
        -              "title": "WORKSPACE_MEMBER_FILTER_LOGIC_AND"
        -            },
        -            {
        -              "const": "WORKSPACE_MEMBER_FILTER_LOGIC_OR",
        -              "description": "Union — any criterion may match. Example: NAME CONTAINS ['john'] OR EMAIL CONTAINS ['john'] in one group.",
        -              "title": "WORKSPACE_MEMBER_FILTER_LOGIC_OR"
        -            }
        -          ]
        -        }
        -      },
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "properties": {
        +        "criteria": {
        +          "description": "One or more filter conditions. Each entry is {field: <enum>, operator: <enum>, values: [<strings>]}. At least one criterion required per group. Example by role: [{field: 'WORKSPACE_MEMBER_FILTER_FIELD_ROLE', operator: 'WORKSPACE_MEMBER_FILTER_OPERATOR_IN', values: ['ADMIN']}].",
        +          "items": {
        +            "properties": {
        +              "field": {
        +                "description": "Enum. The member attribute to filter on. Must pair with a compatible operator. Primary filters: WORKSPACE_MEMBER_FILTER_FIELD_NAME→CONTAINS or EQUALS | WORKSPACE_MEMBER_FILTER_FIELD_ROLE→IN | WORKSPACE_MEMBER_FILTER_FIELD_EMAIL→CONTAINS or EQUALS. Also: USER_ID→EQUALS | LINKEDIN_ID→CONTAINS or EQUALS | CREATED_AT→GTE or LTE | consent fields→IN | TITLE→REGEX.",
        +                "oneOf": [
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_ROLE",
        +                    "description": "Workspace role assignment. Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_IN only. Values: 'OWNER', 'ADMIN', 'SUPER_CONNECTOR', 'SUPER_CONNECTOR_ADMIN', 'REQUESTER', 'TECHNICAL_ADMIN'. Example: IN ['SUPER_CONNECTOR']. Member matches if ANY of their roles is in the list.",
        +                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_ROLE"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_CREATED_AT",
        +                    "description": "When the member joined. Operators: WORKSPACE_MEMBER_FILTER_OPERATOR_GTE (on/after) or WORKSPACE_MEMBER_FILTER_OPERATOR_LTE (on/before). Value: ISO-8601 datetime e.g. ['2024-06-01T00:00:00Z'].",
        +                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_CREATED_AT"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_EMAIL",
        +                    "description": "Email address. Operators: WORKSPACE_MEMBER_FILTER_OPERATOR_CONTAINS (partial/domain, e.g. ['@acme.com']) WORKSPACE_MEMBER_FILTER_OPERATOR_EQUALS (exact, e.g. ['jane@acme.com']) or WORKSPACE_MEMBER_FILTER_OPERATOR_IN (exact, any of several, e.g. ['jane@acme.com', 'bob@acme.com']). Case-insensitive.",
        +                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_EMAIL"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_NAME",
        +                    "description": "Member first or last name. Operators: WORKSPACE_MEMBER_FILTER_OPERATOR_CONTAINS (partial, e.g. ['smith']) or WORKSPACE_MEMBER_FILTER_OPERATOR_EQUALS (exact full name, e.g. ['John Smith']). Case-insensitive.",
        +                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_NAME"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_USER_ID",
        +                    "description": "Platform user UUID. Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_EQUALS only — IN is NOT valid for this field. Example: EQUALS ['550e8400-e29b-41d4-a716-446655440000']. To match multiple user IDs, add one EQUALS criterion per ID inside a WORKSPACE_MEMBER_FILTER_LOGIC_OR filter group, not a single IN criterion.",
        +                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_USER_ID"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_LINKEDIN_ID",
        +                    "description": "LinkedIn profile ID or URL. Operators: WORKSPACE_MEMBER_FILTER_OPERATOR_CONTAINS or WORKSPACE_MEMBER_FILTER_OPERATOR_EQUALS. Example CONTAINS: ['linkedin.com/in/johndoe'].",
        +                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_LINKEDIN_ID"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_WHATSAPP_CONSENT",
        +                    "description": "WhatsApp consent. Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_IN only. Values: 'WHATSAPP_CONSENT_PENDING', 'WHATSAPP_CONSENT_GRANTED', 'WHATSAPP_CONSENT_DENIED'.",
        +                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_WHATSAPP_CONSENT"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_SUPER_CONNECTOR_OPT_IN",
        +                    "description": "Super Connector opt-in status. Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_IN only. Values: 'SUPER_CONNECTOR_OPT_IN_GRANTED', 'SUPER_CONNECTOR_OPT_IN_DENIED'.",
        +                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_SUPER_CONNECTOR_OPT_IN"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_CONNECTION_CONSENT",
        +                    "description": "LinkedIn connection-sharing consent. Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_IN only. Values: 'CONNECTION_CONSENT_PENDING', 'CONNECTION_CONSENT_GRANTED', 'CONNECTION_CONSENT_DENIED'.",
        +                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_CONNECTION_CONSENT"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_SC_ONBOARDING_STATUS",
        +                    "description": "Super Connector onboarding stage. Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_IN only. Values: 'SC_ONBOARDING_NOT_STARTED', 'SC_ONBOARDING_IN_PROGRESS', 'SC_ONBOARDING_COMPLETED'.",
        +                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_SC_ONBOARDING_STATUS"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_CATEGORY",
        +                    "description": "Category tag(s) assigned to the member. Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_IN only. Pass one or more WorkspaceMemberCategoryName display values — the complete set is 'Leadership', 'Board', 'Advisors', 'Customers', 'Employees', 'Alumni', 'Investors', 'Others', 'Power User', 'Partners'. Matched exactly and case-sensitively; anything else returns no rows. Member matches if ANY of their categories is in the list. No UUID lookup needed.",
        +                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_CATEGORY"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_LOCATION",
        +                    "description": "Location of the workspace member. Matched case-insensitively against city, country, or ISO country code (e.g. 'US', 'San Francisco', 'United States'). Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_IN. Multiple values are OR-combined.",
        +                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_LOCATION"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_TAG",
        +                    "description": "Workspace-defined tags assigned to the member. Values are tag UUIDs from Tagging.ListTags, not names. Operators: WORKSPACE_MEMBER_FILTER_OPERATOR_IN (member carries ANY of the given tags) or WORKSPACE_MEMBER_FILTER_OPERATOR_NOT_IN (member carries NONE of the given tags). Example: IN ['dd491a85-3563-408d-bb2e-d9a4ee7ddda9'].",
        +                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_TAG"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_FIELD_TITLE",
        +                    "description": "Member's current job title(s), enriched from profile_data. Operator: WORKSPACE_MEMBER_FILTER_OPERATOR_REGEX only. Pass exactly one Postgres regex pattern, e.g. ['(?i)^VP.*Sales'] for a case-insensitive prefix match. Only current employment is searched — a member whose title changed and is no longer current will not match on the old title.",
        +                    "title": "WORKSPACE_MEMBER_FILTER_FIELD_TITLE"
        +                  }
        +                ]
        +              },
        +              "operator": {
        +                "description": "Enum. Comparison operator — must be valid for the chosen field. IN→ROLE, CATEGORY, TAG, consent fields. NOT_IN→TAG only. CONTAINS→NAME, EMAIL, LINKEDIN_ID. EQUALS→NAME, EMAIL, USER_ID, LINKEDIN_ID. GTE/LTE→CREATED_AT only. REGEX→TITLE only. Wrong pair returns no results or an error.",
        +                "oneOf": [
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_OPERATOR_IN",
        +                    "description": "Value is in the provided list (any match). Valid fields: WORKSPACE_MEMBER_FILTER_FIELD_ROLE ('OWNER', 'ADMIN', 'SUPER_CONNECTOR', etc.), WORKSPACE_MEMBER_FILTER_FIELD_CATEGORY (display names e.g. 'Investors', 'Board'), WORKSPACE_MEMBER_FILTER_FIELD_TAG (tag UUIDs), WORKSPACE_MEMBER_FILTER_FIELD_EMAIL (exact addresses, case-insensitive), and consent fields. Pass one or more exact strings in values.",
        +                    "title": "WORKSPACE_MEMBER_FILTER_OPERATOR_IN"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_OPERATOR_CONTAINS",
        +                    "description": "Case-insensitive substring match. Valid fields: WORKSPACE_MEMBER_FILTER_FIELD_NAME, WORKSPACE_MEMBER_FILTER_FIELD_EMAIL, WORKSPACE_MEMBER_FILTER_FIELD_LINKEDIN_ID. Pass exactly one string e.g. ['smith'] or ['@acme.com'].",
        +                    "title": "WORKSPACE_MEMBER_FILTER_OPERATOR_CONTAINS"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_OPERATOR_GTE",
        +                    "description": "Greater than or equal (date). Valid field: WORKSPACE_MEMBER_FILTER_FIELD_CREATED_AT only. Pass one ISO-8601 datetime e.g. ['2024-01-01T00:00:00Z'].",
        +                    "title": "WORKSPACE_MEMBER_FILTER_OPERATOR_GTE"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_OPERATOR_LTE",
        +                    "description": "Less than or equal (date). Valid field: WORKSPACE_MEMBER_FILTER_FIELD_CREATED_AT only. Pass one ISO-8601 datetime.",
        +                    "title": "WORKSPACE_MEMBER_FILTER_OPERATOR_LTE"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_OPERATOR_EQUALS",
        +                    "description": "Exact match (case-insensitive for text). Valid fields: WORKSPACE_MEMBER_FILTER_FIELD_NAME, WORKSPACE_MEMBER_FILTER_FIELD_EMAIL, WORKSPACE_MEMBER_FILTER_FIELD_USER_ID, WORKSPACE_MEMBER_FILTER_FIELD_LINKEDIN_ID. Pass exactly one value.",
        +                    "title": "WORKSPACE_MEMBER_FILTER_OPERATOR_EQUALS"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_OPERATOR_NOT_IN",
        +                    "description": "Value is NOT in the provided list (exclusion). Valid field: WORKSPACE_MEMBER_FILTER_FIELD_TAG only. Member matches if none of their tags are in the list. Pass one or more tag UUIDs.",
        +                    "title": "WORKSPACE_MEMBER_FILTER_OPERATOR_NOT_IN"
        +                  },
        +                  {
        +                    "const": "WORKSPACE_MEMBER_FILTER_OPERATOR_REGEX",
        +                    "description": "Case-insensitive-capable Postgres regular expression match (use an inline '(?i)' flag for case-insensitivity). Valid field: WORKSPACE_MEMBER_FILTER_FIELD_TITLE only. Pass exactly one pattern, e.g. ['(?i)^VP.*Sales'] or ['(?i)(chief|head).*(sales|revenue)'].",
        +                    "title": "WORKSPACE_MEMBER_FILTER_OPERATOR_REGEX"
        +                  }
        +                ]
        +              },
        +              "values": {
        +                "description": "Filter value(s) as a JSON array of strings — NEVER a bare string. NAME CONTAINS→['partial']; NAME EQUALS→['John Smith']; ROLE IN→['ADMIN'] or ['SUPER_CONNECTOR','SUPER_CONNECTOR_ADMIN']; EMAIL CONTAINS→['@domain.com']; EMAIL EQUALS→['user@company.com']; USER_ID EQUALS→['<uuid>']; LINKEDIN_ID CONTAINS→['linkedin.com/in/handle']; CREATED_AT GTE/LTE→['2024-01-01T00:00:00Z']; TITLE REGEX→['(?i)^VP.*Sales']. Role and consent enum strings are case-sensitive.",
        +                "items": {
        +                  "type": "string"
        +                },
        +                "type": "array"
        +              }
        +            },
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "logic": {
        +          "description": "Enum. Combines criteria within this group. WORKSPACE_MEMBER_FILTER_LOGIC_AND = every criterion must match. WORKSPACE_MEMBER_FILTER_LOGIC_OR = at least one criterion must match. Defaults to AND if omitted. Multiple filter_groups are always AND-combined.",
        +          "oneOf": [
        +            {
        +              "const": "WORKSPACE_MEMBER_FILTER_LOGIC_AND",
        +              "description": "Intersection — all criteria must match. Example: ROLE IN ['ADMIN'] AND NAME CONTAINS ['john'] in one group.",
        +              "title": "WORKSPACE_MEMBER_FILTER_LOGIC_AND"
        +            },
        +            {
        +              "const": "WORKSPACE_MEMBER_FILTER_LOGIC_OR",
        +              "description": "Union — any criterion may match. Example: NAME CONTAINS ['john'] OR EMAIL CONTAINS ['john'] in one group.",
        +              "title": "WORKSPACE_MEMBER_FILTER_LOGIC_OR"
        +            }
        +          ]
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
  6. 3 tool updates
    • Changedget_unique_filter_options1 field changed
      • changedInput schema / properties / filters / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "properties": {
        -        "fallback_fields": {
        -          "items": {
        -            "oneOf": [
        -              {
        -                "const": "FILTER_FIELD_SENIORITY",
        -                "title": "FILTER_FIELD_SENIORITY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_LOCATION",
        -                "title": "FILTER_FIELD_LOCATION"
        -              },
        -              {
        -                "const": "FILTER_FIELD_STRENGTH",
        -                "title": "FILTER_FIELD_STRENGTH"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CATEGORY",
        -                "title": "FILTER_FIELD_CATEGORY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONNECTOR_ID",
        -                "title": "FILTER_FIELD_CONNECTOR_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY",
        -                "title": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE",
        -                "title": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_DEPARTMENT",
        -                "title": "FILTER_FIELD_DEPARTMENT"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OWNER_ID",
        -                "title": "FILTER_FIELD_ACCOUNT_OWNER_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_INDUSTRY",
        -                "title": "FILTER_FIELD_ACCOUNT_INDUSTRY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_COUNTRY",
        -                "title": "FILTER_FIELD_ACCOUNT_COUNTRY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE",
        -                "title": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONFIDENCE",
        -                "title": "FILTER_FIELD_CONFIDENCE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_INTRO_VALUE",
        -                "title": "FILTER_FIELD_INTRO_VALUE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_ID",
        -                "title": "FILTER_FIELD_ACCOUNT_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_NAME",
        -                "title": "FILTER_FIELD_ACCOUNT_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_DOMAIN",
        -                "title": "FILTER_FIELD_ACCOUNT_DOMAIN"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OWNER_NAME",
        -                "title": "FILTER_FIELD_ACCOUNT_OWNER_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_ID",
        -                "title": "FILTER_FIELD_CONTACT_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_NAME",
        -                "title": "FILTER_FIELD_CONTACT_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_EMAIL",
        -                "title": "FILTER_FIELD_CONTACT_EMAIL"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_TITLE",
        -                "title": "FILTER_FIELD_CONTACT_TITLE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_COMPANY_NAME",
        -                "title": "FILTER_FIELD_CONTACT_COMPANY_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SUPER_CONNECTOR_NAME",
        -                "title": "FILTER_FIELD_SUPER_CONNECTOR_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL",
        -                "title": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_ACCOUNT_ID",
        -                "title": "FILTER_FIELD_SOURCE_ACCOUNT_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_ACCOUNT_NAME",
        -                "title": "FILTER_FIELD_SOURCE_ACCOUNT_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN",
        -                "title": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_CONTACT_ID",
        -                "title": "FILTER_FIELD_SOURCE_CONTACT_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_CONTACT_NAME",
        -                "title": "FILTER_FIELD_SOURCE_CONTACT_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_ICP",
        -                "title": "FILTER_FIELD_ACCOUNT_ICP"
        -              },
        -              {
        -                "const": "FILTER_FIELD_TITLE_PERSONA",
        -                "title": "FILTER_FIELD_TITLE_PERSONA"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_CATEGORY",
        -                "title": "FILTER_FIELD_ACCOUNT_CATEGORY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONNECTOR_LOCATION",
        -                "title": "FILTER_FIELD_CONNECTOR_LOCATION"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY",
        -                "title": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OFFICE_STATE",
        -                "title": "FILTER_FIELD_ACCOUNT_OFFICE_STATE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OFFICE_CITY",
        -                "title": "FILTER_FIELD_ACCOUNT_OFFICE_CITY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_REFERENCE_ID",
        -                "title": "FILTER_FIELD_ACCOUNT_REFERENCE_ID"
        -              }
        -            ]
        -          },
        -          "type": "array"
        -        },
        -        "field": {
        -          "description": "Which attribute to filter on.",
        -          "oneOf": [
        -            {
        -              "const": "FILTER_FIELD_SENIORITY",
        -              "description": "Target contact seniority level. Use IN operator. Stored values: 'Owner/CXO', 'VP', 'DIRECTOR', 'MANAGER', 'IC'. Documented alias OWNER_CXO is also accepted. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_SENIORITY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_LOCATION",
        -              "description": "Target contact's location (country code or location name string). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_LOCATION"
        -            },
        -            {
        -              "const": "FILTER_FIELD_STRENGTH",
        -              "description": "Relationship strength between the connector and target contact. Valid values: 'CONFIRMED', 'STRONG', 'LESS_LIKELY', 'UNLIKELY'. Prefer CONFIRMED and STRONG when looking for high-quality intro paths.",
        -              "title": "FILTER_FIELD_STRENGTH"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CATEGORY",
        -              "description": "Relationship category describing who the super connector is in relation to the company (e.g. Investor, Advisor, Board Member, Customer, Champion, Alumni, Leadership). IMPORTANT: this is NOT the same as seniority (how senior the contact is) or strength (how strong the tie is). Trigger words: investor(s), customer(s), board member(s), advisor(s), champion(s), alumni, leadership, partner(s). Values must be category UUIDs — NOT label strings. Resolution flow: (1) call get_workspace_categories, (2) filter to relationship_type SUPER_CONNECTORS and is_deleted false, (3) match user intent to closest label(s) — OR all plausible matches, (4) use those id UUIDs as filter values.",
        -              "title": "FILTER_FIELD_CATEGORY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONNECTOR_ID",
        -              "description": "RECOMMENDED over FILTER_FIELD_SUPER_CONNECTOR_NAME when the connector user_id is known. Exact match on one or more connector user UUIDs (Keycloak user IDs). Resolve connector names via search_workspace_members first to avoid silent zero-result failures from name prefix matching.",
        -              "title": "FILTER_FIELD_CONNECTOR_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY",
        -              "description": "Include or exclude contacts who have left the tracked company. Values: 'true' or 'false'.",
        -              "title": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE",
        -              "description": "One or more path type evidence signals used to establish the relationship. Use string names from the RelationshipPathType enum. User–Contact: 'LINKEDIN_CONNECTION' (direct LinkedIn connection), 'WORK_OVERLAP' (same company same time), 'EDUCATION_OVERLAP' (same school), 'CALENDAR_EVENT' (meetings on record), 'SELF_DECLARED_CONTACT' (connector declared they know the contact), 'SELF_DECLARED_CONTACT_DONT_KNOW' (connector declared they do not know the contact), 'SUPER_CONNECTOR_APPROVED' (super connector approved the path), 'SUPER_CONNECTOR_DECLINED' (super connector declined). User–Account: 'BOARD_MEMBER', 'COMMON_BOARD_HOP' (P1 → P2 via shared board seat), 'ADVISOR', 'LEADERSHIP', 'EMPLOYEE', 'INVESTOR', 'ACCOUNT_ALUMNI' (connector previously worked at target account), 'SELF_DECLARED_ACCOUNT' (connector declared a relationship to the account), 'SELF_DECLARED_ACCOUNT_DONT_KNOW'. Company–Account: 'COMMON_INVESTOR', 'COMMON_INVESTOR_HOP', 'PORTFOLIO' (a portfolio company of this workspace's investor firm). Contact–Account: 'COMPANY_ALUMNI' (worked at same company at different times). Account insight: 'ACCOUNT_INSIGHT_BOARD_ADVISOR', 'ACCOUNT_INSIGHT_BOARD_ADVISOR_VIA_CONTACT'. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_DEPARTMENT",
        -              "description": "Target contact's department (free-text match). Values are department name strings (e.g. 'Engineering', 'Sales', 'Marketing'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_DEPARTMENT"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OWNER_ID",
        -              "description": "RECOMMENDED over FILTER_FIELD_ACCOUNT_OWNER_NAME when the owner user_id is known. Exact match on CRM account owner user UUID (Keycloak user ID). Resolve owner names via search_workspace_members first.",
        -              "title": "FILTER_FIELD_ACCOUNT_OWNER_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_INDUSTRY",
        -              "description": "Filter by target account industry. Values are industry name strings (e.g. 'Software', 'Financial Services'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_INDUSTRY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_COUNTRY",
        -              "description": "Filter by target account's country. Values are country name strings (e.g. 'United States', 'Germany'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_COUNTRY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE",
        -              "description": "Filter by target account employee headcount range. Valid values: '1', '2-10', '11-50', '51-200', '201-500', '501-1000', '1001-5000', '5001-10000', '10001+'. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONFIDENCE",
        -              "description": "GPT scoring confidence level for the relationship assessment. Valid values: 'High', 'Medium', 'Low'. Use 'High' to restrict results to relationships the scoring model is most certain about. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONFIDENCE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_INTRO_VALUE",
        -              "description": "Assessed value of requesting an introduction through this relationship path. Valid values: 'High', 'Medium', 'Low'. Determined by the Boomerang scoring engine based on strength, seniority, and recency signals. Use 'High' to prioritize the best intro opportunities. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_INTRO_VALUE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_ID",
        -              "description": "Filter by CRM account UUID. Values are account ID strings. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_NAME",
        -              "description": "Filter by target account name (prefix match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_DOMAIN",
        -              "description": "Filter by target account website domain (e.g. 'acme.com'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_DOMAIN"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OWNER_NAME",
        -              "description": "Filter by CRM account owner first OR last name, prefix match on ONE name part only (e.g. [\"John\"] or [\"Smith\"] — NOT \"John Smith\" as one string, which silently returns zero results). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_ACCOUNT_OWNER_ID when user_id is known (resolve via search_workspace_members).",
        -              "title": "FILTER_FIELD_ACCOUNT_OWNER_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_ID",
        -              "description": "RECOMMENDED over FILTER_FIELD_CONTACT_NAME when the contact UUID is known. Exact match on target contact UUID. Resolve contact names via search_contacts first.",
        -              "title": "FILTER_FIELD_CONTACT_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_NAME",
        -              "description": "Filter by target contact first OR last name, prefix match on ONE name part only (e.g. [\"Jane\"] or [\"Doe\"] — NOT \"Jane Doe\" as one string, which silently returns zero results). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_CONTACT_ID when contact UUID is known (resolve via search_contacts).",
        -              "title": "FILTER_FIELD_CONTACT_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_EMAIL",
        -              "description": "Filter by target contact email address (prefix or exact match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONTACT_EMAIL"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_TITLE",
        -              "description": "Filter by target contact job title (prefix match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONTACT_TITLE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_COMPANY_NAME",
        -              "description": "Filter by the company name associated with the target contact — typically the target account name (prefix match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONTACT_COMPANY_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SUPER_CONNECTOR_NAME",
        -              "description": "Filter by super connector's first OR last name, prefix match on ONE name part only (e.g. [\"Steven\"] or [\"Hagler\"] — NOT \"Steven Hagler\" as a single combined string, which will silently return zero results rather than an error). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_CONNECTOR_ID instead whenever the connector's user_id is already known (e.g. from search_workspace_members) — it does an exact match and avoids the silent zero-result failure mode of name-based prefix matching, especially for people with common or multi-word names.",
        -              "title": "FILTER_FIELD_SUPER_CONNECTOR_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL",
        -              "description": "Filter by super connector email address (prefix or exact match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_ACCOUNT_ID",
        -              "description": "Filter by source company UUID — for Account→Account path types (COMMON_INVESTOR, COMMON_BOARD_HOP, ACCOUNT_ALUMNI, SELF_DECLARED_ACCOUNT, COMMON_INVESTOR_HOP, ACCOUNT_INSIGHT_BOARD_ADVISOR, etc.) where the source node is a company, not a user. Exact match. RECOMMENDED over FILTER_FIELD_SOURCE_ACCOUNT_NAME when the account UUID is known (resolve via search_accounts_with_filters first).",
        -              "title": "FILTER_FIELD_SOURCE_ACCOUNT_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_ACCOUNT_NAME",
        -              "description": "Filter by source company name (prefix/substring match) — for Account→Account path types. Use to answer questions like 'which accounts can Garuda Ventures help reach?'. ONE name token per value recommended for broad matching. Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_SOURCE_ACCOUNT_ID when the UUID is known.",
        -              "title": "FILTER_FIELD_SOURCE_ACCOUNT_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN",
        -              "description": "Filter by source company domain (exact or prefix match) — for Account→Account path types. E.g. 'garudaventures.com'. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_CONTACT_ID",
        -              "description": "Filter by source contact UUID — for Contact→Account path types (COMPANY_ALUMNI) where the source node is a contact. Exact match. RECOMMENDED over FILTER_FIELD_SOURCE_CONTACT_NAME when the UUID is known.",
        -              "title": "FILTER_FIELD_SOURCE_CONTACT_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_CONTACT_NAME",
        -              "description": "Filter by source contact first OR last name (prefix match) — for Contact→Account path types. ONE name token per value. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_SOURCE_CONTACT_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_ICP",
        -              "description": "Filter by target account ICP (Ideal Customer Profile) match status. Valid values: 'MATCH' (account matches ICP criteria), 'NO_MATCH' (account evaluated and does not match), 'NO_DATA' (insufficient data to evaluate), 'NO_ICP_DEFINED' (workspace has no ICP configured), 'PRE_MATCH' (pending evaluation). Use the special sentinel value 'null' to match accounts where the ICP field has not been set. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_ICP"
        -            },
        -            {
        -              "const": "FILTER_FIELD_TITLE_PERSONA",
        -              "description": "Buyer persona of the target contact, matched against the contact's title. Values are persona names, NOT job titles: 'BUYING_COMMITTEE' (functional buyers and users — the workspace's buying_committee_regex), 'EXTENDED_BUYING_COMMITTEE' (procurement / finance / IT / legal approval seats — extended_buying_committee_regex), 'LEADERSHIP' (C-suite and VP-level titles from the shared taxonomy, not board members, founders or partner/principal). Multiple values are OR-combined. A persona whose regex is not configured for the workspace is ignored.",
        -              "title": "FILTER_FIELD_TITLE_PERSONA"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_CATEGORY",
        -              "description": "Filter by the target account's category — the workspace's own classification of the account, distinct from ICP. Valid values: 'CUSTOMER', 'PROSPECT', 'OPEN_OPPORTUNITY', 'CLOSED_LOST', 'CHURNED', 'PARTNER', 'INVESTOR_PORTFOLIO', 'COMPETITOR', 'OTHER'. Use the special sentinel value 'null' to match accounts that have not been categorised. Multiple values are OR-combined. Do not confuse with FILTER_FIELD_CATEGORY, which filters on the super connector's category.",
        -              "title": "FILTER_FIELD_ACCOUNT_CATEGORY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONNECTOR_LOCATION",
        -              "description": "Location of the connector (super connector), matched case-insensitively against city, country, or ISO country code (e.g. 'US', 'San Francisco', 'United States'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONNECTOR_LOCATION"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY",
        -              "title": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OFFICE_STATE",
        -              "title": "FILTER_FIELD_ACCOUNT_OFFICE_STATE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OFFICE_CITY",
        -              "title": "FILTER_FIELD_ACCOUNT_OFFICE_CITY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_REFERENCE_ID",
        -              "description": "Filter by the target account's CRM record ID — exact match on reference_id (e.g. Salesforce 18-character Account ID '001xx000003DGbQAAW', HubSpot company ID). Values are CRM IDs, NOT internal UUIDs. Use directly when the user supplies Salesforce/HubSpot IDs — do NOT call search_accounts_with_filters first to resolve them to UUIDs. Pass the id exactly as the CRM stores it: a 15-character Salesforce short id does not match the stored 18-character form, and the match is silent — wrong form returns zero rows, not an error. Only CRM-sourced accounts have a CRM id; accounts created inside Boomerang carry an internal 'BOOM-…' reference_id and never match here. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_REFERENCE_ID"
        -            }
        -          ]
        -        },
        -        "operator": {
        -          "description": "How values are matched. Omit (or 'IN') to keep only rows matching any of the values — the default. Use 'NOT_IN' (aliases: 'NOT_EQUAL_TO', 'NE') to EXCLUDE rows matching any of the values, e.g. field=FILTER_FIELD_ACCOUNT_CATEGORY, operator='NOT_IN', values=['CUSTOMER'] returns paths to accounts that are not customers. A NOT_IN filter keeps rows where the entity exists but the field has no value on record, and excludes paths that have no such entity at all — 'account category not CUSTOMER' returns only paths that target an account, never User→Contact paths. Text filters (names, titles, domains, emails) match by substring, so NOT_IN on them excludes every row CONTAINING a value, not only exact matches — 'account name not [Acme]' also drops 'Acme Holdings'. Not supported on FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY — pass 'true'/'false' with IN instead.",
        -          "type": "string"
        -        },
        -        "values": {
        -          "description": "One or more filter values. Multiple values are OR-combined within the same field, AND across different fields. For FILTER_FIELD_SENIORITY use stored values 'Owner/CXO', 'VP', 'DIRECTOR', 'MANAGER', 'IC' (OWNER_CXO alias accepted). For FILTER_FIELD_STRENGTH use: 'CONFIRMED', 'STRONG', 'LESS_LIKELY', 'UNLIKELY'. For FILTER_FIELD_CATEGORY use category UUIDs resolved from get_workspace_categories (filter to SUPER_CONNECTORS, match by label, use id). For FILTER_FIELD_RELATIONSHIP_PATH_TYPE use RelationshipPathType enum names as strings — User–Contact: 'LINKEDIN_CONNECTION', 'WORK_OVERLAP', 'EDUCATION_OVERLAP', 'CALENDAR_EVENT', 'SELF_DECLARED_CONTACT', 'SELF_DECLARED_CONTACT_DONT_KNOW', 'SUPER_CONNECTOR_APPROVED', 'SUPER_CONNECTOR_DECLINED'; User–Account: 'BOARD_MEMBER', 'COMMON_BOARD_HOP', 'ADVISOR', 'LEADERSHIP', 'EMPLOYEE', 'INVESTOR', 'ACCOUNT_ALUMNI', 'SELF_DECLARED_ACCOUNT', 'SELF_DECLARED_ACCOUNT_DONT_KNOW'; Company–Account: 'COMMON_INVESTOR', 'COMMON_INVESTOR_HOP', 'PORTFOLIO'; Contact–Account: 'COMPANY_ALUMNI'; Account insight: 'ACCOUNT_INSIGHT_BOARD_ADVISOR', 'ACCOUNT_INSIGHT_BOARD_ADVISOR_VIA_CONTACT'. For FILTER_FIELD_CONFIDENCE use: 'High', 'Medium', 'Low'. For FILTER_FIELD_INTRO_VALUE use: 'High', 'Medium', 'Low'. For FILTER_FIELD_SOURCE_ACCOUNT_ID/FILTER_FIELD_SOURCE_CONTACT_ID use UUIDs (resolve via search_accounts_with_filters or search_contacts first). For FILTER_FIELD_ACCOUNT_REFERENCE_ID pass CRM record IDs as-is (e.g. Salesforce '001xx000003DGbQAAW') — exact match, no UUID resolution needed. For FILTER_FIELD_ACCOUNT_ICP use: 'MATCH', 'NO_MATCH', 'NO_DATA', 'NO_ICP_DEFINED', 'PRE_MATCH', or the sentinel 'null' to match accounts with no ICP value set. Person-name filters (FILTER_FIELD_SUPER_CONNECTOR_NAME, FILTER_FIELD_CONTACT_NAME, FILTER_FIELD_ACCOUNT_OWNER_NAME, FILTER_FIELD_SOURCE_ACCOUNT_NAME, FILTER_FIELD_SOURCE_CONTACT_NAME): pass ONE first or last name token per value — never a full name like 'Jane Doe' or 'Garuda Ventures' as a single string, which silently returns zero results. Prefer ID-based filters when UUIDs are known.",
        -          "items": {
        -            "type": "string"
        -          },
        -          "type": "array"
        -        }
        -      },
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "properties": {
        +        "fallback_fields": {
        +          "items": {
        +            "oneOf": [
        +              {
        +                "const": "FILTER_FIELD_SENIORITY",
        +                "title": "FILTER_FIELD_SENIORITY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_LOCATION",
        +                "title": "FILTER_FIELD_LOCATION"
        +              },
        +              {
        +                "const": "FILTER_FIELD_STRENGTH",
        +                "title": "FILTER_FIELD_STRENGTH"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CATEGORY",
        +                "title": "FILTER_FIELD_CATEGORY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONNECTOR_ID",
        +                "title": "FILTER_FIELD_CONNECTOR_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY",
        +                "title": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE",
        +                "title": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_DEPARTMENT",
        +                "title": "FILTER_FIELD_DEPARTMENT"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OWNER_ID",
        +                "title": "FILTER_FIELD_ACCOUNT_OWNER_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_INDUSTRY",
        +                "title": "FILTER_FIELD_ACCOUNT_INDUSTRY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_COUNTRY",
        +                "title": "FILTER_FIELD_ACCOUNT_COUNTRY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE",
        +                "title": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONFIDENCE",
        +                "title": "FILTER_FIELD_CONFIDENCE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_INTRO_VALUE",
        +                "title": "FILTER_FIELD_INTRO_VALUE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_ID",
        +                "title": "FILTER_FIELD_ACCOUNT_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_NAME",
        +                "title": "FILTER_FIELD_ACCOUNT_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_DOMAIN",
        +                "title": "FILTER_FIELD_ACCOUNT_DOMAIN"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OWNER_NAME",
        +                "title": "FILTER_FIELD_ACCOUNT_OWNER_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_ID",
        +                "title": "FILTER_FIELD_CONTACT_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_NAME",
        +                "title": "FILTER_FIELD_CONTACT_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_EMAIL",
        +                "title": "FILTER_FIELD_CONTACT_EMAIL"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_TITLE",
        +                "title": "FILTER_FIELD_CONTACT_TITLE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_COMPANY_NAME",
        +                "title": "FILTER_FIELD_CONTACT_COMPANY_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SUPER_CONNECTOR_NAME",
        +                "title": "FILTER_FIELD_SUPER_CONNECTOR_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL",
        +                "title": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_ACCOUNT_ID",
        +                "title": "FILTER_FIELD_SOURCE_ACCOUNT_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_ACCOUNT_NAME",
        +                "title": "FILTER_FIELD_SOURCE_ACCOUNT_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN",
        +                "title": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_CONTACT_ID",
        +                "title": "FILTER_FIELD_SOURCE_CONTACT_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_CONTACT_NAME",
        +                "title": "FILTER_FIELD_SOURCE_CONTACT_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_ICP",
        +                "title": "FILTER_FIELD_ACCOUNT_ICP"
        +              },
        +              {
        +                "const": "FILTER_FIELD_TITLE_PERSONA",
        +                "title": "FILTER_FIELD_TITLE_PERSONA"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_CATEGORY",
        +                "title": "FILTER_FIELD_ACCOUNT_CATEGORY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONNECTOR_LOCATION",
        +                "title": "FILTER_FIELD_CONNECTOR_LOCATION"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY",
        +                "title": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OFFICE_STATE",
        +                "title": "FILTER_FIELD_ACCOUNT_OFFICE_STATE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OFFICE_CITY",
        +                "title": "FILTER_FIELD_ACCOUNT_OFFICE_CITY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_REFERENCE_ID",
        +                "title": "FILTER_FIELD_ACCOUNT_REFERENCE_ID"
        +              }
        +            ]
        +          },
        +          "type": "array"
        +        },
        +        "field": {
        +          "description": "Which attribute to filter on.",
        +          "oneOf": [
        +            {
        +              "const": "FILTER_FIELD_SENIORITY",
        +              "description": "Target contact seniority level. Use IN operator. Stored values: 'Owner/CXO', 'VP', 'DIRECTOR', 'MANAGER', 'IC'. Documented alias OWNER_CXO is also accepted. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_SENIORITY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_LOCATION",
        +              "description": "Target contact's location (country code or location name string). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_LOCATION"
        +            },
        +            {
        +              "const": "FILTER_FIELD_STRENGTH",
        +              "description": "Relationship strength between the connector and target contact. Valid values: 'CONFIRMED', 'STRONG', 'LESS_LIKELY', 'UNLIKELY'. Prefer CONFIRMED and STRONG when looking for high-quality intro paths.",
        +              "title": "FILTER_FIELD_STRENGTH"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CATEGORY",
        +              "description": "Relationship category describing who the super connector is in relation to the company (e.g. Investor, Advisor, Board Member, Customer, Champion, Alumni, Leadership). IMPORTANT: this is NOT the same as seniority (how senior the contact is) or strength (how strong the tie is). Trigger words: investor(s), customer(s), board member(s), advisor(s), champion(s), alumni, leadership, partner(s). Values must be category UUIDs — NOT label strings. Resolution flow: (1) call get_workspace_categories, (2) filter to relationship_type SUPER_CONNECTORS and is_deleted false, (3) match user intent to closest label(s) — OR all plausible matches, (4) use those id UUIDs as filter values.",
        +              "title": "FILTER_FIELD_CATEGORY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONNECTOR_ID",
        +              "description": "RECOMMENDED over FILTER_FIELD_SUPER_CONNECTOR_NAME when the connector user_id is known. Exact match on one or more connector user UUIDs (Keycloak user IDs). Resolve connector names via search_workspace_members first to avoid silent zero-result failures from name prefix matching.",
        +              "title": "FILTER_FIELD_CONNECTOR_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY",
        +              "description": "Include or exclude contacts who have left the tracked company. Values: 'true' or 'false'.",
        +              "title": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE",
        +              "description": "One or more path type evidence signals used to establish the relationship. Use string names from the RelationshipPathType enum. User–Contact: 'LINKEDIN_CONNECTION' (direct LinkedIn connection), 'WORK_OVERLAP' (same company same time), 'EDUCATION_OVERLAP' (same school), 'CALENDAR_EVENT' (meetings on record), 'SELF_DECLARED_CONTACT' (connector declared they know the contact), 'SELF_DECLARED_CONTACT_DONT_KNOW' (connector declared they do not know the contact), 'SUPER_CONNECTOR_APPROVED' (super connector approved the path), 'SUPER_CONNECTOR_DECLINED' (super connector declined), 'TESTIMONIAL' (LinkedIn recommendation one wrote for the other), 'LINKEDIN_ENGAGEMENT' (connector comments on the contact's LinkedIn posts), 'LINKEDIN_POST_MENTION' (connector tagged the contact in one of the connector's own LinkedIn posts). User–Account: 'BOARD_MEMBER', 'COMMON_BOARD_HOP' (P1 → P2 via shared board seat), 'ADVISOR', 'LEADERSHIP', 'EMPLOYEE', 'INVESTOR', 'ACCOUNT_ALUMNI' (connector previously worked at target account), 'SELF_DECLARED_ACCOUNT' (connector declared a relationship to the account), 'SELF_DECLARED_ACCOUNT_DONT_KNOW'. Company–Account: 'COMMON_INVESTOR', 'COMMON_INVESTOR_HOP', 'PORTFOLIO' (a portfolio company of this workspace's investor firm). Contact–Account: 'COMPANY_ALUMNI' (worked at same company at different times). Account insight: 'ACCOUNT_INSIGHT_BOARD_ADVISOR', 'ACCOUNT_INSIGHT_BOARD_ADVISOR_VIA_CONTACT'. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_DEPARTMENT",
        +              "description": "Target contact's department (free-text match). Values are department name strings (e.g. 'Engineering', 'Sales', 'Marketing'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_DEPARTMENT"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OWNER_ID",
        +              "description": "RECOMMENDED over FILTER_FIELD_ACCOUNT_OWNER_NAME when the owner user_id is known. Exact match on CRM account owner user UUID (Keycloak user ID). Resolve owner names via search_workspace_members first.",
        +              "title": "FILTER_FIELD_ACCOUNT_OWNER_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_INDUSTRY",
        +              "description": "Filter by target account industry. Values are industry name strings (e.g. 'Software', 'Financial Services'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_INDUSTRY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_COUNTRY",
        +              "description": "Filter by target account's country. Values are country name strings (e.g. 'United States', 'Germany'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_COUNTRY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE",
        +              "description": "Filter by target account employee headcount range. Valid values: '1', '2-10', '11-50', '51-200', '201-500', '501-1000', '1001-5000', '5001-10000', '10001+'. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONFIDENCE",
        +              "description": "GPT scoring confidence level for the relationship assessment. Valid values: 'High', 'Medium', 'Low'. Use 'High' to restrict results to relationships the scoring model is most certain about. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONFIDENCE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_INTRO_VALUE",
        +              "description": "Assessed value of requesting an introduction through this relationship path. Valid values: 'High', 'Medium', 'Low'. Determined by the Boomerang scoring engine based on strength, seniority, and recency signals. Use 'High' to prioritize the best intro opportunities. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_INTRO_VALUE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_ID",
        +              "description": "Filter by CRM account UUID. Values are account ID strings. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_NAME",
        +              "description": "Filter by target account name (prefix match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_DOMAIN",
        +              "description": "Filter by target account website domain (e.g. 'acme.com'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_DOMAIN"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OWNER_NAME",
        +              "description": "Filter by CRM account owner first OR last name, prefix match on ONE name part only (e.g. [\"John\"] or [\"Smith\"] — NOT \"John Smith\" as one string, which silently returns zero results). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_ACCOUNT_OWNER_ID when user_id is known (resolve via search_workspace_members).",
        +              "title": "FILTER_FIELD_ACCOUNT_OWNER_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_ID",
        +              "description": "RECOMMENDED over FILTER_FIELD_CONTACT_NAME when the contact UUID is known. Exact match on target contact UUID. Resolve contact names via search_contacts first.",
        +              "title": "FILTER_FIELD_CONTACT_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_NAME",
        +              "description": "Filter by target contact first OR last name, prefix match on ONE name part only (e.g. [\"Jane\"] or [\"Doe\"] — NOT \"Jane Doe\" as one string, which silently returns zero results). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_CONTACT_ID when contact UUID is known (resolve via search_contacts).",
        +              "title": "FILTER_FIELD_CONTACT_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_EMAIL",
        +              "description": "Filter by target contact email address (prefix or exact match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONTACT_EMAIL"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_TITLE",
        +              "description": "Filter by target contact job title (prefix match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONTACT_TITLE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_COMPANY_NAME",
        +              "description": "Filter by the company name associated with the target contact — typically the target account name (prefix match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONTACT_COMPANY_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SUPER_CONNECTOR_NAME",
        +              "description": "Filter by super connector's first OR last name, prefix match on ONE name part only (e.g. [\"Steven\"] or [\"Hagler\"] — NOT \"Steven Hagler\" as a single combined string, which will silently return zero results rather than an error). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_CONNECTOR_ID instead whenever the connector's user_id is already known (e.g. from search_workspace_members) — it does an exact match and avoids the silent zero-result failure mode of name-based prefix matching, especially for people with common or multi-word names.",
        +              "title": "FILTER_FIELD_SUPER_CONNECTOR_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL",
        +              "description": "Filter by super connector email address (prefix or exact match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_ACCOUNT_ID",
        +              "description": "Filter by source company UUID — for Account→Account path types (COMMON_INVESTOR, COMMON_BOARD_HOP, ACCOUNT_ALUMNI, SELF_DECLARED_ACCOUNT, COMMON_INVESTOR_HOP, ACCOUNT_INSIGHT_BOARD_ADVISOR, etc.) where the source node is a company, not a user. Exact match. RECOMMENDED over FILTER_FIELD_SOURCE_ACCOUNT_NAME when the account UUID is known (resolve via search_accounts_with_filters first).",
        +              "title": "FILTER_FIELD_SOURCE_ACCOUNT_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_ACCOUNT_NAME",
        +              "description": "Filter by source company name (prefix/substring match) — for Account→Account path types. Use to answer questions like 'which accounts can Garuda Ventures help reach?'. ONE name token per value recommended for broad matching. Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_SOURCE_ACCOUNT_ID when the UUID is known.",
        +              "title": "FILTER_FIELD_SOURCE_ACCOUNT_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN",
        +              "description": "Filter by source company domain (exact or prefix match) — for Account→Account path types. E.g. 'garudaventures.com'. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_CONTACT_ID",
        +              "description": "Filter by source contact UUID — for Contact→Account path types (COMPANY_ALUMNI) where the source node is a contact. Exact match. RECOMMENDED over FILTER_FIELD_SOURCE_CONTACT_NAME when the UUID is known.",
        +              "title": "FILTER_FIELD_SOURCE_CONTACT_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_CONTACT_NAME",
        +              "description": "Filter by source contact first OR last name (prefix match) — for Contact→Account path types. ONE name token per value. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_SOURCE_CONTACT_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_ICP",
        +              "description": "Filter by target account ICP (Ideal Customer Profile) match status. Valid values: 'MATCH' (account matches ICP criteria), 'NO_MATCH' (account evaluated and does not match), 'NO_DATA' (insufficient data to evaluate), 'NO_ICP_DEFINED' (workspace has no ICP configured), 'PRE_MATCH' (pending evaluation). Use the special sentinel value 'null' to match accounts where the ICP field has not been set. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_ICP"
        +            },
        +            {
        +              "const": "FILTER_FIELD_TITLE_PERSONA",
        +              "description": "Buyer persona of the target contact, matched against the contact's title. Values are persona names, NOT job titles: 'BUYING_COMMITTEE' (functional buyers and users — the workspace's buying_committee_regex), 'EXTENDED_BUYING_COMMITTEE' (procurement / finance / IT / legal approval seats — extended_buying_committee_regex), 'LEADERSHIP' (C-suite and VP-level titles from the shared taxonomy, not board members, founders or partner/principal). Multiple values are OR-combined. A persona whose regex is not configured for the workspace is ignored.",
        +              "title": "FILTER_FIELD_TITLE_PERSONA"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_CATEGORY",
        +              "description": "Filter by the target account's category — the workspace's own classification of the account, distinct from ICP. Valid values: 'CUSTOMER', 'PROSPECT', 'OPEN_OPPORTUNITY', 'CLOSED_LOST', 'CHURNED', 'PARTNER', 'INVESTOR_PORTFOLIO', 'COMPETITOR', 'OTHER'. Use the special sentinel value 'null' to match accounts that have not been categorised. Multiple values are OR-combined. Do not confuse with FILTER_FIELD_CATEGORY, which filters on the super connector's category.",
        +              "title": "FILTER_FIELD_ACCOUNT_CATEGORY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONNECTOR_LOCATION",
        +              "description": "Location of the connector (super connector), matched case-insensitively against city, country, or ISO country code (e.g. 'US', 'San Francisco', 'United States'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONNECTOR_LOCATION"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY",
        +              "title": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OFFICE_STATE",
        +              "title": "FILTER_FIELD_ACCOUNT_OFFICE_STATE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OFFICE_CITY",
        +              "title": "FILTER_FIELD_ACCOUNT_OFFICE_CITY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_REFERENCE_ID",
        +              "description": "Filter by the target account's CRM record ID — exact match on reference_id (e.g. Salesforce 18-character Account ID '001xx000003DGbQAAW', HubSpot company ID). Values are CRM IDs, NOT internal UUIDs. Use directly when the user supplies Salesforce/HubSpot IDs — do NOT call search_accounts_with_filters first to resolve them to UUIDs. Pass the id exactly as the CRM stores it: a 15-character Salesforce short id does not match the stored 18-character form, and the match is silent — wrong form returns zero rows, not an error. Only CRM-sourced accounts have a CRM id; accounts created inside Boomerang carry an internal 'BOOM-…' reference_id and never match here. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_REFERENCE_ID"
        +            }
        +          ]
        +        },
        +        "operator": {
        +          "description": "How values are matched. Omit (or 'IN') to keep only rows matching any of the values — the default. Use 'NOT_IN' (aliases: 'NOT_EQUAL_TO', 'NE') to EXCLUDE rows matching any of the values, e.g. field=FILTER_FIELD_ACCOUNT_CATEGORY, operator='NOT_IN', values=['CUSTOMER'] returns paths to accounts that are not customers. A NOT_IN filter keeps rows where the entity exists but the field has no value on record, and excludes paths that have no such entity at all — 'account category not CUSTOMER' returns only paths that target an account, never User→Contact paths. Text filters (names, titles, domains, emails) match by substring, so NOT_IN on them excludes every row CONTAINING a value, not only exact matches — 'account name not [Acme]' also drops 'Acme Holdings'. Not supported on FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY — pass 'true'/'false' with IN instead.",
        +          "type": "string"
        +        },
        +        "values": {
        +          "description": "One or more filter values. Multiple values are OR-combined within the same field, AND across different fields. For FILTER_FIELD_SENIORITY use stored values 'Owner/CXO', 'VP', 'DIRECTOR', 'MANAGER', 'IC' (OWNER_CXO alias accepted). For FILTER_FIELD_STRENGTH use: 'CONFIRMED', 'STRONG', 'LESS_LIKELY', 'UNLIKELY'. For FILTER_FIELD_CATEGORY use category UUIDs resolved from get_workspace_categories (filter to SUPER_CONNECTORS, match by label, use id). For FILTER_FIELD_RELATIONSHIP_PATH_TYPE use RelationshipPathType enum names as strings — User–Contact: 'LINKEDIN_CONNECTION', 'WORK_OVERLAP', 'EDUCATION_OVERLAP', 'CALENDAR_EVENT', 'SELF_DECLARED_CONTACT', 'SELF_DECLARED_CONTACT_DONT_KNOW', 'SUPER_CONNECTOR_APPROVED', 'SUPER_CONNECTOR_DECLINED'; User–Account: 'BOARD_MEMBER', 'COMMON_BOARD_HOP', 'ADVISOR', 'LEADERSHIP', 'EMPLOYEE', 'INVESTOR', 'ACCOUNT_ALUMNI', 'SELF_DECLARED_ACCOUNT', 'SELF_DECLARED_ACCOUNT_DONT_KNOW'; Company–Account: 'COMMON_INVESTOR', 'COMMON_INVESTOR_HOP', 'PORTFOLIO'; Contact–Account: 'COMPANY_ALUMNI'; Account insight: 'ACCOUNT_INSIGHT_BOARD_ADVISOR', 'ACCOUNT_INSIGHT_BOARD_ADVISOR_VIA_CONTACT'. For FILTER_FIELD_CONFIDENCE use: 'High', 'Medium', 'Low'. For FILTER_FIELD_INTRO_VALUE use: 'High', 'Medium', 'Low'. For FILTER_FIELD_SOURCE_ACCOUNT_ID/FILTER_FIELD_SOURCE_CONTACT_ID use UUIDs (resolve via search_accounts_with_filters or search_contacts first). For FILTER_FIELD_ACCOUNT_REFERENCE_ID pass CRM record IDs as-is (e.g. Salesforce '001xx000003DGbQAAW') — exact match, no UUID resolution needed. For FILTER_FIELD_ACCOUNT_ICP use: 'MATCH', 'NO_MATCH', 'NO_DATA', 'NO_ICP_DEFINED', 'PRE_MATCH', or the sentinel 'null' to match accounts with no ICP value set. Person-name filters (FILTER_FIELD_SUPER_CONNECTOR_NAME, FILTER_FIELD_CONTACT_NAME, FILTER_FIELD_ACCOUNT_OWNER_NAME, FILTER_FIELD_SOURCE_ACCOUNT_NAME, FILTER_FIELD_SOURCE_CONTACT_NAME): pass ONE first or last name token per value — never a full name like 'Jane Doe' or 'Garuda Ventures' as a single string, which silently returns zero results. Prefer ID-based filters when UUIDs are known.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedsearch_accounts_with_filters1 field changed
      • changedInput schema / properties / filters / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "properties": {
        -        "field": {
        -          "description": "Account attribute to filter on. Use REFERENCE_ID_FILTER_FIELD for Salesforce/HubSpot account IDs (exact match on reference_id). Use EXTERNAL_ID_FILTER_FIELD for other external system IDs. Use NAME_FILTER_FIELD for account name substring search.",
        -          "oneOf": [
        -            {
        -              "const": "ACCOUNT_OWNER_ID_FILTER_FIELD",
        -              "title": "ACCOUNT_OWNER_ID_FILTER_FIELD"
        -            },
        -            {
        -              "const": "INDUSTRY_FILTER_FIELD",
        -              "title": "INDUSTRY_FILTER_FIELD"
        -            },
        -            {
        -              "const": "COUNTRY_FILTER_FIELD",
        -              "title": "COUNTRY_FILTER_FIELD"
        -            },
        -            {
        -              "const": "EMPLOYEE_SIZE_FILTER_FIELD",
        -              "title": "EMPLOYEE_SIZE_FILTER_FIELD"
        -            },
        -            {
        -              "const": "NAME_FILTER_FIELD",
        -              "description": "Matches account name containing the value (case-insensitive substring). e.g. 'Acme Corp'.",
        -              "title": "NAME_FILTER_FIELD"
        -            },
        -            {
        -              "const": "LINKEDIN_URL_FILTER_FIELD",
        -              "description": "Matches by LinkedIn company page URL (e.g. 'https://www.linkedin.com/company/acme').",
        -              "title": "LINKEDIN_URL_FILTER_FIELD"
        -            },
        -            {
        -              "const": "WEBSITE_FILTER_FIELD",
        -              "description": "Matches by website URL or domain (e.g. 'acme.com').",
        -              "title": "WEBSITE_FILTER_FIELD"
        -            },
        -            {
        -              "const": "STRENGTH_FILTER_FIELD",
        -              "title": "STRENGTH_FILTER_FIELD"
        -            },
        -            {
        -              "const": "ACCOUNT_TYPE_FILTER_FIELD",
        -              "title": "ACCOUNT_TYPE_FILTER_FIELD"
        -            },
        -            {
        -              "const": "REFERENCE_ID_FILTER_FIELD",
        -              "description": "Filter by CRM account ID — exact match on reference_id (Salesforce 18-char Account ID e.g. 001Uz000010C8CIIA0, HubSpot company ID). Use when the user provides an account record ID.",
        -              "title": "REFERENCE_ID_FILTER_FIELD"
        -            },
        -            {
        -              "const": "EXTERNAL_ID_FILTER_FIELD",
        -              "description": "Filter by external system identifier for accounts — exact match.",
        -              "title": "EXTERNAL_ID_FILTER_FIELD"
        -            },
        -            {
        -              "const": "ICP_FILTER_FIELD",
        -              "title": "ICP_FILTER_FIELD"
        -            },
        -            {
        -              "const": "CATEGORY_FILTER_FIELD",
        -              "title": "CATEGORY_FILTER_FIELD"
        -            },
        -            {
        -              "const": "TAG_FILTER_FIELD",
        -              "description": "Filters contacts carrying any of the given tags. Values are tag UUIDs from list_tags — never tag names. Multi-value = OR.",
        -              "title": "TAG_FILTER_FIELD"
        -            }
        -          ]
        -        },
        -        "values": {
        -          "items": {
        -            "type": "string"
        -          },
        -          "type": "array"
        -        }
        -      },
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "properties": {
        +        "field": {
        +          "description": "Account attribute to filter on. Use REFERENCE_ID_FILTER_FIELD for Salesforce/HubSpot account IDs (exact match on reference_id). Use EXTERNAL_ID_FILTER_FIELD for other external system IDs. Use NAME_FILTER_FIELD for account name substring search.",
        +          "oneOf": [
        +            {
        +              "const": "ACCOUNT_OWNER_ID_FILTER_FIELD",
        +              "title": "ACCOUNT_OWNER_ID_FILTER_FIELD"
        +            },
        +            {
        +              "const": "INDUSTRY_FILTER_FIELD",
        +              "title": "INDUSTRY_FILTER_FIELD"
        +            },
        +            {
        +              "const": "COUNTRY_FILTER_FIELD",
        +              "title": "COUNTRY_FILTER_FIELD"
        +            },
        +            {
        +              "const": "EMPLOYEE_SIZE_FILTER_FIELD",
        +              "title": "EMPLOYEE_SIZE_FILTER_FIELD"
        +            },
        +            {
        +              "const": "NAME_FILTER_FIELD",
        +              "description": "Matches account name containing the value (case-insensitive substring). e.g. 'Acme Corp'.",
        +              "title": "NAME_FILTER_FIELD"
        +            },
        +            {
        +              "const": "LINKEDIN_URL_FILTER_FIELD",
        +              "description": "Matches by LinkedIn company page URL (e.g. 'https://www.linkedin.com/company/acme').",
        +              "title": "LINKEDIN_URL_FILTER_FIELD"
        +            },
        +            {
        +              "const": "WEBSITE_FILTER_FIELD",
        +              "description": "Matches by website URL or domain (e.g. 'acme.com').",
        +              "title": "WEBSITE_FILTER_FIELD"
        +            },
        +            {
        +              "const": "STRENGTH_FILTER_FIELD",
        +              "title": "STRENGTH_FILTER_FIELD"
        +            },
        +            {
        +              "const": "ACCOUNT_TYPE_FILTER_FIELD",
        +              "title": "ACCOUNT_TYPE_FILTER_FIELD"
        +            },
        +            {
        +              "const": "REFERENCE_ID_FILTER_FIELD",
        +              "description": "Filter by CRM account ID — exact match on reference_id (Salesforce 18-char Account ID e.g. 001Uz000010C8CIIA0, HubSpot company ID). Use when the user provides an account record ID.",
        +              "title": "REFERENCE_ID_FILTER_FIELD"
        +            },
        +            {
        +              "const": "EXTERNAL_ID_FILTER_FIELD",
        +              "description": "Filter by external system identifier for accounts — exact match.",
        +              "title": "EXTERNAL_ID_FILTER_FIELD"
        +            },
        +            {
        +              "const": "ICP_FILTER_FIELD",
        +              "title": "ICP_FILTER_FIELD"
        +            },
        +            {
        +              "const": "CATEGORY_FILTER_FIELD",
        +              "title": "CATEGORY_FILTER_FIELD"
        +            },
        +            {
        +              "const": "TAG_FILTER_FIELD",
        +              "description": "Filters contacts carrying any of the given tags. Values are tag UUIDs from list_tags — never tag names. Multi-value = OR.",
        +              "title": "TAG_FILTER_FIELD"
        +            },
        +            {
        +              "const": "CONNECTOR_CATEGORY_FILTER_FIELD",
        +              "title": "CONNECTOR_CATEGORY_FILTER_FIELD"
        +            }
        +          ]
        +        },
        +        "values": {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedsearch_warm_intro_relationships1 field changed
      • changedInput schema / properties / filters / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "properties": {
        -        "fallback_fields": {
        -          "items": {
        -            "oneOf": [
        -              {
        -                "const": "FILTER_FIELD_SENIORITY",
        -                "title": "FILTER_FIELD_SENIORITY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_LOCATION",
        -                "title": "FILTER_FIELD_LOCATION"
        -              },
        -              {
        -                "const": "FILTER_FIELD_STRENGTH",
        -                "title": "FILTER_FIELD_STRENGTH"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CATEGORY",
        -                "title": "FILTER_FIELD_CATEGORY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONNECTOR_ID",
        -                "title": "FILTER_FIELD_CONNECTOR_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY",
        -                "title": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE",
        -                "title": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_DEPARTMENT",
        -                "title": "FILTER_FIELD_DEPARTMENT"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OWNER_ID",
        -                "title": "FILTER_FIELD_ACCOUNT_OWNER_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_INDUSTRY",
        -                "title": "FILTER_FIELD_ACCOUNT_INDUSTRY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_COUNTRY",
        -                "title": "FILTER_FIELD_ACCOUNT_COUNTRY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE",
        -                "title": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONFIDENCE",
        -                "title": "FILTER_FIELD_CONFIDENCE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_INTRO_VALUE",
        -                "title": "FILTER_FIELD_INTRO_VALUE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_ID",
        -                "title": "FILTER_FIELD_ACCOUNT_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_NAME",
        -                "title": "FILTER_FIELD_ACCOUNT_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_DOMAIN",
        -                "title": "FILTER_FIELD_ACCOUNT_DOMAIN"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OWNER_NAME",
        -                "title": "FILTER_FIELD_ACCOUNT_OWNER_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_ID",
        -                "title": "FILTER_FIELD_CONTACT_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_NAME",
        -                "title": "FILTER_FIELD_CONTACT_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_EMAIL",
        -                "title": "FILTER_FIELD_CONTACT_EMAIL"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_TITLE",
        -                "title": "FILTER_FIELD_CONTACT_TITLE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONTACT_COMPANY_NAME",
        -                "title": "FILTER_FIELD_CONTACT_COMPANY_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SUPER_CONNECTOR_NAME",
        -                "title": "FILTER_FIELD_SUPER_CONNECTOR_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL",
        -                "title": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_ACCOUNT_ID",
        -                "title": "FILTER_FIELD_SOURCE_ACCOUNT_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_ACCOUNT_NAME",
        -                "title": "FILTER_FIELD_SOURCE_ACCOUNT_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN",
        -                "title": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_CONTACT_ID",
        -                "title": "FILTER_FIELD_SOURCE_CONTACT_ID"
        -              },
        -              {
        -                "const": "FILTER_FIELD_SOURCE_CONTACT_NAME",
        -                "title": "FILTER_FIELD_SOURCE_CONTACT_NAME"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_ICP",
        -                "title": "FILTER_FIELD_ACCOUNT_ICP"
        -              },
        -              {
        -                "const": "FILTER_FIELD_TITLE_PERSONA",
        -                "title": "FILTER_FIELD_TITLE_PERSONA"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_CATEGORY",
        -                "title": "FILTER_FIELD_ACCOUNT_CATEGORY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_CONNECTOR_LOCATION",
        -                "title": "FILTER_FIELD_CONNECTOR_LOCATION"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY",
        -                "title": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OFFICE_STATE",
        -                "title": "FILTER_FIELD_ACCOUNT_OFFICE_STATE"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_OFFICE_CITY",
        -                "title": "FILTER_FIELD_ACCOUNT_OFFICE_CITY"
        -              },
        -              {
        -                "const": "FILTER_FIELD_ACCOUNT_REFERENCE_ID",
        -                "title": "FILTER_FIELD_ACCOUNT_REFERENCE_ID"
        -              }
        -            ]
        -          },
        -          "type": "array"
        -        },
        -        "field": {
        -          "description": "Which attribute to filter on.",
        -          "oneOf": [
        -            {
        -              "const": "FILTER_FIELD_SENIORITY",
        -              "description": "Target contact seniority level. Use IN operator. Stored values: 'Owner/CXO', 'VP', 'DIRECTOR', 'MANAGER', 'IC'. Documented alias OWNER_CXO is also accepted. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_SENIORITY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_LOCATION",
        -              "description": "Target contact's location (country code or location name string). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_LOCATION"
        -            },
        -            {
        -              "const": "FILTER_FIELD_STRENGTH",
        -              "description": "Relationship strength between the connector and target contact. Valid values: 'CONFIRMED', 'STRONG', 'LESS_LIKELY', 'UNLIKELY'. Prefer CONFIRMED and STRONG when looking for high-quality intro paths.",
        -              "title": "FILTER_FIELD_STRENGTH"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CATEGORY",
        -              "description": "Relationship category describing who the super connector is in relation to the company (e.g. Investor, Advisor, Board Member, Customer, Champion, Alumni, Leadership). IMPORTANT: this is NOT the same as seniority (how senior the contact is) or strength (how strong the tie is). Trigger words: investor(s), customer(s), board member(s), advisor(s), champion(s), alumni, leadership, partner(s). Values must be category UUIDs — NOT label strings. Resolution flow: (1) call get_workspace_categories, (2) filter to relationship_type SUPER_CONNECTORS and is_deleted false, (3) match user intent to closest label(s) — OR all plausible matches, (4) use those id UUIDs as filter values.",
        -              "title": "FILTER_FIELD_CATEGORY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONNECTOR_ID",
        -              "description": "RECOMMENDED over FILTER_FIELD_SUPER_CONNECTOR_NAME when the connector user_id is known. Exact match on one or more connector user UUIDs (Keycloak user IDs). Resolve connector names via search_workspace_members first to avoid silent zero-result failures from name prefix matching.",
        -              "title": "FILTER_FIELD_CONNECTOR_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY",
        -              "description": "Include or exclude contacts who have left the tracked company. Values: 'true' or 'false'.",
        -              "title": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE",
        -              "description": "One or more path type evidence signals used to establish the relationship. Use string names from the RelationshipPathType enum. User–Contact: 'LINKEDIN_CONNECTION' (direct LinkedIn connection), 'WORK_OVERLAP' (same company same time), 'EDUCATION_OVERLAP' (same school), 'CALENDAR_EVENT' (meetings on record), 'SELF_DECLARED_CONTACT' (connector declared they know the contact), 'SELF_DECLARED_CONTACT_DONT_KNOW' (connector declared they do not know the contact), 'SUPER_CONNECTOR_APPROVED' (super connector approved the path), 'SUPER_CONNECTOR_DECLINED' (super connector declined). User–Account: 'BOARD_MEMBER', 'COMMON_BOARD_HOP' (P1 → P2 via shared board seat), 'ADVISOR', 'LEADERSHIP', 'EMPLOYEE', 'INVESTOR', 'ACCOUNT_ALUMNI' (connector previously worked at target account), 'SELF_DECLARED_ACCOUNT' (connector declared a relationship to the account), 'SELF_DECLARED_ACCOUNT_DONT_KNOW'. Company–Account: 'COMMON_INVESTOR', 'COMMON_INVESTOR_HOP', 'PORTFOLIO' (a portfolio company of this workspace's investor firm). Contact–Account: 'COMPANY_ALUMNI' (worked at same company at different times). Account insight: 'ACCOUNT_INSIGHT_BOARD_ADVISOR', 'ACCOUNT_INSIGHT_BOARD_ADVISOR_VIA_CONTACT'. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_DEPARTMENT",
        -              "description": "Target contact's department (free-text match). Values are department name strings (e.g. 'Engineering', 'Sales', 'Marketing'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_DEPARTMENT"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OWNER_ID",
        -              "description": "RECOMMENDED over FILTER_FIELD_ACCOUNT_OWNER_NAME when the owner user_id is known. Exact match on CRM account owner user UUID (Keycloak user ID). Resolve owner names via search_workspace_members first.",
        -              "title": "FILTER_FIELD_ACCOUNT_OWNER_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_INDUSTRY",
        -              "description": "Filter by target account industry. Values are industry name strings (e.g. 'Software', 'Financial Services'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_INDUSTRY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_COUNTRY",
        -              "description": "Filter by target account's country. Values are country name strings (e.g. 'United States', 'Germany'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_COUNTRY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE",
        -              "description": "Filter by target account employee headcount range. Valid values: '1', '2-10', '11-50', '51-200', '201-500', '501-1000', '1001-5000', '5001-10000', '10001+'. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONFIDENCE",
        -              "description": "GPT scoring confidence level for the relationship assessment. Valid values: 'High', 'Medium', 'Low'. Use 'High' to restrict results to relationships the scoring model is most certain about. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONFIDENCE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_INTRO_VALUE",
        -              "description": "Assessed value of requesting an introduction through this relationship path. Valid values: 'High', 'Medium', 'Low'. Determined by the Boomerang scoring engine based on strength, seniority, and recency signals. Use 'High' to prioritize the best intro opportunities. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_INTRO_VALUE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_ID",
        -              "description": "Filter by CRM account UUID. Values are account ID strings. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_NAME",
        -              "description": "Filter by target account name (prefix match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_DOMAIN",
        -              "description": "Filter by target account website domain (e.g. 'acme.com'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_DOMAIN"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OWNER_NAME",
        -              "description": "Filter by CRM account owner first OR last name, prefix match on ONE name part only (e.g. [\"John\"] or [\"Smith\"] — NOT \"John Smith\" as one string, which silently returns zero results). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_ACCOUNT_OWNER_ID when user_id is known (resolve via search_workspace_members).",
        -              "title": "FILTER_FIELD_ACCOUNT_OWNER_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_ID",
        -              "description": "RECOMMENDED over FILTER_FIELD_CONTACT_NAME when the contact UUID is known. Exact match on target contact UUID. Resolve contact names via search_contacts first.",
        -              "title": "FILTER_FIELD_CONTACT_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_NAME",
        -              "description": "Filter by target contact first OR last name, prefix match on ONE name part only (e.g. [\"Jane\"] or [\"Doe\"] — NOT \"Jane Doe\" as one string, which silently returns zero results). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_CONTACT_ID when contact UUID is known (resolve via search_contacts).",
        -              "title": "FILTER_FIELD_CONTACT_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_EMAIL",
        -              "description": "Filter by target contact email address (prefix or exact match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONTACT_EMAIL"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_TITLE",
        -              "description": "Filter by target contact job title (prefix match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONTACT_TITLE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONTACT_COMPANY_NAME",
        -              "description": "Filter by the company name associated with the target contact — typically the target account name (prefix match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONTACT_COMPANY_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SUPER_CONNECTOR_NAME",
        -              "description": "Filter by super connector's first OR last name, prefix match on ONE name part only (e.g. [\"Steven\"] or [\"Hagler\"] — NOT \"Steven Hagler\" as a single combined string, which will silently return zero results rather than an error). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_CONNECTOR_ID instead whenever the connector's user_id is already known (e.g. from search_workspace_members) — it does an exact match and avoids the silent zero-result failure mode of name-based prefix matching, especially for people with common or multi-word names.",
        -              "title": "FILTER_FIELD_SUPER_CONNECTOR_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL",
        -              "description": "Filter by super connector email address (prefix or exact match). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_ACCOUNT_ID",
        -              "description": "Filter by source company UUID — for Account→Account path types (COMMON_INVESTOR, COMMON_BOARD_HOP, ACCOUNT_ALUMNI, SELF_DECLARED_ACCOUNT, COMMON_INVESTOR_HOP, ACCOUNT_INSIGHT_BOARD_ADVISOR, etc.) where the source node is a company, not a user. Exact match. RECOMMENDED over FILTER_FIELD_SOURCE_ACCOUNT_NAME when the account UUID is known (resolve via search_accounts_with_filters first).",
        -              "title": "FILTER_FIELD_SOURCE_ACCOUNT_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_ACCOUNT_NAME",
        -              "description": "Filter by source company name (prefix/substring match) — for Account→Account path types. Use to answer questions like 'which accounts can Garuda Ventures help reach?'. ONE name token per value recommended for broad matching. Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_SOURCE_ACCOUNT_ID when the UUID is known.",
        -              "title": "FILTER_FIELD_SOURCE_ACCOUNT_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN",
        -              "description": "Filter by source company domain (exact or prefix match) — for Account→Account path types. E.g. 'garudaventures.com'. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_CONTACT_ID",
        -              "description": "Filter by source contact UUID — for Contact→Account path types (COMPANY_ALUMNI) where the source node is a contact. Exact match. RECOMMENDED over FILTER_FIELD_SOURCE_CONTACT_NAME when the UUID is known.",
        -              "title": "FILTER_FIELD_SOURCE_CONTACT_ID"
        -            },
        -            {
        -              "const": "FILTER_FIELD_SOURCE_CONTACT_NAME",
        -              "description": "Filter by source contact first OR last name (prefix match) — for Contact→Account path types. ONE name token per value. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_SOURCE_CONTACT_NAME"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_ICP",
        -              "description": "Filter by target account ICP (Ideal Customer Profile) match status. Valid values: 'MATCH' (account matches ICP criteria), 'NO_MATCH' (account evaluated and does not match), 'NO_DATA' (insufficient data to evaluate), 'NO_ICP_DEFINED' (workspace has no ICP configured), 'PRE_MATCH' (pending evaluation). Use the special sentinel value 'null' to match accounts where the ICP field has not been set. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_ICP"
        -            },
        -            {
        -              "const": "FILTER_FIELD_TITLE_PERSONA",
        -              "description": "Buyer persona of the target contact, matched against the contact's title. Values are persona names, NOT job titles: 'BUYING_COMMITTEE' (functional buyers and users — the workspace's buying_committee_regex), 'EXTENDED_BUYING_COMMITTEE' (procurement / finance / IT / legal approval seats — extended_buying_committee_regex), 'LEADERSHIP' (C-suite and VP-level titles from the shared taxonomy, not board members, founders or partner/principal). Multiple values are OR-combined. A persona whose regex is not configured for the workspace is ignored.",
        -              "title": "FILTER_FIELD_TITLE_PERSONA"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_CATEGORY",
        -              "description": "Filter by the target account's category — the workspace's own classification of the account, distinct from ICP. Valid values: 'CUSTOMER', 'PROSPECT', 'OPEN_OPPORTUNITY', 'CLOSED_LOST', 'CHURNED', 'PARTNER', 'INVESTOR_PORTFOLIO', 'COMPETITOR', 'OTHER'. Use the special sentinel value 'null' to match accounts that have not been categorised. Multiple values are OR-combined. Do not confuse with FILTER_FIELD_CATEGORY, which filters on the super connector's category.",
        -              "title": "FILTER_FIELD_ACCOUNT_CATEGORY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_CONNECTOR_LOCATION",
        -              "description": "Location of the connector (super connector), matched case-insensitively against city, country, or ISO country code (e.g. 'US', 'San Francisco', 'United States'). Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_CONNECTOR_LOCATION"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY",
        -              "title": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OFFICE_STATE",
        -              "title": "FILTER_FIELD_ACCOUNT_OFFICE_STATE"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_OFFICE_CITY",
        -              "title": "FILTER_FIELD_ACCOUNT_OFFICE_CITY"
        -            },
        -            {
        -              "const": "FILTER_FIELD_ACCOUNT_REFERENCE_ID",
        -              "description": "Filter by the target account's CRM record ID — exact match on reference_id (e.g. Salesforce 18-character Account ID '001xx000003DGbQAAW', HubSpot company ID). Values are CRM IDs, NOT internal UUIDs. Use directly when the user supplies Salesforce/HubSpot IDs — do NOT call search_accounts_with_filters first to resolve them to UUIDs. Pass the id exactly as the CRM stores it: a 15-character Salesforce short id does not match the stored 18-character form, and the match is silent — wrong form returns zero rows, not an error. Only CRM-sourced accounts have a CRM id; accounts created inside Boomerang carry an internal 'BOOM-…' reference_id and never match here. Multiple values are OR-combined.",
        -              "title": "FILTER_FIELD_ACCOUNT_REFERENCE_ID"
        -            }
        -          ]
        -        },
        -        "operator": {
        -          "description": "How values are matched. Omit (or 'IN') to keep only rows matching any of the values — the default. Use 'NOT_IN' (aliases: 'NOT_EQUAL_TO', 'NE') to EXCLUDE rows matching any of the values, e.g. field=FILTER_FIELD_ACCOUNT_CATEGORY, operator='NOT_IN', values=['CUSTOMER'] returns paths to accounts that are not customers. A NOT_IN filter keeps rows where the entity exists but the field has no value on record, and excludes paths that have no such entity at all — 'account category not CUSTOMER' returns only paths that target an account, never User→Contact paths. Text filters (names, titles, domains, emails) match by substring, so NOT_IN on them excludes every row CONTAINING a value, not only exact matches — 'account name not [Acme]' also drops 'Acme Holdings'. Not supported on FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY — pass 'true'/'false' with IN instead.",
        -          "type": "string"
        -        },
        -        "values": {
        -          "description": "One or more filter values. Multiple values are OR-combined within the same field, AND across different fields. For FILTER_FIELD_SENIORITY use stored values 'Owner/CXO', 'VP', 'DIRECTOR', 'MANAGER', 'IC' (OWNER_CXO alias accepted). For FILTER_FIELD_STRENGTH use: 'CONFIRMED', 'STRONG', 'LESS_LIKELY', 'UNLIKELY'. For FILTER_FIELD_CATEGORY use category UUIDs resolved from get_workspace_categories (filter to SUPER_CONNECTORS, match by label, use id). For FILTER_FIELD_RELATIONSHIP_PATH_TYPE use RelationshipPathType enum names as strings — User–Contact: 'LINKEDIN_CONNECTION', 'WORK_OVERLAP', 'EDUCATION_OVERLAP', 'CALENDAR_EVENT', 'SELF_DECLARED_CONTACT', 'SELF_DECLARED_CONTACT_DONT_KNOW', 'SUPER_CONNECTOR_APPROVED', 'SUPER_CONNECTOR_DECLINED'; User–Account: 'BOARD_MEMBER', 'COMMON_BOARD_HOP', 'ADVISOR', 'LEADERSHIP', 'EMPLOYEE', 'INVESTOR', 'ACCOUNT_ALUMNI', 'SELF_DECLARED_ACCOUNT', 'SELF_DECLARED_ACCOUNT_DONT_KNOW'; Company–Account: 'COMMON_INVESTOR', 'COMMON_INVESTOR_HOP', 'PORTFOLIO'; Contact–Account: 'COMPANY_ALUMNI'; Account insight: 'ACCOUNT_INSIGHT_BOARD_ADVISOR', 'ACCOUNT_INSIGHT_BOARD_ADVISOR_VIA_CONTACT'. For FILTER_FIELD_CONFIDENCE use: 'High', 'Medium', 'Low'. For FILTER_FIELD_INTRO_VALUE use: 'High', 'Medium', 'Low'. For FILTER_FIELD_SOURCE_ACCOUNT_ID/FILTER_FIELD_SOURCE_CONTACT_ID use UUIDs (resolve via search_accounts_with_filters or search_contacts first). For FILTER_FIELD_ACCOUNT_REFERENCE_ID pass CRM record IDs as-is (e.g. Salesforce '001xx000003DGbQAAW') — exact match, no UUID resolution needed. For FILTER_FIELD_ACCOUNT_ICP use: 'MATCH', 'NO_MATCH', 'NO_DATA', 'NO_ICP_DEFINED', 'PRE_MATCH', or the sentinel 'null' to match accounts with no ICP value set. Person-name filters (FILTER_FIELD_SUPER_CONNECTOR_NAME, FILTER_FIELD_CONTACT_NAME, FILTER_FIELD_ACCOUNT_OWNER_NAME, FILTER_FIELD_SOURCE_ACCOUNT_NAME, FILTER_FIELD_SOURCE_CONTACT_NAME): pass ONE first or last name token per value — never a full name like 'Jane Doe' or 'Garuda Ventures' as a single string, which silently returns zero results. Prefer ID-based filters when UUIDs are known.",
        -          "items": {
        -            "type": "string"
        -          },
        -          "type": "array"
        -        }
        -      },
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "properties": {
        +        "fallback_fields": {
        +          "items": {
        +            "oneOf": [
        +              {
        +                "const": "FILTER_FIELD_SENIORITY",
        +                "title": "FILTER_FIELD_SENIORITY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_LOCATION",
        +                "title": "FILTER_FIELD_LOCATION"
        +              },
        +              {
        +                "const": "FILTER_FIELD_STRENGTH",
        +                "title": "FILTER_FIELD_STRENGTH"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CATEGORY",
        +                "title": "FILTER_FIELD_CATEGORY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONNECTOR_ID",
        +                "title": "FILTER_FIELD_CONNECTOR_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY",
        +                "title": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE",
        +                "title": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_DEPARTMENT",
        +                "title": "FILTER_FIELD_DEPARTMENT"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OWNER_ID",
        +                "title": "FILTER_FIELD_ACCOUNT_OWNER_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_INDUSTRY",
        +                "title": "FILTER_FIELD_ACCOUNT_INDUSTRY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_COUNTRY",
        +                "title": "FILTER_FIELD_ACCOUNT_COUNTRY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE",
        +                "title": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONFIDENCE",
        +                "title": "FILTER_FIELD_CONFIDENCE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_INTRO_VALUE",
        +                "title": "FILTER_FIELD_INTRO_VALUE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_ID",
        +                "title": "FILTER_FIELD_ACCOUNT_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_NAME",
        +                "title": "FILTER_FIELD_ACCOUNT_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_DOMAIN",
        +                "title": "FILTER_FIELD_ACCOUNT_DOMAIN"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OWNER_NAME",
        +                "title": "FILTER_FIELD_ACCOUNT_OWNER_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_ID",
        +                "title": "FILTER_FIELD_CONTACT_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_NAME",
        +                "title": "FILTER_FIELD_CONTACT_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_EMAIL",
        +                "title": "FILTER_FIELD_CONTACT_EMAIL"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_TITLE",
        +                "title": "FILTER_FIELD_CONTACT_TITLE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONTACT_COMPANY_NAME",
        +                "title": "FILTER_FIELD_CONTACT_COMPANY_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SUPER_CONNECTOR_NAME",
        +                "title": "FILTER_FIELD_SUPER_CONNECTOR_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL",
        +                "title": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_ACCOUNT_ID",
        +                "title": "FILTER_FIELD_SOURCE_ACCOUNT_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_ACCOUNT_NAME",
        +                "title": "FILTER_FIELD_SOURCE_ACCOUNT_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN",
        +                "title": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_CONTACT_ID",
        +                "title": "FILTER_FIELD_SOURCE_CONTACT_ID"
        +              },
        +              {
        +                "const": "FILTER_FIELD_SOURCE_CONTACT_NAME",
        +                "title": "FILTER_FIELD_SOURCE_CONTACT_NAME"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_ICP",
        +                "title": "FILTER_FIELD_ACCOUNT_ICP"
        +              },
        +              {
        +                "const": "FILTER_FIELD_TITLE_PERSONA",
        +                "title": "FILTER_FIELD_TITLE_PERSONA"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_CATEGORY",
        +                "title": "FILTER_FIELD_ACCOUNT_CATEGORY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_CONNECTOR_LOCATION",
        +                "title": "FILTER_FIELD_CONNECTOR_LOCATION"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY",
        +                "title": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OFFICE_STATE",
        +                "title": "FILTER_FIELD_ACCOUNT_OFFICE_STATE"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_OFFICE_CITY",
        +                "title": "FILTER_FIELD_ACCOUNT_OFFICE_CITY"
        +              },
        +              {
        +                "const": "FILTER_FIELD_ACCOUNT_REFERENCE_ID",
        +                "title": "FILTER_FIELD_ACCOUNT_REFERENCE_ID"
        +              }
        +            ]
        +          },
        +          "type": "array"
        +        },
        +        "field": {
        +          "description": "Which attribute to filter on.",
        +          "oneOf": [
        +            {
        +              "const": "FILTER_FIELD_SENIORITY",
        +              "description": "Target contact seniority level. Use IN operator. Stored values: 'Owner/CXO', 'VP', 'DIRECTOR', 'MANAGER', 'IC'. Documented alias OWNER_CXO is also accepted. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_SENIORITY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_LOCATION",
        +              "description": "Target contact's location (country code or location name string). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_LOCATION"
        +            },
        +            {
        +              "const": "FILTER_FIELD_STRENGTH",
        +              "description": "Relationship strength between the connector and target contact. Valid values: 'CONFIRMED', 'STRONG', 'LESS_LIKELY', 'UNLIKELY'. Prefer CONFIRMED and STRONG when looking for high-quality intro paths.",
        +              "title": "FILTER_FIELD_STRENGTH"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CATEGORY",
        +              "description": "Relationship category describing who the super connector is in relation to the company (e.g. Investor, Advisor, Board Member, Customer, Champion, Alumni, Leadership). IMPORTANT: this is NOT the same as seniority (how senior the contact is) or strength (how strong the tie is). Trigger words: investor(s), customer(s), board member(s), advisor(s), champion(s), alumni, leadership, partner(s). Values must be category UUIDs — NOT label strings. Resolution flow: (1) call get_workspace_categories, (2) filter to relationship_type SUPER_CONNECTORS and is_deleted false, (3) match user intent to closest label(s) — OR all plausible matches, (4) use those id UUIDs as filter values.",
        +              "title": "FILTER_FIELD_CATEGORY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONNECTOR_ID",
        +              "description": "RECOMMENDED over FILTER_FIELD_SUPER_CONNECTOR_NAME when the connector user_id is known. Exact match on one or more connector user UUIDs (Keycloak user IDs). Resolve connector names via search_workspace_members first to avoid silent zero-result failures from name prefix matching.",
        +              "title": "FILTER_FIELD_CONNECTOR_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY",
        +              "description": "Include or exclude contacts who have left the tracked company. Values: 'true' or 'false'.",
        +              "title": "FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE",
        +              "description": "One or more path type evidence signals used to establish the relationship. Use string names from the RelationshipPathType enum. User–Contact: 'LINKEDIN_CONNECTION' (direct LinkedIn connection), 'WORK_OVERLAP' (same company same time), 'EDUCATION_OVERLAP' (same school), 'CALENDAR_EVENT' (meetings on record), 'SELF_DECLARED_CONTACT' (connector declared they know the contact), 'SELF_DECLARED_CONTACT_DONT_KNOW' (connector declared they do not know the contact), 'SUPER_CONNECTOR_APPROVED' (super connector approved the path), 'SUPER_CONNECTOR_DECLINED' (super connector declined), 'TESTIMONIAL' (LinkedIn recommendation one wrote for the other), 'LINKEDIN_ENGAGEMENT' (connector comments on the contact's LinkedIn posts), 'LINKEDIN_POST_MENTION' (connector tagged the contact in one of the connector's own LinkedIn posts). User–Account: 'BOARD_MEMBER', 'COMMON_BOARD_HOP' (P1 → P2 via shared board seat), 'ADVISOR', 'LEADERSHIP', 'EMPLOYEE', 'INVESTOR', 'ACCOUNT_ALUMNI' (connector previously worked at target account), 'SELF_DECLARED_ACCOUNT' (connector declared a relationship to the account), 'SELF_DECLARED_ACCOUNT_DONT_KNOW'. Company–Account: 'COMMON_INVESTOR', 'COMMON_INVESTOR_HOP', 'PORTFOLIO' (a portfolio company of this workspace's investor firm). Contact–Account: 'COMPANY_ALUMNI' (worked at same company at different times). Account insight: 'ACCOUNT_INSIGHT_BOARD_ADVISOR', 'ACCOUNT_INSIGHT_BOARD_ADVISOR_VIA_CONTACT'. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_RELATIONSHIP_PATH_TYPE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_DEPARTMENT",
        +              "description": "Target contact's department (free-text match). Values are department name strings (e.g. 'Engineering', 'Sales', 'Marketing'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_DEPARTMENT"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OWNER_ID",
        +              "description": "RECOMMENDED over FILTER_FIELD_ACCOUNT_OWNER_NAME when the owner user_id is known. Exact match on CRM account owner user UUID (Keycloak user ID). Resolve owner names via search_workspace_members first.",
        +              "title": "FILTER_FIELD_ACCOUNT_OWNER_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_INDUSTRY",
        +              "description": "Filter by target account industry. Values are industry name strings (e.g. 'Software', 'Financial Services'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_INDUSTRY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_COUNTRY",
        +              "description": "Filter by target account's country. Values are country name strings (e.g. 'United States', 'Germany'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_COUNTRY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE",
        +              "description": "Filter by target account employee headcount range. Valid values: '1', '2-10', '11-50', '51-200', '201-500', '501-1000', '1001-5000', '5001-10000', '10001+'. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_EMPLOYEE_SIZE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONFIDENCE",
        +              "description": "GPT scoring confidence level for the relationship assessment. Valid values: 'High', 'Medium', 'Low'. Use 'High' to restrict results to relationships the scoring model is most certain about. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONFIDENCE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_INTRO_VALUE",
        +              "description": "Assessed value of requesting an introduction through this relationship path. Valid values: 'High', 'Medium', 'Low'. Determined by the Boomerang scoring engine based on strength, seniority, and recency signals. Use 'High' to prioritize the best intro opportunities. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_INTRO_VALUE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_ID",
        +              "description": "Filter by CRM account UUID. Values are account ID strings. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_NAME",
        +              "description": "Filter by target account name (prefix match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_DOMAIN",
        +              "description": "Filter by target account website domain (e.g. 'acme.com'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_DOMAIN"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OWNER_NAME",
        +              "description": "Filter by CRM account owner first OR last name, prefix match on ONE name part only (e.g. [\"John\"] or [\"Smith\"] — NOT \"John Smith\" as one string, which silently returns zero results). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_ACCOUNT_OWNER_ID when user_id is known (resolve via search_workspace_members).",
        +              "title": "FILTER_FIELD_ACCOUNT_OWNER_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_ID",
        +              "description": "RECOMMENDED over FILTER_FIELD_CONTACT_NAME when the contact UUID is known. Exact match on target contact UUID. Resolve contact names via search_contacts first.",
        +              "title": "FILTER_FIELD_CONTACT_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_NAME",
        +              "description": "Filter by target contact first OR last name, prefix match on ONE name part only (e.g. [\"Jane\"] or [\"Doe\"] — NOT \"Jane Doe\" as one string, which silently returns zero results). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_CONTACT_ID when contact UUID is known (resolve via search_contacts).",
        +              "title": "FILTER_FIELD_CONTACT_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_EMAIL",
        +              "description": "Filter by target contact email address (prefix or exact match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONTACT_EMAIL"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_TITLE",
        +              "description": "Filter by target contact job title (prefix match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONTACT_TITLE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONTACT_COMPANY_NAME",
        +              "description": "Filter by the company name associated with the target contact — typically the target account name (prefix match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONTACT_COMPANY_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SUPER_CONNECTOR_NAME",
        +              "description": "Filter by super connector's first OR last name, prefix match on ONE name part only (e.g. [\"Steven\"] or [\"Hagler\"] — NOT \"Steven Hagler\" as a single combined string, which will silently return zero results rather than an error). Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_CONNECTOR_ID instead whenever the connector's user_id is already known (e.g. from search_workspace_members) — it does an exact match and avoids the silent zero-result failure mode of name-based prefix matching, especially for people with common or multi-word names.",
        +              "title": "FILTER_FIELD_SUPER_CONNECTOR_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL",
        +              "description": "Filter by super connector email address (prefix or exact match). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_SUPER_CONNECTOR_EMAIL"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_ACCOUNT_ID",
        +              "description": "Filter by source company UUID — for Account→Account path types (COMMON_INVESTOR, COMMON_BOARD_HOP, ACCOUNT_ALUMNI, SELF_DECLARED_ACCOUNT, COMMON_INVESTOR_HOP, ACCOUNT_INSIGHT_BOARD_ADVISOR, etc.) where the source node is a company, not a user. Exact match. RECOMMENDED over FILTER_FIELD_SOURCE_ACCOUNT_NAME when the account UUID is known (resolve via search_accounts_with_filters first).",
        +              "title": "FILTER_FIELD_SOURCE_ACCOUNT_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_ACCOUNT_NAME",
        +              "description": "Filter by source company name (prefix/substring match) — for Account→Account path types. Use to answer questions like 'which accounts can Garuda Ventures help reach?'. ONE name token per value recommended for broad matching. Multiple values are OR-combined. RECOMMENDED: prefer FILTER_FIELD_SOURCE_ACCOUNT_ID when the UUID is known.",
        +              "title": "FILTER_FIELD_SOURCE_ACCOUNT_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN",
        +              "description": "Filter by source company domain (exact or prefix match) — for Account→Account path types. E.g. 'garudaventures.com'. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_SOURCE_ACCOUNT_DOMAIN"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_CONTACT_ID",
        +              "description": "Filter by source contact UUID — for Contact→Account path types (COMPANY_ALUMNI) where the source node is a contact. Exact match. RECOMMENDED over FILTER_FIELD_SOURCE_CONTACT_NAME when the UUID is known.",
        +              "title": "FILTER_FIELD_SOURCE_CONTACT_ID"
        +            },
        +            {
        +              "const": "FILTER_FIELD_SOURCE_CONTACT_NAME",
        +              "description": "Filter by source contact first OR last name (prefix match) — for Contact→Account path types. ONE name token per value. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_SOURCE_CONTACT_NAME"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_ICP",
        +              "description": "Filter by target account ICP (Ideal Customer Profile) match status. Valid values: 'MATCH' (account matches ICP criteria), 'NO_MATCH' (account evaluated and does not match), 'NO_DATA' (insufficient data to evaluate), 'NO_ICP_DEFINED' (workspace has no ICP configured), 'PRE_MATCH' (pending evaluation). Use the special sentinel value 'null' to match accounts where the ICP field has not been set. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_ICP"
        +            },
        +            {
        +              "const": "FILTER_FIELD_TITLE_PERSONA",
        +              "description": "Buyer persona of the target contact, matched against the contact's title. Values are persona names, NOT job titles: 'BUYING_COMMITTEE' (functional buyers and users — the workspace's buying_committee_regex), 'EXTENDED_BUYING_COMMITTEE' (procurement / finance / IT / legal approval seats — extended_buying_committee_regex), 'LEADERSHIP' (C-suite and VP-level titles from the shared taxonomy, not board members, founders or partner/principal). Multiple values are OR-combined. A persona whose regex is not configured for the workspace is ignored.",
        +              "title": "FILTER_FIELD_TITLE_PERSONA"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_CATEGORY",
        +              "description": "Filter by the target account's category — the workspace's own classification of the account, distinct from ICP. Valid values: 'CUSTOMER', 'PROSPECT', 'OPEN_OPPORTUNITY', 'CLOSED_LOST', 'CHURNED', 'PARTNER', 'INVESTOR_PORTFOLIO', 'COMPETITOR', 'OTHER'. Use the special sentinel value 'null' to match accounts that have not been categorised. Multiple values are OR-combined. Do not confuse with FILTER_FIELD_CATEGORY, which filters on the super connector's category.",
        +              "title": "FILTER_FIELD_ACCOUNT_CATEGORY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_CONNECTOR_LOCATION",
        +              "description": "Location of the connector (super connector), matched case-insensitively against city, country, or ISO country code (e.g. 'US', 'San Francisco', 'United States'). Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_CONNECTOR_LOCATION"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY",
        +              "title": "FILTER_FIELD_ACCOUNT_OFFICE_COUNTRY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OFFICE_STATE",
        +              "title": "FILTER_FIELD_ACCOUNT_OFFICE_STATE"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_OFFICE_CITY",
        +              "title": "FILTER_FIELD_ACCOUNT_OFFICE_CITY"
        +            },
        +            {
        +              "const": "FILTER_FIELD_ACCOUNT_REFERENCE_ID",
        +              "description": "Filter by the target account's CRM record ID — exact match on reference_id (e.g. Salesforce 18-character Account ID '001xx000003DGbQAAW', HubSpot company ID). Values are CRM IDs, NOT internal UUIDs. Use directly when the user supplies Salesforce/HubSpot IDs — do NOT call search_accounts_with_filters first to resolve them to UUIDs. Pass the id exactly as the CRM stores it: a 15-character Salesforce short id does not match the stored 18-character form, and the match is silent — wrong form returns zero rows, not an error. Only CRM-sourced accounts have a CRM id; accounts created inside Boomerang carry an internal 'BOOM-…' reference_id and never match here. Multiple values are OR-combined.",
        +              "title": "FILTER_FIELD_ACCOUNT_REFERENCE_ID"
        +            }
        +          ]
        +        },
        +        "operator": {
        +          "description": "How values are matched. Omit (or 'IN') to keep only rows matching any of the values — the default. Use 'NOT_IN' (aliases: 'NOT_EQUAL_TO', 'NE') to EXCLUDE rows matching any of the values, e.g. field=FILTER_FIELD_ACCOUNT_CATEGORY, operator='NOT_IN', values=['CUSTOMER'] returns paths to accounts that are not customers. A NOT_IN filter keeps rows where the entity exists but the field has no value on record, and excludes paths that have no such entity at all — 'account category not CUSTOMER' returns only paths that target an account, never User→Contact paths. Text filters (names, titles, domains, emails) match by substring, so NOT_IN on them excludes every row CONTAINING a value, not only exact matches — 'account name not [Acme]' also drops 'Acme Holdings'. Not supported on FILTER_FIELD_INCLUDE_LEFT_TRACKED_COMPANY — pass 'true'/'false' with IN instead.",
        +          "type": "string"
        +        },
        +        "values": {
        +          "description": "One or more filter values. Multiple values are OR-combined within the same field, AND across different fields. For FILTER_FIELD_SENIORITY use stored values 'Owner/CXO', 'VP', 'DIRECTOR', 'MANAGER', 'IC' (OWNER_CXO alias accepted). For FILTER_FIELD_STRENGTH use: 'CONFIRMED', 'STRONG', 'LESS_LIKELY', 'UNLIKELY'. For FILTER_FIELD_CATEGORY use category UUIDs resolved from get_workspace_categories (filter to SUPER_CONNECTORS, match by label, use id). For FILTER_FIELD_RELATIONSHIP_PATH_TYPE use RelationshipPathType enum names as strings — User–Contact: 'LINKEDIN_CONNECTION', 'WORK_OVERLAP', 'EDUCATION_OVERLAP', 'CALENDAR_EVENT', 'SELF_DECLARED_CONTACT', 'SELF_DECLARED_CONTACT_DONT_KNOW', 'SUPER_CONNECTOR_APPROVED', 'SUPER_CONNECTOR_DECLINED'; User–Account: 'BOARD_MEMBER', 'COMMON_BOARD_HOP', 'ADVISOR', 'LEADERSHIP', 'EMPLOYEE', 'INVESTOR', 'ACCOUNT_ALUMNI', 'SELF_DECLARED_ACCOUNT', 'SELF_DECLARED_ACCOUNT_DONT_KNOW'; Company–Account: 'COMMON_INVESTOR', 'COMMON_INVESTOR_HOP', 'PORTFOLIO'; Contact–Account: 'COMPANY_ALUMNI'; Account insight: 'ACCOUNT_INSIGHT_BOARD_ADVISOR', 'ACCOUNT_INSIGHT_BOARD_ADVISOR_VIA_CONTACT'. For FILTER_FIELD_CONFIDENCE use: 'High', 'Medium', 'Low'. For FILTER_FIELD_INTRO_VALUE use: 'High', 'Medium', 'Low'. For FILTER_FIELD_SOURCE_ACCOUNT_ID/FILTER_FIELD_SOURCE_CONTACT_ID use UUIDs (resolve via search_accounts_with_filters or search_contacts first). For FILTER_FIELD_ACCOUNT_REFERENCE_ID pass CRM record IDs as-is (e.g. Salesforce '001xx000003DGbQAAW') — exact match, no UUID resolution needed. For FILTER_FIELD_ACCOUNT_ICP use: 'MATCH', 'NO_MATCH', 'NO_DATA', 'NO_ICP_DEFINED', 'PRE_MATCH', or the sentinel 'null' to match accounts with no ICP value set. Person-name filters (FILTER_FIELD_SUPER_CONNECTOR_NAME, FILTER_FIELD_CONTACT_NAME, FILTER_FIELD_ACCOUNT_OWNER_NAME, FILTER_FIELD_SOURCE_ACCOUNT_NAME, FILTER_FIELD_SOURCE_CONTACT_NAME): pass ONE first or last name token per value — never a full name like 'Jane Doe' or 'Garuda Ventures' as a single string, which silently returns zero results. Prefer ID-based filters when UUIDs are known.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
  7. 18 tool updates
    • Removedadd_slack_reaction
    • Removedfetch_channel_history
    • Removedfetch_slack_thread
    • Removedfind_slack_channel
    • Removedget_managed_calendar_status
    • Removedget_managed_slack_status
    • RemovedGOOGLECALENDAR_CREATE_EVENT
    • RemovedGOOGLECALENDAR_DELETE_EVENT
    • RemovedGOOGLECALENDAR_EVENTS_LIST
    • RemovedGOOGLECALENDAR_FIND_EVENT
    • RemovedGOOGLECALENDAR_UPDATE_EVENT
    • Removedlist_slack_conversations
    • Removedread_slack_file
    • Removedresolve_slack_user
    • Removedsearch_slack_messages
    • Removedsend_slack_message
    • Removedsend_slack_user_message
    • Removedupdate_slack_message
  8. 5 tool updates
    • Removedbuild_slack_table
    • Removedbuild_slack_table_from_json
    • Removedresolve_slack_thread_context
    • Removedstage_slack_csv_export
    • Removedstage_slack_csv_exports
  9. 93 tool updates
    • Changedadd_role1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedadd_slack_reaction1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedadd_super_connector1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedaggregate1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedassign_tags_by_name1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedbuild_slack_table1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedbuild_slack_table_from_json1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedbulk_set_account_category1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedcreate_accounts1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedcreate_crm_field_mapping1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedcreate_crm_prepared_statement1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedcreate_crm_specification1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedcreate_self_declared_relationship1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedcreate_tag1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedcreate_workspace_member1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • ChangedcreateWorkflowTrigger1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changeddelete_scoped_memory1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changeddescribe_schema1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedevaluate_work_overlap_contacts1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedfetch_channel_history1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedfetch_slack_thread1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedfind_companies1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedfind_slack_channel1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedget_account_categories1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedget_company_profile1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedget_crm_specification1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedget_current_user1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedget_current_workspace1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedget_draft_by_type1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedget_entity_tags1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedget_managed_calendar_status1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedget_managed_slack_status1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedget_person_by_linkedin_handle1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedget_power_user_job_changes1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedget_referrer_request_for_referrer_by_id1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedget_scoped_memory1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedget_super_connector_metadata1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedget_super_connector_metadata_bulk1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedget_unique_filter_options1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedget_user_by_email1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedget_user_profile1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedget_workspace_categories1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • ChangedgetEmailExtractionJobStatus1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • ChangedGOOGLECALENDAR_CREATE_EVENT1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • ChangedGOOGLECALENDAR_DELETE_EVENT1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • ChangedGOOGLECALENDAR_EVENTS_LIST1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • ChangedGOOGLECALENDAR_FIND_EVENT1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • ChangedGOOGLECALENDAR_UPDATE_EVENT1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedintro_request_get_current_state1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedintro_request_get_state_machine_transitions1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedintro_request_send_state_change_event1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedlist_linkedin_engagement_activities1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedlist_slack_conversations1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedlist_tags1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • ChangedlistTriggerTemplates1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • ChangedlistWorkflowTriggers1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedmerge_workspace_members1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedpreview_people_query1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedquery_content1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedread_slack_file1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedreferrer_request_get_current_state1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedreferrer_request_get_state_machine_transitions1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedreferrer_request_send_state_change_event1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedremove_entity_tags1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedremove_role1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedrequest_intro1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedresolve_slack_thread_context1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedresolve_slack_user1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedsearch_accounts_with_filters1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedsearch_contacts1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedsearch_intro_request1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedsearch_people_by_location_and_seniority1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedsearch_people_in_companies1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedsearch_slack_messages1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedsearch_users1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedsearch_warm_intro_relationships1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedsearch_workspace_members1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedsearch_workspaces1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedsend_email1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedsend_slack_message1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedsend_slack_user_message1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedstage_slack_csv_export1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedstage_slack_csv_exports1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedstart_super_connector_activation1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • ChangedsubmitEmailExtractionJob1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedswitch_workspace1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedupdate_company_profile1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedupdate_draft1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedupdate_slack_message1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedupdate_user_profile1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedupdate_workspace_member1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • ChangedupdateWorkflowTrigger1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
    • Changedupsert_scoped_memory1 field changed
      • removedInput schema / properties / _triggered_by
        Removed value: -{
        -  "default": "",
        -  "description": "REQUIRED. Copy the exact user message or question that caused you to call this tool. Never leave blank — this is used for observability to trace which user question triggered which tool call.",
        -  "type": "string"
        -}
  10. 96 tool updates
    • First observedadd_role
    • First observedadd_slack_reaction
    • First observedadd_super_connector
    • First observedaggregate
    • First observedassign_tags_by_name
    • First observedbuild_slack_table
    • First observedbuild_slack_table_from_json
    • First observedbulk_set_account_category
    • First observedcreate_accounts
    • First observedcreate_crm_field_mapping
    • First observedcreate_crm_prepared_statement
    • First observedcreate_crm_specification
    • First observedcreate_self_declared_relationship
    • First observedcreate_tag
    • First observedcreate_workspace_member
    • First observedcreateWorkflowTrigger
    • First observeddelete_scoped_memory
    • First observeddescribe_schema
    • First observedevaluate_work_overlap_contacts
    • First observedfetch_channel_history
    • First observedfetch_slack_thread
    • First observedfile_manager
    • First observedfind_companies
    • First observedfind_slack_channel
    • First observedget_account_categories
    • First observedget_company_profile
    • First observedget_crm_specification
    • First observedget_current_user
    • First observedget_current_workspace
    • First observedget_draft_by_type
    • First observedget_entity_tags
    • First observedget_managed_calendar_status
    • First observedget_managed_slack_status
    • First observedget_person_by_linkedin_handle
    • First observedget_power_user_job_changes
    • First observedget_referrer_request_for_referrer_by_id
    • First observedget_scoped_memory
    • First observedget_super_connector_metadata
    • First observedget_super_connector_metadata_bulk
    • First observedget_unique_filter_options
    • First observedget_user_by_email
    • First observedget_user_profile
    • First observedget_workspace_categories
    • First observedgetEmailExtractionJobStatus
    • First observedGOOGLECALENDAR_CREATE_EVENT
    • First observedGOOGLECALENDAR_DELETE_EVENT
    • First observedGOOGLECALENDAR_EVENTS_LIST
    • First observedGOOGLECALENDAR_FIND_EVENT
    • First observedGOOGLECALENDAR_UPDATE_EVENT
    • First observedintro_request_get_current_state
    • First observedintro_request_get_state_machine_transitions
    • First observedintro_request_send_state_change_event
    • First observedlist_files
    • First observedlist_linkedin_engagement_activities
    • First observedlist_slack_conversations
    • First observedlist_tags
    • First observedlistTriggerTemplates
    • First observedlistWorkflowTriggers
    • First observedmerge_workspace_members
    • First observedpreview_people_query
    • First observedquery_content
    • First observedread_file
    • First observedread_slack_file
    • First observedreferrer_request_get_current_state
    • First observedreferrer_request_get_state_machine_transitions
    • First observedreferrer_request_send_state_change_event
    • First observedremove_entity_tags
    • First observedremove_role
    • First observedrequest_intro
    • First observedresolve_slack_thread_context
    • First observedresolve_slack_user
    • First observedsearch_accounts_with_filters
    • First observedsearch_contacts
    • First observedsearch_intro_request
    • First observedsearch_people_by_location_and_seniority
    • First observedsearch_people_in_companies
    • First observedsearch_slack_messages
    • First observedsearch_users
    • First observedsearch_warm_intro_relationships
    • First observedsearch_workspace_members
    • First observedsearch_workspaces
    • First observedsend_email
    • First observedsend_slack_message
    • First observedsend_slack_user_message
    • First observedstage_slack_csv_export
    • First observedstage_slack_csv_exports
    • First observedstart_super_connector_activation
    • First observedsubmitEmailExtractionJob
    • First observedswitch_workspace
    • First observedupdate_company_profile
    • First observedupdate_draft
    • First observedupdate_slack_message
    • First observedupdate_user_profile
    • First observedupdate_workspace_member
    • First observedupdateWorkflowTrigger
    • First observedupsert_scoped_memory

Publisher details

Operator
Boomerang (BuyerAssist) · Publisher source
Operator website
https://getboomerang.ai
Vendor relationship
First-party
Restrictions
Requires a Boomerang account (paid plan). Users sign in via OAuth with their Boomerang credentials; data is scoped to their workspace.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI assistants to securely search your LinkedIn network, contacts, and DMs to find warm leads, intro paths, and hidden opportunities.
    32
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to automate sales prospecting by finding contacts by role and industry, enriching data with emails and tech stacks, scoring against ideal customer profiles, and generating personalized outreach sequences. Streamlines lead generation and sales engagement workflows through integrated research and sequence generation tools.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to find intent-signaling buyers and run LinkedIn, email, and X outreach from connected accounts while respecting platform limits. Every reply is handed back to a human for approval or decision.
    3
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables agents to search people, retrieve evidence-backed facts and timelines, prepare briefs, rank reconnect opportunities, and propose outreach while keeping writes human-approved.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources