Skip to main content
Glama

Server Details

Discover audiences, build segments, match and deliver data. Some actions count toward account usage.

Ownership verified

The last two health checks of this connector failed. If this server requires authentication, missing or expired test credentials may be the cause. A test profile lets Glama authenticate for health checks and discover tools; it is separate from your personal connections.

If you are the author, claim ownership, then add or update a test profile under Admin → Test Profile.

Status
Unhealthy
Uptime
8.1% over 36 days
OAuth
Works in Glama
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
ChatGPT
–
Claude
–

TDQS

A3.7/5.0

Scored across 60 tools

Disambiguation3/5

Descriptions work hard to steer the agent (e.g. 'use list_all_deliveries for an org-wide search', 'use discovery_count for an unsaved preview'), but several clusters remain genuinely confusable: list_deliveries vs list_all_deliveries vs list_file_match_deliveries, count_segment vs recount_audience vs discovery_count, and archive_audience vs patch_audience (which also archives). The get_* run/job family (get_match_run, get_file_match_job, get_integration_run, get_saved_integration_segment_build) and wait_for_segment vs get_segment add further near-duplicates that require careful reading rather than obvious distinction.

Naming Consistency4/5

Nearly everything is snake_case verb_noun (create_segment, get_audience, archive_segment, quote_delivery, wait_for_segment, link_audience_to_campaign), which is highly predictable. The main deviation is the discovery_* noun-prefix family (discovery_count, discovery_crosstab, discovery_lookup, discovery_overlap) and bare verbs like match_records and count_segment, which break the verb-first pattern but remain readable and internally consistent.

Tool Count2/5

60 tools is far beyond a comfortable surface even for a rich segment/audience/delivery platform; many are narrow variants (four discovery_* tools, three delivery-listing tools, four 'get a run/job' tools). The toolset should be consolidated, especially around listing and status retrieval.

Completeness4/5

Coverage is genuinely broad: CRUD-ish lifecycle for segments and audiences (create, get, list, patch, archive, duplicate, refresh, count), plus campaigns, deliveries with quoting and polling, billing status, discovery, integrations, and async workflow gates. The notable gaps are deletion (intentionally archive-only) and top-up creation—only check_topup_status exists—plus no campaign deletion.

Available Tools

60 tools
analyze_audience_uploadAnalyze Segment UploadA
Destructive
Inspect

After uploading a file to the presigned upload_url (or all same-format shards to upload_urls) returned by create_segment(subtype=matched), call this to run LLM-assisted column mapping inference. For a sharded upload, analysis runs against the first shard only — every shard is assumed to share the same schema; a mismatch fails the batch job later with a specific error, not silently here. Returns: segment_id, analysis.columns[] (each: source_column, mapped_to, inferred_type, confidence 0–1, warning), analysis.unmapped_columns[] (column headers that could not be mapped), analysis.recommendations[] (human-readable tips to improve match rates). gzip is detected from file bytes, so a missing or incorrect compression declaration is self-healed during analysis. Returns typed 422 errors for malformed gzip, format mismatch, or malformed input, and 409 FILE_NOT_YET_UPLOADED before upload. The upload is staged (create_segment sets hitl:true) — nothing has started yet. Present these results to the user and wait for their response, then call confirm_column_mappings (to start resolution) or cancel_matched_upload (to abort) — do not call wait_for_segment before confirm_column_mappings succeeds. Requires 'discovery' scope.

NameRequiredDescriptionDefault
segment_idYesThe segment_id of the matched segment returned by create_segment(subtype=matched)

Output Schema

NameRequiredDescription
analysisYes
guidanceNoInterpretation or recovery guidance for this result
count_unitNo
page_countNoNumber of objects on this page, not the organization total
segment_idYes
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A4.7/5.0
Behavior5/5

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

Adds substantial behavior beyond the annotations: sharded uploads are analyzed against the first shard only, schema mismatch fails later with a specific error, gzip is detected from bytes and self-healed, typed 422 and 409 FILE_NOT_YET_UPLOADED errors are returned, the upload is staged with hitl:true, and discovery scope is required. These details materially help the agent understand state transitions and error handling.

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

Conciseness5/5

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

The description is dense but well organized and front-loaded: it starts with the trigger condition, then covers shard behavior, return shape, errors, workflow state, next steps, and required scope. Every sentence contributes operational information for a complex workflow tool.

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 participates in a staged upload-to-confirmation workflow, the description covers the necessary preconditions, expected return structure, error conditions, and sequencing with sibling tools. Although an output schema exists and return details are not strictly required, the added context makes the definition complete for correct invocation.

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

Parameters3/5

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

Schema coverage is 100%, and the only parameter segment_id is already documented in the schema as the matched segment returned by create_segment(subtype=matched). The description references the same origin but adds no extra parameter semantics beyond what the schema already provides, so the baseline of 3 is appropriate.

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

Purpose5/5

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

States a specific action (run LLM-assisted column mapping inference) on a specific resource (an uploaded matched-segment file), and ties it directly to the create_segment(subtype=matched) upload flow. It also clearly distinguishes this analysis step from confirm_column_mappings, cancel_matched_upload, and wait_for_segment.

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

Usage Guidelines5/5

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

Explicitly says when to call this: after uploading to the presigned URL(s) from create_segment(subtype=matched). It also states the next steps in order, including presenting results to the user, waiting, then calling confirm_column_mappings or cancel_matched_upload, and explicitly warns not to call wait_for_segment before confirm_column_mappings succeeds.

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

archive_audienceArchive AudienceA
DestructiveIdempotent
Inspect

Archive a saved audience to hide it from the default list, or restore it with restore=true. Preserves its composition and delivery history. Requires the creator scope. Requires 'creator' scope.

NameRequiredDescriptionDefault
restoreNoTrue restores an archived audience to active
audience_idYesSaved audience ID

Output Schema

NameRequiredDescription
statusYes
guidanceNoInterpretation or recovery guidance for this result
count_unitNo
page_countNoNumber of objects on this page, not the organization total
audience_idYes
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A3.8/5.0
Behavior4/5

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

Adds real value beyond the annotations: it clarifies that composition and delivery history are preserved, so destructiveHint=true means only visibility is affected, not data loss. It also discloses the required creator scope. The scope sentence is duplicated rather than expanding into further behavior (e.g., what happens to linked campaigns).

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 behavior and effect are front-loaded, but the final two sentences repeat the same creator-scope requirement verbatim ('Requires the creator scope. Requires "creator" scope.'), which is wasted space in an otherwise short 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 two-parameter mutation with full schema coverage, rich annotations, and an output schema, the description covers effect, reversibility, data preservation, and auth prerequisites. Only the duplicated scope line and the absence of any dependency notes (e.g., effect on campaigns) keep 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 100%, so both parameters are already documented, and the description's note that restore=true returns the audience to active merely mirrors the schema text. Baseline 3 applies when the schema does the heavy lifting.

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

Purpose4/5

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

States a specific verb (archive) and resource (saved audience) and explains the effect: it hides the audience from the default list, with restore=true as the inverse. It does not explicitly distinguish itself from nearby siblings like patch_audience or duplicate_audience, so it stops short of a 5.

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

Usage Guidelines4/5

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

Gives clear usage context: use it to hide an audience from the default list, and use restore=true to bring it back. It lacks explicit exclusions (e.g., 'use patch_audience instead to edit fields'), so no alternative routing guidance is provided.

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

archive_segmentArchive SegmentA
DestructiveIdempotent
Inspect

Archive a segment to hide it from the default segment catalog and new audience compositions, or restore an archived one back to active. Always safe and fully reversible: archiving never affects audiences that already reference this segment — their composition and record count are unchanged. This is distinct from permanently deleting a segment, which does change referencing audiences' composition and cannot be undone. Requires the creator scope. Requires 'creator' scope.

NameRequiredDescriptionDefault
restoreNoPass true to restore an archived segment back to active instead of archiving it
segment_idYesThe segment ID to archive or restore

Output Schema

NameRequiredDescription
statusYes
guidanceNoInterpretation or recovery guidance for this result
count_unitNo
page_countNoNumber of objects on this page, not the organization total
segment_idYes
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A4/5.0
Behavior4/5

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

Strongly exceeds the annotations: it discloses reversibility, that referencing audiences keep their composition and record count, and that a creator scope is required. The one tension is 'Always safe and fully reversible' versus destructiveHint=true — not a true contradiction since archiving does mutate state and is reversible, but the framing softens the hint rather than explaining why it is set.

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 content is well front-loaded, but the scope requirement is stated twice — 'Requires the creator scope. Requires 'creator' scope.' — which is a visible duplication artifact suggesting template concatenation. Trimming that redundancy would tighten an otherwise efficient 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?

With an output schema present, the description covers everything an agent needs to call correctly: mutation semantics, reversibility, side-effect boundaries, and auth scope. Only the duplicated scope line keeps it from being fully clean.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents both segment_id and the restore boolean. The description's 'or restore an archived one back to active' reinforces the restore semantics but adds no syntax, defaults, or constraints beyond what the schema states; baseline 3 applies.

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

Purpose5/5

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

The description pairs specific verbs (archive, restore) with a specific resource (segment) and states the exact effect: hidden from the default catalog and new audience compositions, with the inverse restore behavior spelled out. It also explicitly separates this operation from permanent deletion, so an agent can distinguish it from the destructive alternative 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?

It gives clear when-to-use guidance (archive vs. restore via the same tool) and an explicit when-not boundary by contrasting it with permanent deletion. The only shortfall is that the alternative is described conceptually rather than by a sibling tool name, so the agent isn't routed to a concrete other tool.

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

build_saved_integration_segmentBuild Segment from Saved Integration MatchesA
Destructive
Inspect

Create a matched segment, or add unique saved identities to a compatible standalone matched segment. Call preview_saved_integration_segment first and confirm the exact counts and target with the user. Adding to an existing segment replaces its current version. Completion or failure may notify configured organization webhooks, subscriptions, and opted-in user email. This never reruns matching, charges again, or creates an Audience automatically. Requires 'creator' scope.

NameRequiredDescriptionDefault
modeYesCreate a new matched segment or add identities to an existing one
filtersNoSelect saved matches by provider, connection, run, source kind, or time window
request_idNoStable idempotency key; generated when omitted
segment_nameNoName for a new matched segment
target_segment_idNoExisting matched segment ID when mode is add_to_segment

Output Schema

NameRequiredDescription
modeYes
statusYes
previewYes
guidanceNoInterpretation or recovery guidance for this result
count_unitNo
page_countNoNumber of objects on this page, not the organization total
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
failure_codeYes
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
collection_idYes
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
identity_countYes
failure_messageYes
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions
target_segment_idYes
materialization_idYes

TDQS

A4.9/5.0
Behavior5/5

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

Annotations flag destructiveHint=true, but the description supplies the specifics: adding replaces the existing segment version, completion/failure may fire webhooks, subscriptions, and opted-in email, and no matching is rerun, no charge is incurred, and no Audience is auto-created. The 'creator' scope requirement is also stated, none of which appears in the annotations.

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

Conciseness5/5

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

Six short sentences, front-loaded with the action and the required preview step, followed by consequences. Every sentence contributes a distinct constraint or side effect; nothing is redundant with the schema or annotations.

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, open-world mutation with a nested filter object and an output schema, the description covers the prerequisite, the destructive side effect, cost/non-effects, authorization scope, and notification behavior. An agent has everything needed to call it safely without reading further docs.

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

Parameters4/5

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

Schema coverage is 100%, so parameters are already documented; the description still adds meaning by constraining target_segment_id to a 'compatible standalone' segment and framing mode as new-vs-add. It does not explain filter interaction or the idempotency key beyond what the schema states, keeping it short of the schema baseline plus full coverage.

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

Purpose5/5

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

Specific verb plus resource ('create a matched segment' / 'add unique saved identities to a compatible standalone matched segment') with both modes named. The phrase 'saved identities' and 'never reruns matching' distinguish it cleanly from create_segment, match_records, and create_audience.

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 prerequisite workflow ('Call preview_saved_integration_segment first') and a human-in-the-loop condition ('confirm the exact counts and target with the user'). It also narrows the add_to_segment case to a 'compatible standalone' segment, telling the agent when the mode is valid.

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

cancel_matched_uploadCancel Matched UploadA
DestructiveIdempotent
Inspect

Abort a staged matched-segment upload without confirming. Call this when the user declines to proceed after reviewing analyze_audience_upload's results. Clears the staged upload — no file move, no status/mapping-state change. The existing segment is retained; cancellation does not delete it or complete matching. Inspect it with get_segment and archive it with archive_segment if no longer needed. Idempotent. Pass exactly one of segment_id or audience_id — use audience_id when only the audience is known (it resolves to that audience's matched member segment server-side). Requires 'creator' scope.

NameRequiredDescriptionDefault
segment_idNoThe segment_id returned by create_segment(subtype=matched)
audience_idNoThe audience_id, if segment_id isn't known

Output Schema

NameRequiredDescription
okYesWhether the requested action succeeded
guidanceNoInterpretation or recovery guidance for this result
count_unitNo
page_countNoNumber of objects on this page, not the organization total
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the annotations: clarifies that the destructiveHint covers only the staged upload (no file move, no status/mapping-state change), that the existing segment survives cancellation, that the call is idempotent, and that 'creator' scope is required. This resolves the ambiguity an agent would otherwise have about destructiveHint=true.

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

Conciseness4/5

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

Front-loaded with the action and trigger, and every sentence carries information (behavior, alternatives, idempotency, param exclusivity, auth). Slightly dense at six sentences, but there is no 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?

An output schema exists, so return values need not be explained. Given that, the description covers everything an agent needs: trigger, side effects and non-effects, post-cancellation handling, idempotency, parameter selection, and auth scope.

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

Parameters4/5

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

Schema descriptions already cover both params, but the description adds a rule the schema does not enforce: pass exactly one of segment_id or audience_id, and that audience_id resolves server-side to the matched member segment. Useful added semantics beyond the 100%-covered 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: abort a staged matched-segment upload. Explicitly ties itself to the analyze_audience_upload workflow, making it distinguishable from generic cancel/delete siblings like archive_segment.

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 exact trigger (user declines to proceed after reviewing analyze_audience_upload results) and routes the agent to alternatives: get_segment to inspect, archive_segment if the retained segment is no longer needed. 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.

check_balanceCheck BalanceA
Read-onlyIdempotent
Inspect

Return customer-facing billing status: active contract, rated current-period spend, available/committed/promotional cents, active reservations, accepted pending usage, auto-recharge status, payment readiness, and projection staleness. For parent-billed orgs, consumer_money is only that child's attributed usage; agency balances and invoices are not exposed. Requires 'account-read' scope.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
billingYes
guidanceNoInterpretation or recovery guidance for this result
count_unitNo
page_countNoNumber of objects on this page, not the organization total
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
operationalYes
billing_modeYesWho bills this account, or native_setup_required
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare a safe read-only, idempotent operation. The description adds valuable behavioral context: the data is customer-facing, agency balances and invoices are not exposed, and parent-billed orgs see only the child's attributed usage.

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

Conciseness4/5

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

The description is front-loaded with what is returned, followed by key caveats and the required scope. The first sentence is a long but necessary list; overall it is efficient with little waste.

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 covering return values and annotations covering safety, the description adds the important data-exposure caveats and scope requirement. It is nearly complete, though sibling differentiation 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 no parameters, so there is nothing for the description to clarify beyond the schema. Baseline score for zero parameters 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?

The description gives a specific verb ('Return') and resource ('customer-facing billing status') and enumerates the fields returned. It is clear what the tool does, but it does not distinguish itself from sibling tools like check_topup_status or get_account_usage.

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

Usage Guidelines3/5

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

Implies usage by describing the returned billing status and states a prerequisite ('Requires account-read scope'), but gives no explicit when-to-use guidance or alternatives versus sibling balance/usage tools.

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

check_topup_statusCheck Top-up StatusA
Read-onlyIdempotent
Inspect

Read verified state for an existing top-up request without creating a charge. If customer action is required, direct the user to Account → Billing in Infinite Audience; this tool does not return a hosted payment URL. It cannot list top-ups: supply the request_id from the original top-up confirmation, not an invoice/payment ID; if unavailable, ask the account owner to review Account → Billing. Requires 'account-read' scope.

NameRequiredDescriptionDefault
request_idYesIdempotent top-up request ID returned when the request was created

Output Schema

NameRequiredDescription
statusYesVerified state of the existing top-up request
guidanceNoInterpretation or recovery guidance for this result
next_stepNoInstruction to finish payment in Infinite Audience, when needed
count_unitNo
page_countNoNumber of objects on this page, not the organization total
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description adds context those fields cannot express: no charge is created, no hosted payment URL is returned, and the call requires the 'account-read' scope. The auth requirement and the explicit statement of what is NOT returned are exactly the kind of disclosure an agent needs before calling.

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

Conciseness5/5

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

Four short sentences, front-loaded with the read-only constraint, then the no-URL caveat, then the ID requirement and remedy, then the scope. Every sentence carries information an agent would otherwise have to discover through failure.

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 an output schema present, return values need no explanation. Given a single required parameter, annotations covering the safety profile, and this description covering provenance, fallback, scope, and what is not returned, an agent has everything needed to call it correctly or route the user elsewhere.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description earns extra by clarifying provenance ('from the original top-up confirmation') and by excluding a plausible wrong input ('not an invoice/payment ID') – a disambiguation the schema's 'returned when the request was created' wording does not make explicit enough to prevent a mismatched-ID lookup.

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 ('read verified state for an existing top-up request') and immediately scopes it against write operations ('without creating a charge'). It implicitly separates itself from list-style siblings by declaring 'It cannot list top-ups', but never explicitly contrasts with the closest sibling, check_balance, so the reader must infer that boundary.

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 (an existing top-up request whose ID you hold), explicit when-not-to-use ('cannot list top-ups'), a concrete alternative when the prerequisite is missing ('ask the account owner to review Account → Billing'), and a fallback for customer action. 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.

confirm_column_mappingsConfirm Column MappingsA
Destructive
Inspect

Confirm column mappings for a staged matched-segment upload, starting identity resolution. Call this after analyze_audience_upload has been reviewed with the user and they approve (with or without edits). This moves the staged file into place — nothing runs before this call succeeds. Only call wait_for_segment after this returns ok. Pass exactly one of segment_id or audience_id — use audience_id when only the audience is known (it resolves to that audience's matched member segment server-side). When using audience_id, column_mappings is required (no auto-inference fallback on that path). When using segment_id, column_mappings may be omitted — the platform re-analyzes the active upload itself and accepts its own suggested mapping as-is. Requires 'creator' scope.

NameRequiredDescriptionDefault
segment_idNoThe segment_id returned by create_segment(subtype=matched)
audience_idNoThe audience_id, if segment_id isn't known
column_mappingsNoMap of source column name -> standard identity attribute name. Valid targets: iag_person_id, full_name, first_name, middle_name, last_name, name_suffix, address_1, address_2, city, state, zip, email, phone, dob, email_sha256, phone_sha256, emails, phones, addresses, emails_sha256, phones_sha256 (the last 7 — hashed/plural/array variants — are LLM/programmatic mapping targets only, not offered in a human dropdown). Use "(skip)" to exclude a column. For segment_id: omit to have the platform accept its own fresh analysis of the upload as-is. For audience_id: required. Always send the FULL mapping set (not just user-edited columns); this replaces the mappings entirely rather than merging.

Output Schema

NameRequiredDescription
okYesWhether the requested action succeeded
guidanceNoInterpretation or recovery guidance for this result
count_unitNo
page_countNoNumber of objects on this page, not the organization total
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
column_mappingsYes
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the destructive/openWorld annotations, it discloses the concrete side effect ('moves the staged file into place'), the blocking behavior ('nothing runs before this call succeeds'), and an auth requirement ('Requires creator scope') — all things annotations cannot convey. It also warns that the audience_id path has no inference fallback, which is real behavioral risk information.

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

Conciseness5/5

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

The purpose and the approval prerequisite are front-loaded, then the branching rules follow in order of decision. Sentences are dense with constraints rather than filler, and nothing is repeated except the ordering rule, which is reinforced for safety.

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, non-idempotent staging tool with an output schema, the description covers preconditions, ordering, scope, and branch-specific parameter rules. The one gap is retry/re-entry behavior: it does not say whether calling again after a partial failure is safe or what happens to the staged file, despite the non-idempotent and destructive hints.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description earns extra credit by adding the mutual-exclusivity constraint between segment_id and audience_id (not encoded via oneOf in the schema) and by explaining the server-side resolution of audience_id to a matched member segment. Most of the column_mappings requirements, however, are already duplicated in the schema property description rather than added here.

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 and resource ('Confirm column mappings for a staged matched-segment upload') and states the downstream effect ('starting identity resolution'). This distinguishes it cleanly from analyze_audience_upload (preview) and wait_for_segment (polling), so an agent can place it in the workflow 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?

Gives explicit preconditions ('Call this after analyze_audience_upload has been reviewed with the user and they approve'), explicit sequencing ('Only call wait_for_segment after this returns ok'), and an exclusivity rule ('Pass exactly one of segment_id or audience_id') with a decision rule for which branch to pick.

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

count_segmentCount SegmentA
DestructiveIdempotent
Inspect

Refresh the stored record_count of one saved segment, not its parent audience. Runs a fresh BigQuery count over the segment's own definition for any subtype (filter, matched, similarity, propensity), updates segment.record_count. Returns {segment_id, record_count}. For an unsaved population preview use discovery_count; for a composed audience snapshot use recount_audience. Requires 'discovery' scope.

NameRequiredDescriptionDefault
segment_idYesThe segment ID to recount

Output Schema

NameRequiredDescription
guidanceNoInterpretation or recovery guidance for this result
count_unitNo
page_countNoNumber of objects on this page, not the organization total
segment_idYes
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
record_countYesFresh segment count, or null when pending or failed
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already flag readOnlyHint=false, destructiveHint=true and idempotentHint=true; the description adds valuable context beyond them: it explains the mutation is an overwrite of segment.record_count via a fresh BigQuery count, and it declares the required 'discovery' scope. It does not mention query cost or rate limits for the BigQuery recount, which would matter for planning — hence 4 rather than 5. No contradiction with the annotations.

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

Conciseness5/5

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

Four tight sentences, front-loaded with what it does and what it does not touch, followed by mechanism, return shape, alternatives, and the scope prerequisite. Every clause earns its place.

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

Completeness5/5

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

Given a one-param tool with an output schema, an auth scope requirement, and many sibling tools, the description is complete: it covers mechanism, mutation target, return shape, subtype breadth, and alternatives. 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.

Parameters3/5

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

Single parameter with 100% schema description coverage, so the schema already carries the meaning. The description adds only that the count runs over 'the segment's own definition', which is scope context rather than a new param semantic. Baseline 3 is correct.

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: refreshing the stored record_count of one saved segment, explicitly NOT its parent audience. The subtype coverage (filter, matched, similarity, propensity) further pins the scope so an agent can distinguish it from recount_audience and discovery_count 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?

Names both alternatives and the exact condition that selects each: discovery_count for unsaved population previews, recount_audience for composed audience snapshots. Use-vs-alternative routing is fully explicit.

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

create_audienceCreate AudienceAInspect

Create an audience from one or more existing segments. Audiences are the delivery payload — they have no subtype. To create typed cohorts (filter, matched, similarity, propensity), use create_segment instead. Accepts segment_refs: [{segment_id, role: include|exclude}] to compose the audience with per-segment inclusion/exclusion control. set_logic controls how include-role segments are combined (union or intersection). Returns audience_id, status and campaign_id immediately. Use record_count only for a verified count of this exact composition. Optional campaign_id links the new audience to that campaign (an audience belongs to at most one); omit it to leave the audience unlinked — link it later with link_audience_to_campaign. Requires 'creator' scope.

NameRequiredDescriptionDefault
nameYesHuman-readable audience name
set_logicNoHow include-role segments are combined: 'union' (OR, default) or 'intersection' (AND)union
campaign_idNoOptional campaign to link the new audience to (see list_campaigns). An unknown ID is rejected with INVALID_CAMPAIGN_ID and nothing is created.
record_countNoLegacy caller-provided count for this exact composition. Prefer omitting it and calling recount_audience. The server may reuse a valid saved member count; otherwise record_count is null
segment_refsYesArray of segment references with roles. Must include at least one include-role segment.

Output Schema

NameRequiredDescription
nameYes
statusYes
guidanceNoInterpretation or recovery guidance for this result
set_logicNoHow included segments combine; excluded segments always subtract
count_unitNo
page_countNoNumber of objects on this page, not the organization total
audience_idYes
campaign_idNo
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
segment_idsYes
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
record_countNoSaved composition count; null is unknown. Use recount_audience for a current value.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions
excluded_segment_idsYes

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the annotations, it discloses the required 'creator' scope, the immediate return fields, and the cardinality constraint that an audience belongs to at most one campaign. It also clarifies that record_count is only for a verified count of the exact composition.

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

Conciseness5/5

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

The description is front-loaded with purpose and sibling differentiation, then moves through composition, return behavior, optional parameters, and auth scope. Despite its length, each sentence supports correct invocation or disambiguation.

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 has five parameters, an output schema, and annotations, the description covers the critical creation flow, segment composition, campaign linking, return timing, and permission requirement. No material decision-making detail is missing for an agent to call it correctly.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds useful operational meaning around record_count and campaign_id, including omitting campaign_id to link later, though much of the per-parameter detail is already present in the schema.

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

Purpose5/5

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

The description gives a specific verb and resource: 'Create an audience from one or more existing segments.' It also distinguishes audiences from typed cohorts and explicitly routes agents to create_segment for that separate purpose.

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

Usage Guidelines5/5

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

It states the key alternative: use create_segment for typed cohorts such as filter, matched, similarity, and propensity. It also explains when to use campaign_id versus linking later with link_audience_to_campaign.

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

create_campaignCreate CampaignAInspect

Create a new campaign workspace with an optional brief and goals. Use when the user wants to start a new initiative, project, or campaign. Returns the new campaign object including its id. Requires 'creator' scope.

NameRequiredDescriptionDefault
nameYesDisplay name for the campaign
descriptionNoCampaign brief, goals, intended market, and desired outcomes

Output Schema

NameRequiredDescription
idYes
nameYes
statusYes
guidanceNoInterpretation or recovery guidance for this result
audiencesYes
count_unitNo
page_countNoNumber of objects on this page, not the organization total
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare this is a non-read-only, non-destructive, non-idempotent, closed-world operation, so the safety profile is covered. The description adds genuinely new context by stating the "'creator' scope" authorization requirement and noting the new campaign object with its id is returned. It does not warn that retries create duplicates (relevant given idempotentHint=false), which is the main 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.

Conciseness5/5

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

Three short sentences with the purpose stated first, then the usage trigger, then the return value and auth requirement. Nothing is padded and no sentence is redundant with the point of being noise.

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 two-parameter create with a 100% coverage schema, an output schema, and full annotations, the description covers purpose, trigger, return, and auth scope. The return-value sentence is somewhat redundant given the output schema, and there is no guidance on duplicate creation or campaign limits, so it is strong but not exhaustive.

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

Parameters3/5

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

Schema description coverage is 100% with only two flat parameters, so the schema already explains name and description fully. The description restates "optional brief and goals," which maps loosely to the description field but adds no syntax, limits, or format guidance beyond the schema.

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

Purpose4/5

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

The description opens with a specific verb+resource ("Create a new campaign workspace") and adds scope detail (optional brief and goals), so an agent will not confuse it with update_campaign, get_campaign, or list_campaigns. It stops short of naming any sibling explicitly, so it lands just under the top mark.

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 the user wants to start a new initiative, project, or campaign" gives a clear positive trigger with concrete user-intent phrasing. There is no explicit exclusion or alternative-path guidance (e.g., when to update an existing campaign instead), which keeps it from a 5.

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

create_segmentCreate SegmentA
Destructive
Inspect

Create a segment of the specified subtype. Segments are the typed cohort definitions — audiences are composition wrappers built from segments. filter: reusable filter definition — returns immediately with status active and an unset count unless count_snapshot is supplied. Call count_segment to calculate its saved count. similarity: provide seed_description (natural language) OR seed_segment_id — triggers async icp-segment workflow, returns status pending + workflow_run_id. Call wait_for_segment(segment_id) to block until active. propensity: provide positive_class_segment_id — triggers async ml-model workflow, returns status pending + workflow_run_id. Training can take 10–60 min. Call wait_for_segment(segment_id) to monitor. matched: upload a file — returns upload_url (30-min presigned), or upload_urls (an array, one per shard) when shard_count > 1. The upload is staged (not resolved automatically): PUT the raw file bytes to each returned URL with Content-Type matching file_format: csv=text/csv, avro=application/avro, json=application/json, jsonl=application/x-ndjson. Do not include the MCP bearer token in this upload. After uploading (all shards, if multiple), call analyze_audience_upload(segment_id) (analyzes the first shard only when sharded — all shards must share one schema), present the mappings to the user and wait for their response, then confirm_column_mappings(segment_id) to start resolution (or cancel_matched_upload(segment_id) if they decline) — only THEN call wait_for_segment(segment_id). Upload, analysis, and completed matched resolution emit no usage; the first successful delivery emits one aggregate platform_match usage set together with normal delivery usage. HITL: similarity and propensity default to hitl=false (auto-proceed through all gates). Set hitl=true to pause at review gates. Use file_format to specify csv (default), avro, json, or jsonl and compression=gzip for gzip bytes. Set shard_count > 1 for multiple same-format files; all shards must use the same compression and every CSV shard must include its own header row. Set create_audience=true to automatically wrap the new segment in an audience for immediate delivery. Optional campaign_id records the campaign the segment is built for and links that wrapper audience to it; omit it to leave both outside any campaign. Requires 'creator' scope.

NameRequiredDescriptionDefault
hitlNo(similarity/propensity) Enable human-in-the-loop gates. Default false = auto-proceed through all gates. Set true for interactive review.
nameYesHuman-readable segment name
filtersNo(filter) AND-combined conditions, reusable directly from discovery_count. Supply filters OR filter_groups, not both.
subtypeYesSegment subtype
campaign_idNoOptional campaign this segment is built for (see list_campaigns). Stored as origin_campaign_id; with create_audience, the wrapper audience is linked to it. An unknown ID is rejected with INVALID_CAMPAIGN_ID and nothing is created.
compressionNo(matched) Input transport compression. Use gzip for .csv.gz/.json.gz/.jsonl.gz bytes; object names remain based on file_format. gzip is NOT supported with file_format=avro (avro is already internally compressed) — the API rejects that combination with UNSUPPORTED_INPUT_COMPRESSION.none
file_formatNo(matched) Input file format. csv (default): every column is a single scalar value — multi-value/array fields are not supported. avro/json/jsonl: native array columns supported.
match_levelNo(matched) Restrict identity resolution to these match levels (Individual/Household/Digital/Spatial/Address). Omit to use the platform default (all levels).
shard_countNo(matched) Set > 1 for multiple same-format shards. All shards must use the same compression; every CSV shard must contain its own header row.
webhook_urlNo(similarity/propensity/matched) URL to receive a POST notification when the segment becomes active
record_limitNo(filter) Cap the segment at this many people (e.g. "up to 1,000"). Requires State, City, or ZIP Code filters narrowing every OR branch to at most 100 three-digit ZIP prefixes. Audiences and deliveries inherit the cap.
spatial_modeNo(matched) Spatial trade-area mode. residential is the default; use work for workplace-oriented spatial matching, or auto for dynamic commercial workplace routing.residential
filter_groupsNo(filter) Grouped conditions, reusable directly from discovery_count. Supply filters OR filter_groups, not both.
count_snapshotNo(filter) Existing verified count snapshot to store on the new segment; omit to leave the count unknown, then call count_segment for a fresh count
create_audienceNoWhen true, automatically creates an audience wrapper around the new segment for immediate delivery use. Returns both segment_id and audience_id.
seed_segment_idNo(similarity) Existing segment ID to use as seed — provide either seed_description or seed_segment_id, not both
seed_descriptionNo(similarity) Natural language ICP narrative describing the target segment persona
positive_class_segment_idNo(propensity) Segment ID whose members represent the positive class for ML training

Output Schema

NameRequiredDescription
nameYes
statusYes
subtypeYes
guidanceNoInterpretation or recovery guidance for this result
count_unitNo
page_countNoNumber of objects on this page, not the organization total
segment_idYes
upload_urlNo
audience_idNo
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
upload_urlsNo
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
record_countNoStored count; null means unknown. Call count_segment for a current count.
record_limitNoMaximum members; null means no explicit cap
filter_groupsNoComplete saved filter definition; one AND group also represents a simple flat filter list
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
current_versionNo
workflow_run_idNo
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions
upload_expires_atNo

TDQS

A4.8/5.0
Behavior5/5

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

Adds substantial context beyond annotations: async workflow behavior, pending statuses, 10–60 minute training, staged uploads with presigned URLs, token-handling warning, HITL defaults, usage-emission behavior, and creator scope requirement. These details materially help an agent understand side effects and operational sequencing.

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

Conciseness4/5

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

The description is long but justified by four distinct subtypes and a complex matched-upload workflow. It is front-loaded with purpose and subtype distinctions, though the single dense paragraph and repeated wait_for_segment guidance reduce readability slightly.

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 an output schema and rich annotations, the description still covers the operational gaps an agent needs: subtype-specific prerequisites, async monitoring, upload resolution sequence, HITL behavior, scope requirements, and campaign linkage. Nothing critical appears missing for correct invocation.

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

Parameters4/5

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

Schema coverage is 100%, so parameter documentation is already strong, but the description adds subtype-specific meaning: seed_description vs seed_segment_id, positive_class_segment_id, file_format/compression/shard interactions, campaign_id linkage, and create_audience behavior. It does not explain every parameter, but it adds useful semantics beyond the schema.

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

Purpose5/5

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

States a specific verb and resource ("Create a segment") and immediately clarifies segment subtypes and how segments differ from audiences. The subtype-specific behavior makes it easy to distinguish from sibling tools like create_audience, count_segment, and wait_for_segment.

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 explains when to use each subtype and which follow-up tools to call: count_segment for filter counts, wait_for_segment for async similarity/propensity, and the analyze/confirm/cancel sequence for matched uploads. It also names the alternative actions when upload mappings are declined.

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

deliver_audienceDeliver AudienceA
Destructive
Inspect

Deliver an audience as a download. LiveRamp and Narrative remain unavailable until their partner pushes can confirm data egress; they cannot create delivery or usage charges. Download has no destination surcharge but still carries base/field delivery usage. Supply template_id OR field_list — not both. Call quote_delivery first: pricing depends on the audience version, selected fields, output settings, and current licensing. Returns delivery_id, status, cost, and (for download) download_urls[] once completed. Requires 'creator' scope.

NameRequiredDescriptionDefault
field_listNoCustom list of field names (alternative to template_id)
audience_idYesAudience to deliver
destinationYesActive delivery destination
template_idNoEnrichment template ID from get_field_catalog()
output_formatNoOutput file format for download deliveries. Omit to auto-detect: matched audiences default to their uploaded file format; all others default to csv.
include_unmatchedNo(matched subtype) Include rows that did not resolve to a real graph match — these get a best-effort derived iag_person_id (or null), not a real match. Defaults to true.
output_compressionNoExplicit download compression. gzip supports csv/json/jsonl; Avro uses native DEFLATE and rejects outer gzip. Never inherited from input compression.none

Output Schema

NameRequiredDescription
costYes
statusYesCurrent delivery state
guidanceNoInterpretation or recovery guidance for this result
count_unitNo
page_countNoNumber of objects on this page, not the organization total
audience_idYes
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
delivery_idYes
destinationYes
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
download_urlsNoFresh signed artifact URLs on an individual completed download delivery
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A4.6/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 the cost model — no destination surcharge but base/field delivery usage still applies — and the 'creator' scope requirement, which the annotations never convey. It also states the response shape (delivery_id, status, cost, download_urls[] once completed), so an agent knows completion is asynchronous.

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?

Six short sentences, front-loaded with the action and immediately followed by the two hard constraints (partner unavailability, the quote-first prerequisite). Every sentence carries operational information — pricing, parameter exclusivity, return values, scope — with no 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 mutating, charge-incurring, open-world delivery call, the description covers prerequisites, cost behavior, scope, parameter exclusivity, and completion semantics. An output schema exists, yet the brief return summary still helps an agent plan a wait_for_delivery follow-up; nothing essential 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 100%, so the baseline is 3; the description adds genuine meaning with the template_id/field_list mutual-exclusion rule that the schema does not state. It does not explain output_format, include_unmatched, or output_compression behavior, leaving those to the (already thorough) schema text.

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

Purpose4/5

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

The description opens with a specific verb and resource ('Deliver an audience as a download') and constrains the destination, so an agent knows exactly what the call produces. It does not explicitly contrast with the close sibling deliver_file_match or list_deliveries, but the audience-scoped, download-only framing still makes the target operation unambiguous.

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

Usage Guidelines5/5

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

It gives explicit sequencing ('Call quote_delivery first: pricing depends on...') and an explicit parameter rule ('Supply template_id OR field_list — not both'). It also names when the tool will fail for reasons outside the caller's control (LiveRamp and Narrative unavailable until partner push confirms egress), which is exactly the kind of precondition an agent cannot infer.

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

deliver_file_matchDeliver File MatchA
Destructive
Inspect

Trigger download delivery for a file-based identity match job. Always delivers to download — returns a signed URL to the enriched output file. Use this instead of deliver_audience for matched segments created via create_segment(subtype=matched). The match_id is the segment_id returned by create_segment(subtype=matched) — delivery still routes through an audience wrapper internally. Matched segments do not support LiveRamp or Narrative destinations. Supply template_id OR field_list — not both. Use get_field_catalog() to browse options. Requires 'creator' scope.

NameRequiredDescriptionDefault
match_idYesThe segment_id returned by create_segment(subtype=matched) — also accepted as match_id for backward compatibility
field_listNoCustom list of field names to include. Mutually exclusive with template_id.
template_idNoEnrichment template ID from get_field_catalog(). Mutually exclusive with field_list.
webhook_urlNoOptional HTTPS URL to notify when delivery completes.
output_formatNoOutput file format. Defaults to csv if not specified.
include_unmatchedNoInclude rows that did not resolve to a known identity. Defaults to true.
output_compressionNoExplicit output compression. gzip supports csv/json/jsonl; Avro uses native DEFLATE.none

Output Schema

NameRequiredDescription
costYes
statusYesCurrent delivery state
guidanceNoInterpretation or recovery guidance for this result
count_unitNo
page_countNoNumber of objects on this page, not the organization total
audience_idYes
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
delivery_idYes
destinationYes
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
download_urlsNoFresh signed artifact URLs on an individual completed download delivery
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A4.6/5.0
Behavior4/5

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

Adds real context beyond annotations: delivery always routes to download and returns a signed URL, matched segments don't support LiveRamp/Narrative, and the 'creator' scope requirement is disclosed. It doesn't fully clarify irreversibility or what a repeated call does (idempotentHint=false), so slightly short of full marks.

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 and delivery behavior, and most sentences carry distinct routing or constraint information. A few details (backward-compatibility phrasing aside) are dense but each earns its place.

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

Completeness5/5

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

Given an output schema, full param coverage, and clarifying annotations, the description covers the workflow context an agent needs: what it returns, destination limits, auth scope, and param routing. Nothing critical 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 100%, but the description still adds value by explaining that match_id is the segment_id from create_segment (routing through an audience wrapper internally) and pointing to get_field_catalog for template_id discovery. This meaning goes beyond the schema text.

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

Purpose5/5

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

States a specific verb ('Trigger download delivery') and resource ('file-based identity match job'), and explicitly distinguishes it from deliver_audience. The agent can identify exactly what the tool does without opening the schema.

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

Usage Guidelines5/5

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

Names the alternative (deliver_audience) and the exact condition that selects this tool (matched segments from create_segment(subtype=matched)). Also states exclusions (no LiveRamp/Narrative destinations) and the template_id/field_list exclusivity.

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

discovery_countDiscovery CountA
Destructive
Inspect

Preview the count for one requested population; this does not create a saved audience. With segment_id, the current segment count snapshot is updated. Returns count and optional group_by breakdown. Use filters (AND conditions) or filter_groups (advanced compound filters), segment_id (resolve filters from a saved segment), audience_id (resolve from a saved audience), or segment_ids+set_logic (compose multiple segments, optionally with excluded_segment_ids for an ad-hoc "A minus B" preview). All inputs are mutually exclusive — providing more than one is rejected with AMBIGUOUS_INPUT. Requires 'discovery' scope.

NameRequiredDescriptionDefault
filtersNoRaw flat Filter objects
group_byNoField with groupable=true in get_field_catalog; mutually exclusive with automatic breakdowns
set_logicNoHow to combine segment_ids (required when segment_ids is provided)
segment_idNoSaved segment ID (any subtype) — resolve its definition from the segment doc
audience_idNoSaved audience ID — resolve its composition via segment memberships (any subtype mix)
segment_idsNoMultiple segment IDs to compose
filter_groupsNoAdvanced compound filter groups
include_breakdownsNoWhen true, also return demographic/geographic breakdowns (slower). Default false.
excluded_segment_idsNoAd-hoc "A minus B" preview — segments to subtract from the segment_ids composition, without persisting an audience

Output Schema

NameRequiredDescription
countYesNumber of matching records
guidanceNoInterpretation or recovery guidance for this result
count_unitNo
page_countNoNumber of objects on this page, not the organization total
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A3.9/5.0
Behavior3/5

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

Annotations mark this readOnlyHint=false and destructiveHint=true, and the description explains why: with segment_id the current segment count snapshot is overwritten. That is genuinely additive context beyond the annotations. But it stops there — it never states that the snapshot overwrite is irreversible or affects what other users see, which matters for a tool flagged destructive, and it gives no cost/slowness signal beyond 'slower' on include_breakdowns.

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 and the non-persistence caveat, then a single dense sentence enumerating input modes. Every clause earns its place, though the middle sentence is long enough that a reader may skim the exclusivity constraint.

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 9-parameter, zero-required tool with an output schema, the description covers what an agent needs: what is returned (count plus optional group_by breakdown), the input-mode exclusivity rule with its error code, the snapshot side effect, and the required 'discovery' scope. Return-value details are correctly left to the output schema.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline would be 3; the description earns above baseline by stating the mutual-exclusivity rule between filters, filter_groups, segment_id, audience_id and segment_ids+set_logic, which the schema does not encode. It also names the A-minus-B role of excluded_segment_ids. It adds little on group_by or set_logic beyond what the schema already documents.

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

Purpose4/5

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

Opens with a specific verb+resource ('Preview the count for one requested population') and immediately scopes it as non-persistent ('does not create a saved audience'), which separates it from create_audience/create_segment siblings. It does not explicitly distinguish itself from count_segment or recount_audience, so an agent still has to infer that division.

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?

Clearly enumerates the five input modes and tells the agent they are mutually exclusive, including the exact failure (AMBIGUOUS_INPUT). Missing is guidance on when to use this instead of the closely named siblings count_segment or recount_audience, so the routing advice is internal to the tool rather than across tools.

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

discovery_crosstabDiscovery CrosstabAInspect

Generate a cross-tabulation pivot table across two demographic dimensions. Returns rows, columns, bounded cells, total_count for the full population, displayed_count for visible cells, and truncated when row/column limits omit categories. Accepts EXACTLY ONE of: filters (flat array), filter_groups, segment_id, audience_id, or segment_ids+set_logic to define the audience population (more than one is rejected with AMBIGUOUS_INPUT). Grouped logic, saved audience exclusions, and record limits are preserved. Requires 'discovery' scope.

NameRequiredDescriptionDefault
filtersNoFlat filter array to define the audience population
max_colsNoMaximum number of column values to return (default 10)
max_rowsNoMaximum number of row values to return (default 20)
col_fieldYesDifferent field with groupable=true from get_field_catalog for pivot columns
col_labelNoHuman-readable label for the column dimension
row_fieldYesField with groupable=true from get_field_catalog for pivot rows
row_labelNoHuman-readable label for the row dimension
set_logicNoHow to combine segment_ids
segment_idNoSaved segment ID
audience_idNoSaved audience ID
segment_idsNoMultiple segment IDs to compose
filter_groupsNoCompound filter groups

Output Schema

NameRequiredDescription
rowsYes
cellsYes
columnsYes
guidanceNoInterpretation or recovery guidance for this result
col_fieldYes
col_labelYes
row_fieldYes
row_labelYes
truncatedYes
count_unitNo
page_countNoNumber of objects on this page, not the organization total
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
total_countYes
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
displayed_countYes
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A3.8/5.0
Behavior4/5

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

Discloses traits annotations do not: cells beyond max_rows/max_cols are omitted and signalled via 'truncated', total_count vs displayed_count semantics, that grouped logic/exclusions/record limits are preserved, and the 'discovery' scope prerequisite. It does not explain why readOnlyHint is false for what reads as a query tool, leaving a small ambiguity about side effects.

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

Conciseness4/5

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

Front-loaded with purpose, then return shape, then the input rule, then prerequisites – a sensible order with no filler. The return-value sentence is a long comma-separated list that is slightly dense, but every clause carries information.

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

Completeness4/5

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

Given an output schema exists, the description need not spell out return fields, yet it names the key ones and, more importantly, the truncation and preservation semantics an agent cannot infer from schema alone. Only the readOnlyHint=false tension and the absence of any sibling routing keep it from being complete.

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

Parameters4/5

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

Schema description coverage is already 100%, so baseline 3 applies, but the description adds a mutual-exclusion constraint the schema does not encode as oneOf/anyOf, plus the exact rejection error AMBIGUOUS_INPUT. That is real meaning beyond the schema for a 12-parameter tool with four alternative audience inputs.

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: 'Generate a cross-tabulation pivot table across two demographic dimensions', and the required row_field/col_field confirm the shape. It never names the closest discovery siblings (discovery_count, discovery_overlap) or get_segment_demographics, so the agent must infer which of several demographic-reporting tools this is.

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

Usage Guidelines3/5

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

The 'EXACTLY ONE of ... (more than one is rejected with AMBIGUOUS_INPUT)' rule is genuinely useful selection guidance for how to build the audience. But there is no statement of when to pick a crosstab over a plain count or a single-dimension demographic breakdown, which are exactly the choices the sibling list presents.

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

discovery_lookupDiscovery LookupAInspect

Return up to 25 masked sample rows for audience matching criteria. Accepts: filters (raw Filter objects), segment_id, audience_id, segment_ids+set_logic (optionally with excluded_segment_ids for an ad-hoc "A minus B" preview), or filter_groups. All inputs are mutually exclusive — providing more than one is rejected with AMBIGUOUS_INPUT. Saved compositions and their exclusions are preserved. Requires 'discovery' scope.

NameRequiredDescriptionDefault
limitNoMaximum masked sample rows, 1–25 (default 10)
fieldsNoNon-PII audience fields to preview; defaults to a small demographic selection. Discover fields with get_field_catalog.
filtersNoRaw flat Filter objects
set_logicNoHow to combine segment_ids
segment_idNoSaved segment ID (any subtype) — resolve its definition from the segment doc
audience_idNoSaved audience ID — resolve its composition via segment memberships (any subtype mix)
segment_idsNoMultiple segment IDs to compose
filter_groupsNoAdvanced compound filter groups
excluded_segment_idsNoAd-hoc "A minus B" preview — segments to subtract from the segment_ids composition, without persisting an audience

Output Schema

NameRequiredDescription
rowsYesMasked sample records
guidanceNoInterpretation or recovery guidance for this result
count_unitNo
page_countNoNumber of objects on this page, not the organization total
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
total_matchedYesNumber of records matching the lookup
available_fieldsYesNon-PII fields selected for this sample; use get_field_catalog to discover other fields
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A3.7/5.0
Behavior4/5

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

The description adds substantial context beyond the annotations: the 'discovery' scope requirement (an auth prerequisite), the masked nature of returned rows, the mutual-exclusion rejection with a named error code, and the fact that saved compositions/exclusions are preserved and excluded segment previews are not persisted. One unresolved tension: annotations declare readOnlyHint=false and idempotentHint=false, which imply state changes/side effects (e.g. metered queries) that the read-like 'return sample rows' framing does not explain.

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 output/scope statement is front-loaded, followed by the accepted input modes and the exclusivity rule. It is dense but nearly every clause carries operative information (error code, exclusion semantics, scope); it could be tightened marginally but wastes little.

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

Completeness4/5

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

With an output schema handling return values and full schema coverage on inputs, the description covers what structured fields cannot: auth scope, mutual-exclusion behavior, masking, and composition preservation. It is complete enough to invoke correctly, with only the readOnlyHint=false side-effect ambiguity left unaddressed.

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

Parameters3/5

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

Schema coverage is 100%, so every parameter, including nested filter operators and BETWEEN/LIKE semantics, is already documented in the schema. The description adds only the higher-level mutual-exclusion rule and the 'A minus B' semantics of excluded_segment_ids, so the schema does most of the work and baseline 3 is appropriate.

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

Purpose4/5

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

The description states a specific verb and resource: "Return up to 25 masked sample rows for audience matching criteria," and enumerates the accepted input modes (filters, segment_id, audience_id, segment_ids+set_logic, filter_groups). It is clear what the tool produces. It does not, however, distinguish itself from the sibling discovery_count/discovery_crosstab/discovery_overlap tools, so an agent must infer that this is the row-preview variant.

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

Usage Guidelines3/5

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

"All inputs are mutually exclusive — providing more than one is rejected with AMBIGUOUS_INPUT" gives real selection guidance among the input modes, and the excluded_segment_ids clause describes an ad-hoc preview path. But there is no explicit guidance on when to use this tool versus discovery_count or discovery_crosstab/the other discovery siblings, so usage is only implied.

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

discovery_overlapDiscovery OverlapAInspect

Calculate the overlap between two audience criteria sets. Returns overlap_count, overlap_pct (percentage of the smaller population), and demographic_deltas. Each side (a and b) independently accepts EXACTLY ONE of: audience_id, segment_id, segment_ids+set_logic, filter_groups, or filters (more than one per side is rejected with AMBIGUOUS_INPUT). Saved composition, exclusions, and record limits are preserved. Empty optional distributions mean unavailable, not zero. Legacy: pass audience_id_a and audience_id_b at the top level for backward compatibility (mutually exclusive with a/b). Requires 'discovery' scope.

NameRequiredDescriptionDefault
aNoSide A input — any of the five discovery input shapes
bNoSide B input — any of the five discovery input shapes
audience_id_aNo(Legacy) First audience ID
audience_id_bNo(Legacy) Second audience ID

Output Schema

NameRequiredDescription
a_nameYes
b_nameYes
a_countYes
b_countYes
guidanceNoInterpretation or recovery guidance for this result
warningsNo
count_unitNo
page_countNoNumber of objects on this page, not the organization total
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
overlap_pctYes
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
overlap_countYes
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions
demographic_deltasYes

TDQS

A3.8/5.0
Behavior4/5

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

Goes well beyond the annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=false): it discloses the 'discovery' scope requirement, states that saved composition/exclusions/record limits are preserved, warns that empty optional distributions mean unavailable not zero, and documents the AMBIGUOUS_INPUT rejection. Minor gap: it doesn't clarify why readOnlyHint is false for what reads as a compute call.

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 and return fields, then input constraints, then scope. Dense but every sentence carries real rules; the one slightly wasteful bit is listing the return fields despite an output schema existing.

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 deeply nested tool with an output schema and annotations, the description covers the key gotchas an agent needs: one-input-per-side, ambiguity rejection, preserved composition, empty-distribution semantics, legacy parameters, and auth scope. Nothing materially missing for correct invocation.

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

Parameters4/5

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

On top of 100% schema coverage, it adds the crucial 'EXACTLY ONE of' constraint per side that the schema cannot express with its current shape, and explains the audience_id_a/audience_id_b legacy alternates and their mutual exclusivity with a/b. Clear value beyond the schema.

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

Purpose4/5

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

States a specific verb ('Calculate') and resource ('overlap between two audience criteria sets'), which is inherently distinguishable from siblings like discovery_count, discovery_crosstab, and discovery_lookup. However, it never names or contrasts those siblings, so the agent must infer which discovery tool 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 Guidelines3/5

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

The description notes the required 'discovery' scope and the mutual-exclusivity rule for the legacy parameters, which implies when to use the modern a/b shape. But it never says when to choose this tool over discovery_crosstab or discovery_count, so usage is only implied.

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

duplicate_audienceDuplicate AudienceAInspect

Create a duplicate of an existing audience with lineage tracking (parent_audience_id + derived_from root ancestor, segment versions pinned at duplicate time). The duplicate carries the source composition (segment_ids, excluded_segment_ids, set_logic), is immediately active, and starts with record_count null — call recount_audience for a fresh count. Optionally link the duplicate to a campaign. Requires 'creator' scope.

NameRequiredDescriptionDefault
nameNoName for the duplicate. Defaults to "<source name> (copy)"
audience_idYesID of the audience to duplicate
campaign_idNoOptional campaign to link the duplicate to

Output Schema

NameRequiredDescription
nameYes
statusYes
guidanceNoInterpretation or recovery guidance for this result
set_logicNoHow included segments combine; excluded segments always subtract
count_unitNo
page_countNoNumber of objects on this page, not the organization total
audience_idYes
campaign_idNo
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
segment_idsYes
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
record_countNoSaved composition count; null is unknown. Use recount_audience for a current value.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions
excluded_segment_idsYes

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the annotations, the description discloses important behavior: lineage tracking with parent_audience_id and derived_from, pinned segment versions, copied composition, immediate active status, null record_count, optional campaign linkage, and the required 'creator' scope. These details add substantial operational context not already present in the 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.

Conciseness5/5

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

The description is front-loaded with the core action, then efficiently covers lineage, copied composition, initial state, recount behavior, campaign linkage, and scope. The density is justified by the complexity of the 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?

Given the presence of annotations and an output schema, the description supplies everything an agent needs to call this tool correctly: authorization scope, resulting-object behavior, lineage semantics, initial record_count state, and the need to call recount_audience for a fresh count.

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

Parameters3/5

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

Schema description coverage is 100%, so the input schema already documents audience_id, name, and campaign_id fully. The description reinforces campaign linkage and the source-audience concept, but does not add meaningful parameter-level detail beyond what the schema already provides.

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

Purpose5/5

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

The description names a specific verb and resource: duplicate an existing audience. It also states the resulting object's lineage, composition, active state, and initial record_count, which clearly distinguishes it from create_audience and other sibling tools.

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

Usage Guidelines4/5

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

The description makes the use case clear: duplicate an existing audience, optionally link it to a campaign, and call recount_audience when a fresh count is needed. It does not explicitly name alternatives such as create_audience or duplicate_segment, so it is strong but not fully exhaustive on when-not-to-use guidance.

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

duplicate_segmentDuplicate SegmentAInspect

Create a duplicate of an existing segment. Preserves the source subtype and all subtype-specific data: filter criteria for filter segments; match results, column mappings, and match counts for matched segments; seed and generated-score references for similarity/propensity segments (underlying computed data is referenced, never recomputed). Lineage is recorded (parent_segment_id, derived_from root ancestor, parent_segment_version pin). Filter duplicates start with record_count null — trigger a recount with count_segment for a fresh count; matched/similarity/propensity duplicates carry the source's counts. Returns 409 SOURCE_MATCH_UNAVAILABLE when a matched source's match data is unavailable (expired/failed/incomplete match), or 409 SOURCE_NOT_READY when a non-matched source is pending or failed. Requires 'creator' scope.

NameRequiredDescriptionDefault
nameNoName for the duplicate. Defaults to "<source name> (copy)"
segment_idYesID of the segment to duplicate

Output Schema

NameRequiredDescription
nameYes
statusYes
subtypeYes
guidanceNoInterpretation or recovery guidance for this result
count_unitNo
page_countNoNumber of objects on this page, not the organization total
segment_idYes
upload_urlNo
audience_idNo
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
upload_urlsNo
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
record_countNoStored count; null means unknown. Call count_segment for a current count.
record_limitNoMaximum members; null means no explicit cap
filter_groupsNoComplete saved filter definition; one AND group also represents a simple flat filter list
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
current_versionNo
workflow_run_idNo
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions
upload_expires_atNo

TDQS

A4.4/5.0
Behavior5/5

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

Annotations only declare the generic profile (not read-only, not destructive, not idempotent); the description adds substantial context beyond that — what is preserved per subtype, that computed data is referenced rather than recomputed, lineage fields recorded, the null record_count side effect, two distinct 409 error codes, and the required scope. That is exactly the kind of behavior an agent cannot get from annotations.

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

Conciseness4/5

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

Front-loaded with purpose, then behavior, then failure modes and permissions — a sensible order. The subtype enumeration is dense but each clause carries real information; still, the sentence is long enough that trimming would improve scannability.

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 shape need not be explained, and the description covers the remaining pieces an agent needs: preserved data per subtype, lineage side effects, count semantics, permission requirement, and specific error conditions. Nothing material is missing for a 2-parameter tool.

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

Parameters3/5

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

Schema coverage is 100%, and the schema itself documents the name default ("<source name> (copy)") and segment_id. The description adds no parameter-level syntax or format meaning beyond implying segment_id identifies the source, so baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb and resource ("Create a duplicate of an existing segment") and immediately scopes it by enumerating what is carried over per subtype. An agent can distinguish this from create_segment because duplication semantics (preserved subtype data, lineage) are spelled out.

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

Usage Guidelines4/5

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

Explicitly routes to a sibling: "Filter duplicates start with record_count null — trigger a recount with count_segment for a fresh count." It also gives the preconditions under which the call will fail (unavailable match data, pending/failed source) and the required 'creator' scope. It stops short of explicitly contrasting duplicate_segment with create_segment, which is the only gap.

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

get_account_usageGet Account UsageA
Read-onlyIdempotent
Inspect

Read this organization’s segment and audience totals, delivery count for the last 30 days, rated current-period spend in cents, billing projection freshness, and compute-ceiling usage percentage. Does not create a charge or change the account. Requires 'account-read' scope.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
guidanceNoInterpretation or recovery guidance for this result
count_unitNo
page_countNoNumber of objects on this page, not the organization total
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
segment_countYes
audience_countYes
deliveries_30dYes
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions
compute_usage_pctYes
billing_projectionYes
current_period_spend_centsYes

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, idempotentHint=true, destructiveHint=false, so safety is covered. The description still adds genuinely new behavioral facts beyond them: it requires the 'account-read' scope and it explicitly reassures the agent that calling it will not create a charge or modify the account, which matters for a billing-adjacent 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?

One dense sentence enumerating the payload, followed by a non-mutation guarantee and the scope requirement. No filler, and the key content is front-loaded.

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

Completeness4/5

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

An output schema exists, so enumerating return fields in the description is partly redundant, but it usefully helps selection. Auth scope and non-mutation semantics are covered; only the relationship to sibling billing tools 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 baseline is 4 and there is nothing for the description to disambiguate. The description correctly implies the org context is implicit rather than passed in.

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

Purpose4/5

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

The description names a specific verb ('Read') and resource ('this organization's usage') and enumerates the exact metrics returned: segment/audience totals, 30-day delivery count, rated spend in cents, projection freshness, compute-ceiling percentage. That specificity makes it hard to confuse with the write/mutation siblings, though it never names the adjacent billing siblings (check_balance, check_topup_status) explicitly.

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

Usage Guidelines3/5

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

Usage is only implied by the read-only framing and the scope requirement; there is no explicit 'use this when you need X instead of check_balance/check_topup_status' routing. An agent can infer it is the aggregate usage snapshot, but the choice among billing-related 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_audienceGet AudienceA
Idempotent
Inspect

Get customer-facing details of an audience, including expanded segment summaries and composition. Use when the user wants to reload, inspect, or rerun a specific saved audience. Requires 'discovery' scope.

NameRequiredDescriptionDefault
audience_idYesThe audience ID returned by list_audiences or create_audience

Output Schema

NameRequiredDescription
nameYes
statusYes
guidanceNoInterpretation or recovery guidance for this result
set_logicNoHow included segments combine; excluded segments always subtract
count_unitNo
page_countNoNumber of objects on this page, not the organization total
audience_idYes
campaign_idNo
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
segment_idsYes
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
record_countNoSaved composition count; null is unknown. Use recount_audience for a current value.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions
excluded_segment_idsYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare idempotent/non-destructive/non-open-world, and the description adds a genuinely useful auth requirement ('Requires discovery scope'). However, it never explains the notable annotation quirk that this 'Get' tool is marked readOnlyHint=false, nor what the 'rerun' wording implies about side effects. With annotations present the bar is lower, but that gap is material for a tool that may mutate state.

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

Conciseness4/5

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

Three short sentences, front-loaded with the resource and payload contents, followed by usage and auth. Nothing is repeated, though 'reload, inspect, or rerun' is a slightly loose triple that pads the usage cue without sharpening it.

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?

Low-complexity getter with one param described in full and an output schema that already covers return values, so the description needn't restate them. The scope requirement and payload summary make it callable without guesswork; only sibling routing against get_audience_demographics/get_segment_audiences is left unstated.

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 audience_id parameter has 100% schema description coverage, including its provenance ('returned by list_audiences or create_audience'). The description adds only 'a specific saved audience', so the schema does essentially all the work — baseline 3 applies.

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

Purpose4/5

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

States a specific verb+resource ('Get customer-facing details of an audience') and adds what the payload contains (expanded segment summaries and composition), which goes beyond the bare name. It doesn't differentiate itself from near-neighbors like get_audience_demographics, get_segment_audiences, or list_audiences, so it falls short of 5.

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

Usage Guidelines3/5

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

Provides an implied usage cue ('when the user wants to reload, inspect, or rerun a specific saved audience'), which is more than nothing. But it names no alternative and gives no when-not guidance — an agent can't tell from this text whether to call get_audience, list_audiences, or refresh_audience for a given request.

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

get_audience_demographicsGet Audience DemographicsAInspect

Profile a saved audience composition, including its segment set logic and exclusions. Returns a BigQuery-computed demographic breakdown, including median age, gender split, homeowner %, children %, college-educated %, and high-income %. Results are cached server-side for 20 minutes. Requires 'discovery' scope.

NameRequiredDescriptionDefault
audience_idYesThe audience ID to retrieve demographics for

Output Schema

NameRequiredDescription
guidanceNoInterpretation or recovery guidance for this result
count_unitNo
page_countNoNumber of objects on this page, not the organization total
audience_idYes
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
extra_fieldNo
total_countYes
generated_atYesISO timestamp of the demographic snapshot
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
age_breakdownYes
audience_nameYes
geo_breakdownYes
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
breakdown_extraNo
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A3.8/5.0
Behavior4/5

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

Goes beyond the annotations by disclosing the auth requirement ('discovery' scope), the backend that computes the data (BigQuery), and a 20-minute server-side cache – all behaviorally relevant. The caching note is also useful given the annotations declare idempotentHint=false and readOnlyHint=false for what reads as a query operation, though the description never explicitly asserts a write, so this is not a direct contradiction.

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

Conciseness5/5

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

Three sentences, each earning its place: what it does, what it returns, then operational constraints (cache, scope). Purpose is front-loaded and nothing is redundant.

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

Completeness4/5

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

With an output schema present, return-value detail is not the description's job, and it covers the important gaps (scope, caching, computation source). The only missing piece is routing guidance versus the segment-demographics sibling, which matters for an agent choosing among many demographic/count tools.

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

Parameters3/5

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

Schema description coverage is 100% and the single audience_id parameter is fully documented there, so baseline 3 applies. The description adds no syntax, format, or case-sensitivity hints for the ID beyond what the schema provides.

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

Purpose4/5

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

States a specific verb+resource ('Profile a saved audience composition') and enumerates the returned metrics, so it is clearly distinguished from a generic fetch. It does not explicitly name the segment-oriented sibling get_segment_demographics as the alternative, so differentiation is implicit rather than stated.

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

Usage Guidelines3/5

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

The description supplies a prerequisite ('Requires discovery scope') but gives no explicit when-to-use guidance and does not point to alternatives such as get_segment_demographics or count_segment. Usage must be inferred from the resource name.

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

get_campaignGet CampaignA
Read-onlyIdempotent
Inspect

Retrieve customer-facing details for a campaign including its brief and linked audience summaries. Use when the user asks about a specific campaign or wants to see what audiences are in it. Linked segments are summaries; call get_segment with a segment ID to inspect its filter_groups definition. Requires 'discovery' scope.

NameRequiredDescriptionDefault
campaign_idYesThe campaign ID to retrieve

Output Schema

NameRequiredDescription
idYes
nameYes
statusYes
guidanceNoInterpretation or recovery guidance for this result
audiencesYes
count_unitNo
page_countNoNumber of objects on this page, not the organization total
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, but the description adds real value on top: the required 'discovery' scope and the caveat that linked segments are summaries rather than full definitions. It stops short of covering error behavior for a missing campaign_id, 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.

Conciseness5/5

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

Three short sentences, front-loaded with the core purpose, then usage conditions, then the sibling handoff and scope requirement. No filler or redundancy.

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

Completeness5/5

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

An output schema exists so return values need not be spelled out, yet the description still orients the agent to brief and audience content. Hot path, sibling escape hatch, and auth scope are all covered for a one-parameter 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 100% for the single campaign_id parameter, so the schema already carries the semantics. The description adds no format or sourcing hints for the ID beyond what the schema states, making the baseline 3 appropriate.

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

Purpose5/5

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

Specific verb (retrieve) plus resource (campaign) plus the contents returned (brief and linked audience summaries). It is clearly distinguishable from list_campaigns, create_campaign, update_campaign, and from get_segment, which it explicitly routes to for deeper segment detail.

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?

States explicitly when to use it (user asks about a specific campaign or wants its audiences) and names the alternative tool with the condition that selects it: get_segment for filter_groups definitions. It also sets expectations that linked segments are only summaries.

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

get_data_releaseGet Data ReleaseAInspect

Return the platform current data-release version (current_release_major/minor). Compare against a match_records result's resolution_action to tell whether a direct Refresh returned data unchanged since it was last delivered ("current") or potentially updated ("refreshed"). Requires 'discovery' scope.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
as_ofYesISO timestamp of the registry snapshot
guidanceNoInterpretation or recovery guidance for this result
count_unitNo
page_countNoNumber of objects on this page, not the organization total
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions
current_release_majorYes
current_release_minorYes

TDQS

A3.6/5.0
Behavior2/5

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

The description frames this purely as a read ('Return the platform current data-release version'), yet annotations declare readOnlyHint=false and idempotentHint=false without the description reconciling that. The description does add genuine behavioral context (discovery-scope requirement, and how the value is interpreted against resolution_action), but the unreconciled read/write signal is a real inconsistency an agent could act on.

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

Conciseness4/5

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

Two sentences, with the purpose front-loaded before the usage explanation. The second sentence is somewhat convoluted (nested quotes, long clause) but every element carries information; nothing is 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 return-value documentation is not required. The description still supplies the two field names, the scope prerequisite, and the interpretive rule tying the result to match_records. The main gap is not addressing the non-read-only annotation, which an agent would want clarified for a simple getter.

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 input parameters, so the baseline is 4. The description correctly introduces no parameter discussion and instead directs attention to the response fields (current_release_major/minor), which is the right focus for a no-arg tool.

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: 'Return the platform current data-release version (current_release_major/minor).' It also names the related sibling, match_records, so the agent can place it in a workflow. It stops short of explicitly contrasting with other getter/list tools (get_match_run, get_workflow_status), but the resource is unambiguous.

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

Usage Guidelines4/5

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

The description says concretely when to reach for it: compare its value against a match_records result's resolution_action to interpret 'current' vs 'refreshed'. It also states the prerequisite ('Requires discovery scope'). It does not state any exclusion or what to do instead if the scope is missing, which keeps it out of 5 territory.

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

get_deliveryGet DeliveryA
Read-onlyIdempotent
Inspect

Get status and details of a single delivery. Returns fresh 24-hour download_urls[] for completed download deliveries while the artifact is retained; expires_at is the artifact retention date, not the signed-link expiry. Use this to poll status after deliver_audience returns status: processing. Requires 'discovery' scope.

NameRequiredDescriptionDefault
audience_idYesAudience the delivery belongs to
delivery_idYesDelivery ID returned by deliver_audience

Output Schema

NameRequiredDescription
statusYesCurrent delivery state
guidanceNoInterpretation or recovery guidance for this result
count_unitNo
page_countNoNumber of objects on this page, not the organization total
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
download_urlsNoFresh signed artifact URLs on an individual completed download delivery
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A4.3/5.0
Behavior5/5

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

Beyond readOnlyHint, idempotentHint, and destructiveHint=false, the description explains important return behavior: fresh 24-hour download_urls[] while the artifact is retained, and that expires_at is artifact retention rather than signed-link expiry. It also discloses the required 'discovery' scope, adding auth context not conveyed by annotations.

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

Conciseness5/5

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

The description is front-loaded with the core action, then adds the most important return caveat, the polling use case, and auth requirement. Every sentence contributes distinct, useful information with no 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, annotations cover safety and idempotency, and schema coverage is complete. The description fills the remaining gaps by explaining polling usage, download URL freshness, retention semantics, and required scope.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters are already documented in the schema. The description does not add parameter syntax or format details beyond what the schema provides, so it meets the baseline for fully covered parameters.

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

Purpose4/5

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

The description states a specific verb and resource: 'Get status and details of a single delivery.' It distinguishes itself from list-oriented siblings by emphasizing 'single delivery' and from deliver_audience by describing polling after delivery creation. It does not explicitly contrast with wait_for_delivery, which is the closest sibling alternative.

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

Usage Guidelines4/5

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

The description gives clear usage context: 'Use this to poll status after deliver_audience returns status: processing.' It also states the required 'discovery' scope. However, it does not mention when to prefer wait_for_delivery or how this differs from list_deliveries for multiple deliveries.

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

get_field_catalogBrowse Field CatalogA
Read-onlyIdempotent
Inspect

Discover a bounded page of fields, descriptions, accepted aliases, allowed filter operators, coded values and coverage definitions. Search zip or zip_code for the canonical zip5 field. State publishes two-letter codes and full-name labels; either input is accepted. Defaults to filterable audience fields; use purpose=enrichment for all output fields. feature_store fields are enrichment-only unless also tagged audience. Follow next_cursor for more fields; for more enum values pass field_name and values_next_cursor as value_cursor. Pricing is opt-in. Requires discovery scope. Requires 'discovery' scope.

NameRequiredDescriptionDefault
limitNoMaximum fields per page; response size may shorten the page
cursorNonext_cursor returned by the previous page
searchNoCase-insensitive search across field names, accepted aliases, labels and descriptions
purposeNoDefault filter: show fields usable for population filters. Use enrichment for all selectable output fields. Explicit product_usage, template_id or field_name overrides this default.filter
field_nameNoRetrieve one exact field, including a page of its coded values
template_idNoShow fields in this delivery template
value_limitNoMaximum enum values per field; defaults to 100 for one field or 25 in a list
value_cursorNovalues_next_cursor from a field; requires field_name
product_usageNoFilter by supported product usage
include_pricingNoInclude account-specific pricing; requires configured billing

Output Schema

NameRequiredDescription
totalYes
fieldsYesSelectable output fields; audience filtering remains audience-tagged only
pricingYesOrganization prices when include_pricing=true; otherwise null
guidanceNoInterpretation or recovery guidance for this result
templatesYesTemplates; request template_id to page their fields
count_unitNo
page_countNoNumber of objects on this page, not the organization total
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_cursorYes
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A4.3/5.0
Behavior5/5

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

Annotations already declare read-only, idempotent, non-destructive behavior, and the description adds meaningful operational context beyond that: bounded pagination, default filterable-audience scope, enrichment-only feature_store fields, opt-in pricing, and required discovery scope. There is no contradiction with the annotations.

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

Conciseness4/5

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

The description is front-loaded and information-dense, covering the most important defaults and cursor flow early. It is slightly repetitive, especially the duplicated statement that the tool requires discovery scope, which prevents a perfect conciseness score.

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?

The tool has 10 optional parameters, an output schema, and clear annotations; the description covers pagination, default filtering, enrichment mode, pricing opt-in, and scope requirements. An agent has enough context to invoke and paginate correctly without needing return-value details the output schema already provides.

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

Parameters4/5

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

Schema coverage is 100%, so parameter meanings are already largely documented. The description still adds useful semantics, including zip_code alias handling, state two-letter/full-name inputs, purpose default behavior, and value_cursor usage, though it leaves several parameters to the schema.

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

Purpose4/5

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

The description states a specific verb and resource: discovering a bounded page of catalog fields, including aliases, operators, coded values, and coverage. It is clear what the tool does, but it does not explicitly distinguish itself from related discovery siblings such as discovery_lookup.

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 concrete usage guidance: use purpose=enrichment for output fields, follow next_cursor for more fields, pass field_name plus values_next_cursor for more enum values, and opt in to pricing. It does not state when to use this tool instead of sibling discovery tools, so the alternative-tool guidance is incomplete.

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

get_file_match_jobGet File Match JobA
Read-onlyIdempotent
Inspect

Retrieve a single file-based identity resolution job by its match_id (= segment_id). Returns full details including matching_status, amount_charged, file_format, compression, field_counts, source_job_id, audience_id, audience_status, and error_message if failed. amount_charged is null until this run first participates in a successful delivery, then shows its one-time pending match-usage estimate; it excludes delivery usage. audience_status (active/archived/null) reports whether the linked audience is still open-able in Library. mapping_warnings lists problems with how the file's columns were used (code nested_addresses means the addresses column was ignored in whole or part) — tell the user about any entries. Use to check job progress after create_segment(subtype=matched), or to retrieve the audience_id for delivery. Requires 'discovery' scope.

NameRequiredDescriptionDefault
match_idYesThe match_id (segment_id) returned by create_segment(subtype=matched) or list_file_match_jobs

Output Schema

NameRequiredDescription
statusYes
guidanceNoInterpretation or recovery guidance for this result
match_idYes
count_unitNo
page_countNoNumber of objects on this page, not the organization total
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already establish that this is a read-only, idempotent, non-destructive operation. Beyond that, the description adds substantial behavioral context: amount_charged is null until a successful delivery participation, audience_status reflects whether the linked audience remains open-able in Library, and mapping_warnings should be reported to the user. It also discloses the required scope, which is important for invocation.

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

Conciseness4/5

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

The description is front-loaded with the core action and is organized around usage, return details, and caveats. It is somewhat dense because it lists many return fields even though an output schema exists, but most of the extra text earns its place through semantic caveats like amount_charged and mapping_warnings.

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 presence of an output schema and strong annotations, the description is complete enough for correct invocation. It covers purpose, usage contexts, important return-field semantics, warnings interpretation, and required scope. Nothing critical appears to be missing for an agent deciding whether and how to call this 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?

Schema coverage is 100%, and the match_id parameter is already well documented in the schema. The description adds useful equivalency information by clarifying that match_id is the segment_id and that it is returned by create_segment(subtype=matched) or list_file_match_jobs. This meaningfully augments the already-complete schema without being redundant.

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

Purpose5/5

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

The description uses a specific verb and resource: it retrieves a single file-based identity resolution job by match_id. It clearly distinguishes this from the list operation by saying 'single' and by explaining that match_id is the segment_id. An agent can identify exactly what this tool does 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 Guidelines4/5

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

It gives clear usage contexts: checking job progress after create_segment(subtype=matched) and retrieving audience_id for delivery. It also states the required 'discovery' scope. However, it does not explicitly compare this with list_file_match_jobs or state when not to use this tool.

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

get_integration_runGet Integration RunA
Read-onlyIdempotent
Inspect

Get one retained integration run by run_id. Returns customer-safe provenance, selected fields, record counts, processing status, and billing rail; intermediate workflow artifacts are not exposed. Use an ID from list_integration_runs. Requires 'discovery' scope.

NameRequiredDescriptionDefault
run_idYesIntegration run ID returned by list_integration_runs

Output Schema

NameRequiredDescription
kindYes
countsYes
run_idYes
statusYes
guidanceNoInterpretation or recovery guidance for this result
providerYes
count_unitNo
created_atYes
page_countNoNumber of objects on this page, not the organization total
updated_atYes
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
connection_idYes
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

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, and the description adds genuine behavioral context: the run must be a 'retained' run, the payload is 'customer-safe provenance' with 'intermediate workflow artifacts... not exposed', and a 'discovery' scope is required. That is meaningful disclosure beyond the annotation set, though nothing is said about behavior when the run is missing or expired.

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

Conciseness5/5

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

Three tight sentences ordered purpose, return shape, then usage and prerequisite. No filler, and the core action is front-loaded in the first clause.

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?

Output schema exists, so the description does not need to enumerate return fields, yet it still characterizes the payload and explicitly notes what is excluded. Combined with the ID source and scope requirement, an agent has everything needed to invoke 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?

With a single parameter at 100% schema coverage, the schema already carries the full meaning of run_id including its source. The description's 'by run_id' and the list_integration_runs pointer duplicate rather than extend that, 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 and resource ('Get one retained integration run by run_id') and immediately scopes it against the sibling list_integration_runs. An agent can tell this single-record fetch apart from the list operation 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 Guidelines4/5

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

'Use an ID from list_integration_runs' gives the explicit sourcing rule and 'Requires discovery scope' states an auth prerequisite. It stops short of ruling out lookalike siblings such as get_workflow_status or get_match_run, which is the only missing piece.

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

get_match_runGet Match RunA
Read-onlyIdempotent
Inspect

Retrieve a single micro-batch match run by its run_id. Returns full details: match_count, match_rate, input_record_count, amount_charged (a conservative pending-usage estimate, not a finalized invoice amount), field_list, status, created_at, expires_at. Requires 'discovery' scope.

NameRequiredDescriptionDefault
run_idYesThe match run ID returned by list_match_runs or a prior match_records call

Output Schema

NameRequiredDescription
run_idYes
statusYes
guidanceNoInterpretation or recovery guidance for this result
count_unitNo
page_countNoNumber of objects on this page, not the organization total
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
match_countYes
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions
input_record_countYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds useful behavioral context beyond annotations by stating the required 'discovery' scope and clarifying that amount_charged is a conservative pending-usage estimate rather than a finalized invoice amount; it does not describe error behavior, but that is a minor gap for this simple read.

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

Conciseness5/5

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

The definition is two compact sentences, front-loading the action and then the returned details and scope requirement. Every clause provides useful 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?

For a simple read tool with an output schema and full annotations, the description covers the key missing context: required scope and the caveat around amount_charged. The only notable omission is an explicit statement of how it relates to list_match_runs and match_records as alternatives, but the schema makes that relationship inferable.

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

Parameters3/5

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

Schema description coverage is 100%, and the run_id parameter is fully documented as coming from list_match_runs or a prior match_records call. The description only restates 'by its run_id' and adds no syntax, format, or further semantic detail beyond the schema.

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

Purpose5/5

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

The description uses a specific verb ('Retrieve') and resource ('single micro-batch match run by its run_id'). The word 'single' distinguishes it from list_match_runs, and the schema's run_id description ties it to list_match_runs and match_records, so an agent can identify its role without opening those tools.

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

Usage Guidelines3/5

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

The description implies it is used after obtaining a run_id from list_match_runs or match_records and states the required 'discovery' scope, but it does not explicitly say when to choose this tool over siblings or when not to use it. Usage is therefore inferable rather than spelled out.

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

get_saved_integration_segment_buildGet Saved Integration Segment BuildA
Read-onlyIdempotent
Inspect

Check a saved-match segment materialization by materialization_id after build_saved_integration_segment. Returns aggregate progress/status and the durable segment ID once complete; it does not start another build. Requires 'discovery' scope.

NameRequiredDescriptionDefault
materialization_idYesMaterialization ID returned by build_saved_integration_segment

Output Schema

NameRequiredDescription
modeYes
statusYes
previewYes
guidanceNoInterpretation or recovery guidance for this result
count_unitNo
page_countNoNumber of objects on this page, not the organization total
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
failure_codeYes
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
collection_idYes
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
identity_countYes
failure_messageYes
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions
target_segment_idYes
materialization_idYes

TDQS

A4.2/5.0
Behavior4/5

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

Beyond the readOnly/idempotent annotations, it discloses the required 'discovery' scope and what the call yields (aggregate progress/status plus the durable segment ID once complete). It does not describe what a partial/incomplete status looks like or whether repeated polling is expected, which would have pushed it higher.

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

Conciseness5/5

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

Two tight sentences: the identification/precondition comes first, the return contract and the negative constraint follow. Every clause carries information an agent would otherwise have to infer.

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 values need not be spelled out, and the description still summarizes them; the scope requirement is a useful addition. It leaves minor gaps around polling behavior and the status vocabulary for a long-running check, but nothing essential for correct invocation.

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

Parameters3/5

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

Schema description coverage is 100% and the schema already explains that materialization_id comes from build_saved_integration_segment, so the description's restatement adds little. Baseline 3 is appropriate for a single fully-documented 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 and resource — check a saved-match segment materialization by materialization_id — and explicitly disambiguates from build_saved_integration_segment by noting it does not start another build. An agent can distinguish it from the build 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 Guidelines4/5

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

"after build_saved_integration_segment" gives a clear precondition for when to call it, and "it does not start another build" excludes the most likely misuse. There is no explicit mention of polling cadence or of an alternative (e.g. wait_for_segment-style blocking helper), so it stops short of full when/when-not guidance.

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

get_segmentGet SegmentB
Idempotent
Inspect

Fetch one segment by segment_id. Returns its customer-facing subtype, status, count, and subtype-specific fields. Filter segments include the complete filter_groups definition and current_version; matched and model-generated segments expose their own relevant fields. Use to inspect a definition before modifying or composing it. Requires 'discovery' scope.

NameRequiredDescriptionDefault
segment_idYesThe segment ID to retrieve

Output Schema

NameRequiredDescription
nameYes
statusYes
subtypeYes
guidanceNoInterpretation or recovery guidance for this result
count_unitNo
page_countNoNumber of objects on this page, not the organization total
segment_idYes
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
record_countNoStored count; null means unknown. Call count_segment for a current count.
record_limitNoMaximum members; null means no explicit cap
filter_groupsNoComplete saved filter definition; one AND group also represents a simple flat filter list
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
current_versionNo
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

B3.4/5.0
Behavior1/5

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

The description presents a pure read operation ('Fetch', 'inspect'), while annotations declare readOnlyHint=false, indicating the tool is not read-only. That is a direct contradiction; although scope and return-shape context are provided, the annotation conflict dominates the behavioral assessment.

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

Conciseness4/5

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

The description is front-loaded with the core action and then adds return-shape and scope details. It is somewhat long for a one-parameter read tool, especially since an output schema exists, but the sentences are purposeful.

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?

It covers the required parameter, return content, and auth scope, and an output schema exists. However, it does not address the non-read-only behavior implied by readOnlyHint=false, leaving a meaningful behavioral gap.

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

Parameters3/5

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

Schema coverage is 100%, and the single segment_id parameter is fully documented in the schema. The description says the segment is fetched 'by segment_id' but adds no format or constraint details beyond the schema, so the baseline 3 applies.

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

Purpose5/5

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

The description uses a specific verb and resource: 'Fetch one segment by segment_id.' It also clarifies the scope by saying one segment is retrieved, which naturally distinguishes this from list_segments and related 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?

It gives a clear positive use case: 'Use to inspect a definition before modifying or composing it,' and notes the required 'discovery' scope. It does not explicitly name when not to use it or point to specific alternatives such as list_segments or patch_segment.

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

get_segment_audiencesGet Segment AudiencesA
Read-onlyIdempotent
Inspect

List every audience that references a segment, with campaign linkage. Returns audiences[] ({id, name, campaign_id, status, record_count}), audience_count, and campaign_count. Use before archiving, refreshing, or editing a segment to understand downstream impact, or when the user asks where a segment is used across campaigns. Requires 'discovery' scope.

NameRequiredDescriptionDefault
segment_idYesThe segment ID to look up referencing audiences for

Output Schema

NameRequiredDescription
guidanceNoInterpretation or recovery guidance for this result
audiencesYes
count_unitNo
page_countNoNumber of objects on this page, not the organization total
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
audience_countYes
campaign_countYes
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

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, and destructiveHint=false, so safety is covered. The description adds genuinely new context beyond annotations: the required 'discovery' scope (an auth prerequisite the agent cannot infer elsewhere) and the downstream-impact purpose. It stops short of noting volume/limits on large segment fan-out.

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 return shape, then usage triggers and the scope requirement — no wasted sentences. The enumeration of return fields is mildly redundant given an output schema exists, but it is compact and easy to scan.

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 a rich annotation set and an output schema, the description only needs to add purpose, usage triggers, and prerequisites — all of which it supplies, including the 'discovery' scope. Nothing an agent needs to select or call this tool correctly is missing.

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

Parameters3/5

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

Single parameter with 100% schema description coverage, so the schema already explains segment_id. The description adds no format, lookup, or edge-case guidance (e.g., what happens for an unknown segment ID) beyond the schema baseline.

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

Purpose5/5

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

States a specific verb and resource ('List every audience that references a segment') with explicit scope ('every') plus campaign linkage, which distinguishes it from siblings like get_segment or list_audiences. An agent knows exactly what it returns without opening a schema.

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

Usage Guidelines4/5

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

Gives concrete triggering scenarios: before archiving, refreshing, or editing a segment, or when the user asks where a segment is used across campaigns. That implicitly points at siblings such as archive_segment and refresh_segment, though it never explicitly names alternatives 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_segment_demographicsGet Segment DemographicsAInspect

Profile one saved segment on its own, without any audience set logic or exclusions. Returns a BigQuery-computed demographic breakdown (age buckets, geography, and a behavioral/financial extra when available) evaluated directly over the segment's own definition — the segment-level path, with no audience composition (set_logic/exclusions) applied. Works for any subtype (filter, matched, similarity, propensity) — non-filter subtypes resolve via the same underlying ID-set composition audiences use. Results are cached server-side for 20 minutes. Requires 'discovery' scope.

NameRequiredDescriptionDefault
segment_idYesThe segment ID to retrieve demographics for

Output Schema

NameRequiredDescription
guidanceNoInterpretation or recovery guidance for this result
count_unitNo
page_countNoNumber of objects on this page, not the organization total
segment_idYes
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
extra_fieldNo
total_countYes
generated_atYesISO timestamp of the demographic snapshot
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
segment_nameYes
age_breakdownYes
geo_breakdownYes
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
breakdown_extraNo
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A4.2/5.0
Behavior4/5

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

Adds context beyond the annotations: server-side caching for 20 minutes, the required 'discovery' scope, and that non-filter subtypes resolve through the same ID-set composition used by audiences. This is useful operational detail. It does not, however, explain why annotations mark the tool as non-read-only and non-idempotent (presumably BigQuery job cost), leaving a small gap between declared hints and described 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-loads the core scope in the first sentence and keeps the remainder dense with substantive detail. Minor redundancy: 'without any audience set logic or exclusions' and 'no audience composition (set_logic/exclusions) applied' restate the same exclusion twice.

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 an output schema present, the description needn't enumerate return fields, yet it still summarizes them (age buckets, geography, optional behavioral/financial extra). Combined with caching, scope, and subtype handling, an agent has everything needed to call this 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?

There is only one parameter and schema description coverage is 100%, so the schema already fully documents segment_id. The description adds no format, sourcing, or validation detail about the 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 and resource ('Profile one saved segment') and pins down the scope precisely: demographics computed over the segment's own definition with no audience composition. The contrast with the audience-level path implicitly separates it from siblings like get_audience_demographics and get_segment.

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?

Makes clear this is the segment-level path with no set_logic/exclusions applied, which tells an agent when to pick it over an audience-composition tool, and it notes applicability to all subtypes (filter, matched, similarity, propensity). It stops short of naming the alternative sibling explicitly ('use get_audience_demographics instead when...'), so a 4 rather than a 5.

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

get_workflow_statusGet Workflow StatusB
Destructive
Inspect

Check the current status, step, and gate info for a running similarity or propensity segment workflow. Returns status, current_step, step_count, paused_gate when awaiting a decision, and failure with a code and next action when failed. Requires 'discovery' scope.

NameRequiredDescriptionDefault
workflow_run_idYesThe workflow run ID returned by create_segment(subtype=similarity/propensity)

Output Schema

NameRequiredDescription
statusYes
failureNoSafe failure reason and next action when status is failed
guidanceNoInterpretation or recovery guidance for this result
count_unitNo
page_countNoNumber of objects on this page, not the organization total
segment_idNo
step_countYes
audience_idNo
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
paused_gateNo
current_stepYes
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
workflow_run_idYes
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

B3.4/5.0
Behavior1/5

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

The description describes a read-only inspection operation ('Check the current status'), but annotations declare readOnlyHint=false and destructiveHint=true. This is a direct contradiction, so the behavioral transparency score is forced to 1 despite the description otherwise disclosing return fields and scope requirements.

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

Conciseness5/5

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

Two tightly written sentences, front-loaded with the core purpose and followed by return-value and auth details. Every sentence contributes useful information without redundancy.

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

Completeness4/5

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

The description covers what the tool returns, failure behavior, and required scope, which is strong for a status tool. It could better route the agent to respond_to_workflow_gate when paused_gate is present, but with an output schema available the omission is minor.

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

Parameters3/5

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

There is one parameter with 100% schema description coverage, including its origin from create_segment(subtype=similarity/propensity). The description adds no syntax or format detail beyond the schema, so baseline 3 is appropriate.

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

Purpose5/5

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

The description states a specific verb and resource: checking status, step, and gate info for a running similarity or propensity segment workflow. It distinguishes itself from siblings such as wait_for_workflow and respond_to_workflow_gate by focusing on inspection rather than blocking or decision-making.

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

Usage Guidelines3/5

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

It gives clear context (running similarity or propensity workflows) and mentions paused_gate when awaiting a decision, implying usage. However, it does not explicitly say to use respond_to_workflow_gate when a gate is paused or wait_for_workflow when blocking is desired, so alternatives are left implicit.

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

list_all_deliveriesList All DeliveriesA
Read-onlyIdempotent
Inspect

Search org delivery history across audiences with pagination. Supports status, destination, and audience_id filters, Use audience_id to narrow the search to one audience, or list_deliveries for its latest 100 deliveries. Signed download links are omitted; call get_delivery for one completed artifact. Requires 'discovery' scope.

NameRequiredDescriptionDefault
limitNoMaximum deliveries to return, 1–100 (default 25)
cursorNoOpaque pagination cursor from a previous response
statusNoOnly deliveries with this status
audience_idNoOnly deliveries for this audience
destinationNoOnly deliveries to this destination

Output Schema

NameRequiredDescription
guidanceNoInterpretation or recovery guidance for this result
count_unitNo
deliveriesYesDelivery summaries; signed download URLs are omitted from history
page_countNoNumber of objects on this page, not the organization total
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already cover read-only/idempotent/non-destructive, and the description adds genuinely new context: pagination exists, signed download links are omitted from responses, and a 'discovery' scope is required. It stops short of describing rate limits or link expiry, but the auth and output caveats are the ones an agent would otherwise trip on.

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 scope statement and the alternative routing are front-loaded in a compact sequence of sentences, and each carries information. Minor deduction for the run-on comma splice ('filters, Use audience_id') that slightly muddles the transition.

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 shape needn't be explained, and the description still covers the two things the schema can't convey: missing download links and required scope. Cursor mechanics and page-size limits are left to the schema, which is acceptable given 100% coverage.

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 every parameter is documented there, so the description's mention of status/destination/audience_id filters mostly restates the schema. The one added nuance is that audience_id collapses the search to a single audience, but limit and cursor are left entirely to the schema.

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

Purpose5/5

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

States a specific verb and resource ('Search org delivery history across audiences') with scope (org-wide, paginated), which cleanly separates it from the audience-scoped list_deliveries and the single-item get_delivery.

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

Usage Guidelines5/5

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

Explicitly routes the agent: use audience_id to narrow to one audience, use list_deliveries for its latest 100, and call get_delivery for a single completed artifact. Both alternatives are named with the condition that selects them.

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

list_audiencesList AudiencesA
Read-onlyIdempotent
Inspect

List a page of non-archived saved audiences for this organization, including status, saved count and campaign_id (null when the audience is in no campaign). Use to find an audience_id before get_audience, recount_audience, or delivery; pass a limit of 1–100. Pass campaign_id to list one campaign's audiences, or unlinked=true for audiences in no campaign (not both). A filtered page can hold fewer than limit audiences — keep following next_cursor until it is null. Requires 'discovery' scope.

NameRequiredDescriptionDefault
limitNoMaximum number of audiences to return (default 10; maximum 100)
cursorNonext_cursor from a previous response
compactNoReturn small summaries by default. Use the matching get tool for a complete definition, or compact=false for full entries.
unlinkedNoWhen true, only audiences that belong to no campaign. Do not combine with campaign_id.
campaign_idNoOnly audiences linked to this campaign (newest link first). Use list_campaigns to find campaign IDs.
include_archivedNoInclude archived objects so they can be found and restored

Output Schema

NameRequiredDescription
totalYesNumber of audiences on this page
guidanceNoInterpretation or recovery guidance for this result
audiencesYesSaved audience summaries
count_unitNo
page_countNoNumber of objects on this page, not the organization total
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_cursorYesCursor for the next page, or null
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already cover readOnly, idempotent, non-destructive semantics. The description adds real value beyond them: the auth requirement ('discovery' scope) and the pagination caveat that a filtered page may hold fewer than limit entries and that next_cursor must be followed until null.

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?

Dense but zero-waste: the core purpose and returned fields are front-loaded, then usage, filtering constraints, pagination, and auth follow in a tight sequence. Every sentence carries distinct operational 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?

An output schema exists, so return values needn't be fully spelled out, yet the description still flags key fields. Combined with auth scope and pagination guidance, an agent has everything needed to call this correctly for a six-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?

Schema coverage is 100%, so the schema documents all six params, and the baseline is 3. The description adds meaning beyond it by stating the campaign_id/unlinked mutual exclusion and the cursor-until-null loop, though it doesn't elaborate on compact or include_archived behavior.

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

Purpose5/5

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

States a specific verb and resource (list a page of non-archived saved audiences for this organization) and names the returned fields (status, saved count, campaign_id). This clearly distinguishes the collection operation from the single-object get_audience 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?

Explicitly routes usage: 'Use to find an audience_id before get_audience, recount_audience, or delivery.' It also states the mutually exclusive filter condition (campaign_id or unlinked, not both) and the limit range, 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.

list_campaignsList CampaignsA
Read-onlyIdempotent
Inspect

List a page of campaigns for the organisation. Use when the user asks "what campaigns do I have?" or "show my active campaigns". Returns each campaign brief and status; use get_campaign for linked audience details. Pass the returned next_cursor as cursor to fetch another page. Requires 'discovery' scope.

NameRequiredDescriptionDefault
limitNoMaximum campaigns per page (default 10)
cursorNonext_cursor from a previous list_campaigns page
statusNoOptional filter by campaign status
compactNoReturn small name/status summaries by default; set false for each saved brief and timestamps. Call get_campaign for linked audiences.

Output Schema

NameRequiredDescription
totalYes
guidanceNoInterpretation or recovery guidance for this result
campaignsYes
count_unitNo
page_countNoNumber of objects on this page, not the organization total
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_cursorYes
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, but the description adds behavior they cannot express: what is returned per item (campaign brief and status), how pagination works ('pass the returned next_cursor as cursor'), and that a 'discovery' scope is required. It stops short of ordering guarantees or rate limits, 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.

Conciseness5/5

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

Four short sentences, each doing distinct work: purpose, trigger examples, return shape, pagination, and auth. The primary capability is front-loaded before the sibling routing and pagination detail.

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 paginated list tool with an output schema, an authorisation requirement, and a clear sibling, this covers everything an agent needs: what it returns, how to page, when to prefer get_campaign, and what scope is needed. Return-value specifics are correctly left to the output schema.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds a cross-field contract the schema cannot show: the output's next_cursor is the input for cursor to fetch another page. It also frames the status filter through the 'show my active campaigns' example, giving the enum a usage anchor.

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 gives a specific verb ('List'), resource ('campaigns'), scope ('for the organisation'), and pagination semantics ('a page of'). It also distinguishes itself from get_campaign by name, 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?

It quotes concrete user utterances ("what campaigns do I have?", "show my active campaigns") that select this tool, and explicitly routes linked audience lookups to get_campaign as the alternative. The scope prerequisite ('discovery') is stated up front.

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

list_deliveriesList DeliveriesA
Read-onlyIdempotent
Inspect

List up to 100 deliveries for one accessible saved audience. This audience-scoped path checks the audience and its member segments before returning history. Signed download links are omitted; call get_delivery for one completed artifact. Use list_all_deliveries for an org-wide paginated search. Requires 'discovery' scope.

NameRequiredDescriptionDefault
audience_idYesAudience whose delivery history to fetch

Output Schema

NameRequiredDescription
guidanceNoInterpretation or recovery guidance for this result
count_unitNo
deliveriesYesDelivery summaries; signed download URLs are omitted from history
page_countNoNumber of objects on this page, not the organization total
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare a safe, idempotent read, so this dimension is additive — and the description adds real context beyond them: a 100-item result cap, the fact that the audience and its member segments are validated before history is returned, and that signed download links are deliberately omitted. That is exactly the operational behavior an agent cannot get 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.

Conciseness5/5

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

Four short sentences, each carrying a distinct load: cap and scope first, then the validation behavior, then the link omission and sibling routing, then the scope requirement. Zero redundancy and front-loaded with the most decision-relevant facts.

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 no explanation, and the single parameter is fully covered. Combined with the safety annotations, the description supplies everything needed to decide whether and how to call this 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?

Schema coverage is 100%, so the single audience_id parameter is already documented and the baseline is 3. The description adds the qualifier that the audience must be 'accessible' and that it is 'one' audience, which conveys an authorization/quantity constraint the schema does not.

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 deliveries) plus explicit scope ('for one accessible saved audience'). It also names the two sibling tools that cover adjacent cases (get_delivery, list_all_deliveries), so the agent can distinguish this tool 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?

Gives explicit routing: use this for a single audience's history, call get_delivery for one completed artifact, and use list_all_deliveries for an org-wide paginated search. It also states the prerequisite ('Requires discovery scope'), leaving nothing to infer.

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

list_file_match_deliveriesList File Match DeliveriesA
Read-onlyIdempotent
Inspect

List deliveries for a file-based identity match job, including status and delivery IDs. Signed download links are omitted from history; call get_delivery for a specific completed delivery. Requires 'discovery' scope.

NameRequiredDescriptionDefault
match_idYesThe segment_id returned by create_segment(subtype=matched), also accepted as match_id

Output Schema

NameRequiredDescription
guidanceNoInterpretation or recovery guidance for this result
count_unitNo
deliveriesYesDelivery summaries; signed download URLs are omitted from history
page_countNoNumber of objects on this page, not the organization total
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A4/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), so the description adds the genuinely useful caveat that signed download links are omitted from history, plus the required 'discovery' scope. It doesn't mention pagination or result limits, 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.

Conciseness5/5

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

Three short sentences, front-loaded with what is returned, then the caveat, then the alternative and the scope requirement. No redundant restatement of the title or 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?

A simple read tool with an output schema, full param coverage, and complete annotations; the description supplies the missing pieces an agent needs (link omission, get_delivery alternative, scope). Only the relationship to other delivery-listing tools is left implicit.

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 the segment_id/match_id alias from create_segment(subtype=matched). The description adds only the notion of a 'file-based identity match job', which is marginal over the schema; baseline 3 applies.

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

Purpose4/5

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

States a specific verb (list) and scoped resource (deliveries for a file-based identity match job) plus what the listing contains (status, delivery IDs). It clearly separates itself from get_delivery, but does not explicitly distinguish itself from the sibling list_deliveries / list_all_deliveries, leaving that inference to the agent.

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 alternative and condition: use get_delivery for a specific completed delivery, since download links are not in this history view. It lacks an explicit 'do not use this when...' against list_deliveries/list_all_deliveries, so guidance is clear but not exhaustive.

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

list_file_match_jobsList File Match JobsA
Read-onlyIdempotent
Inspect

List async file-based identity resolution jobs for the org. Each job corresponds to a matched segment created via create_segment(subtype=matched). Returns match_id, name, status, matching_status, input_record_count, match_count, match_rate, amount_charged, file_format, compression, segment_id, audience_id, audience_status, created_at, expires_at. amount_charged is null until this run first participates in a successful delivery, then shows its one-time pending match-usage estimate; it excludes delivery usage. audience_status (active/archived/null) reports whether the linked audience is still open-able in Library — job history itself always persists, even after the segment or audience is deleted. Cursor-paginated. Filter by status to find pending/active/failed jobs. Requires 'discovery' scope.

NameRequiredDescriptionDefault
limitNoMaximum jobs to return (default 30, max 100)
beforeNoLegacy ISO timestamp cursor for pagination
cursorNoOpaque next_cursor from the preceding page; mutually exclusive with before
statusNoFilter by job status

Output Schema

NameRequiredDescription
jobsYes
guidanceNoInterpretation or recovery guidance for this result
has_moreYes
count_unitNo
page_countNoNumber of objects on this page, not the organization total
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_cursorNo
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare read-only/idempotent/non-destructive, and the description adds substantial context beyond them: amount_charged is null until the run participates in a successful delivery and excludes delivery usage, and job history persists even after the segment or audience is deleted. The scope requirement and cursor pagination are also disclosed.

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

Conciseness4/5

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

Purpose and the create_segment linkage are front-loaded, then return fields and caveats follow logically. It is dense but mostly earns its length; the amount_charged sentence is the one place that runs long relative to its decision 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?

An output schema exists, yet the description still names the returned fields and clarifies the two non-obvious ones (amount_charged, audience_status), plus the persistence guarantee. Nothing an agent needs to select and call this read 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?

Schema coverage is 100%, so the baseline is 3 and the schema already documents limit, cursor/before exclusivity, and the enum. The description adds intent-level meaning by explaining that status filtering is how you surface pending/active/failed jobs and that the tool is cursor-paginated.

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 ('List async file-based identity resolution jobs for the org') with a precise linkage rule ('Each job corresponds to a matched segment created via create_segment(subtype=matched)'). It clearly distinguishes itself from the singular sibling get_file_match_job and from list_match_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?

States a concrete use case ('Filter by status to find pending/active/failed jobs') and a hard prerequisite ('Requires discovery scope'), which is real routing information. It does not explicitly name get_file_match_job as the alternative for single-job lookup, so the when-not is implied rather than stated.

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

list_integration_runsList Integration RunsA
Read-onlyIdempotent
Inspect

List safe, retained integration activity for this organization. Intermediate workflow artifacts stay private, while this projection records provenance, counts, selected fields, and billing rail. Results are cursor-paginated. Supply at most one of provider, connection_id, kind, or status; use next_cursor to continue. Requires 'discovery' scope.

NameRequiredDescriptionDefault
kindNoFilter to one run kind
limitNoMaximum runs per page, 1–100
cursorNoOpaque next_cursor from an earlier response
statusNoFilter to one run status
providerNoFilter to one integration provider
connection_idNoFilter to one organization integration connection

Output Schema

NameRequiredDescription
runsYes
guidanceNoInterpretation or recovery guidance for this result
has_moreYes
count_unitNo
page_countNoNumber of objects on this page, not the organization total
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_cursorYes
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already establish read-only, idempotent, non-destructive, closed-world behavior. The description adds meaningful context beyond that: intermediate workflow artifacts remain private, results are cursor-paginated, and the caller needs 'discovery' scope. It does not cover rate limits or response shape, but with annotations present this is solid additional disclosure.

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

Conciseness4/5

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

The description is compact and front-loads the core list operation, then layers in privacy, pagination, filter exclusivity, and scope. The phrasing 'safe, retained integration activity' is slightly abstract, but every sentence contributes to correct invocation.

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 needn't document return fields, and annotations already carry the safety profile. The description covers the key non-schema constraints: one-filter-only, cursor pagination, discovery scope, and artifact privacy. The main remaining gap is sibling-usage guidance, which is minor but real.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds an important cross-parameter rule not expressed in the schema: at most one of provider, connection_id, kind, or status may be supplied. The only minor wrinkle is that it says 'next_cursor' while the parameter is named 'cursor', though the schema clarifies the connection.

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

Purpose4/5

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

The description clearly frames a list operation over integration activity for the organization, and adds useful scope details like provenance, counts, selected fields, and billing rail. It does not explicitly differentiate this tool from sibling list tools such as list_match_runs or get_integration_run, so it stops short of a 5.

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

Usage Guidelines3/5

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

The description gives a concrete invocation constraint: 'Supply at most one of provider, connection_id, kind, or status' and tells the caller to use next_cursor to continue. However, it does not say when to use this tool instead of nearby siblings like get_integration_run or list_saved_integration_matches, leaving selection guidance implied rather than explicit.

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

list_match_runsList Match RunsA
Read-onlyIdempotent
Inspect

List past micro-batch identity match calls for the org. Returns run_id, match_count, match_rate, amount_charged, field_list, created_at, and expires_at. Results are cursor-paginated — pass next_cursor as cursor to fetch older pages. The before timestamp is a legacy alternative. amount_charged is a conservative pending-usage estimate, not a finalized invoice amount. Use to audit recent match activity, inspect estimated costs, or find a specific run by scanning pages. Requires 'discovery' scope.

NameRequiredDescriptionDefault
limitNoMaximum runs to return (default 30, max 100)
beforeNoLegacy ISO timestamp cursor — returns runs created before this time. Use the created_at of the last run in a previous response to paginate.
cursorNoOpaque next_cursor from the preceding page; mutually exclusive with before

Output Schema

NameRequiredDescription
runsYes
guidanceNoInterpretation or recovery guidance for this result
has_moreYes
count_unitNo
page_countNoNumber of objects on this page, not the organization total
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_cursorNo
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A4.3/5.0
Behavior5/5

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

Adds substantial context beyond the readOnly/idempotent annotations: it discloses the required 'discovery' scope, warns that amount_charged is a conservative pending-usage estimate rather than a finalized invoice figure, and explains cursor pagination with the legacy 'before' path. These are exactly the caveats an agent needs to interpret results honestly.

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 pagination mechanics, then the cost caveat, then the scope requirement — a logical order with no filler sentences. The enumerated return-field list is partly redundant since an output schema exists, which is the only real waste.

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 paginated, read-only listing tool this covers everything material: what it lists, pagination and page ordering, the legacy parameter, the meaning of the billing field, and the required scope. Return values are documented by the output schema, so the description need not elaborate further.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description goes slightly beyond by clarifying that next_cursor from a prior response is passed as cursor and that before is a legacy alternative. It does not add format or ordering detail (e.g., sort order of results) beyond what the schema already documents.

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

Purpose4/5

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

States a specific verb and resource (list past micro-batch identity match calls scoped to the org) and names the returned identifiers, so an agent knows it's a list/audit endpoint rather than a single-run fetch. It never explicitly contrasts itself with the close sibling get_match_run, so the differentiation is implied by 'past... calls' rather than stated.

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

Usage Guidelines4/5

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

Gives concrete usage scenarios: audit recent match activity, inspect estimated costs, or find a specific run by scanning pages. That is clear positive guidance, but there are no exclusions or explicit pointers to alternatives — notably it recommends 'scanning pages' to find a run rather than naming get_match_run with a known run_id, which is a missed routing opportunity.

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

list_saved_integration_matchesList Saved Integration MatchesAInspect

List saved integration matches available to build into a segment. Returns aggregate counts without raw identities. Refreshes stored collection counts and may initialize collection metadata; does not create segments or charge for records. Use preview_saved_integration_segment before building. Requires 'discovery' scope.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
guidanceNoInterpretation or recovery guidance for this result
count_unitNo
page_countNoNumber of objects on this page, not the organization total
collectionsYes
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A4.7/5.0
Behavior5/5

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

The description adds substantial behavioral detail beyond the annotations: it refreshes stored collection counts, may initialize collection metadata, does not create segments, and does not charge for records. It also discloses that results are aggregate counts without raw identities and that the 'discovery' scope is required.

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

Conciseness5/5

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

The description is front-loaded with the core purpose and then adds precise operating constraints in a compact form. Every sentence contributes useful information about scope, side effects, or prerequisites.

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

Completeness5/5

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

With no input parameters, an output schema present, and annotations covering safety hints, the description supplies the remaining context an agent needs: auth scope, side effects, aggregate-only returns, and the recommended preview step. Nothing material is missing for correct invocation.

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

Parameters4/5

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

The tool has zero parameters, so there is no input semantics to explain; the schema coverage is effectively complete. Per the rubric, a zero-parameter tool has a baseline of 4 for this dimension.

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

Purpose5/5

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

The description states a specific verb and resource: it lists saved integration matches available to build into a segment. It also distinguishes this from building by explicitly saying it does not create segments, and it names preview_saved_integration_segment as a related tool.

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

Usage Guidelines4/5

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

It gives clear usage context by saying to use preview_saved_integration_segment before building, and it states the required 'discovery' scope. It does not explicitly map out every sibling alternative such as list_match_runs or list_integration_runs, so it stops short of full when-to-use guidance.

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

list_segmentsList SegmentsA
Read-onlyIdempotent
Inspect

List a page of visible, non-archived saved segments with subtype, status, and record counts. Use when the user asks what segments they have; filter by subtype or pass a limit of 1–100. For one complete definition, call get_segment with its segment_id. Requires 'discovery' scope.

NameRequiredDescriptionDefault
limitNoMaximum number of segments to return (default 10; maximum 100)
cursorNonext_cursor from a previous response
compactNoReturn small summaries by default. Set false to include saved filter_groups on filter segments; get_segment retrieves one complete definition.
subtypeNoOptional: filter results to a specific segment subtype ('filter', 'matched', 'similarity', 'propensity')
include_archivedNoInclude archived objects so they can be found and restored

Output Schema

NameRequiredDescription
totalYesNumber of segments on this page
guidanceNoInterpretation or recovery guidance for this result
segmentsYesSaved segment summaries
count_unitNo
page_countNoNumber of objects on this page, not the organization total
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_cursorYesCursor for the next page, or null
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already carry the read-only, idempotent, closed-world, non-destructive profile, so the description correctly spends its words elsewhere: the visibility rule (only visible, non-archived segments are listed), pagination via cursor, and the 'discovery' scope authorization requirement, which appears nowhere in the structured fields. It doesn't discuss ordering or what happens at the end of pagination, but that is minor given an output schema exists.

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

Conciseness4/5

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

Three short sentences, front-loaded with purpose before usage and the alternative. The '1–100' limit clause duplicates the schema and is the one sentence fragment that doesn't 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 read-only list tool with full schema coverage, an output schema, and rich annotations, the description covers purpose, trigger, alternative, pagination, and the required auth scope. Only marginal gaps remain (result ordering), and those are low-stakes for this operation.

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

Parameters3/5

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

Schema coverage is 100%, so all five parameters, ranges, defaults, and the subtype enum are already documented. The description adds only the implicit default of excluding archived segments and restates the 1–100 limit already in the schema; subtype and compact are not elaborated beyond what the schema says. Baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb and resource (list saved segments) plus the scope qualifiers (visible, non-archived, paged) and the fields returned (subtype, status, record counts). It explicitly routes the singular case to get_segment, so an agent can separate it from get_segment, count_segment, and list_audiences 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?

Gives an explicit trigger ('when the user asks what segments they have') and an explicit alternative with its selecting condition ('For one complete definition, call get_segment with its segment_id'). No inference about which sibling to use is left to the agent.

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

match_recordsMatch RecordsA
Destructive
Inspect

Perform real-time identity resolution on up to 100 records. Returns run_id, match_count, record_count, match_rate, amount_charged, and records[] — one output record per input record, matched or not (each with row_id, iag_person_id, match_level, match_type, match_confidence, enrichment fields, and the licensing labels below). iag_person_id is an org-scoped, non-reversible id: present on a real match, or a best-effort id derived from the row's own identity signals (or null) when unmatched — use match_count/record_count, not id-presence, to tell real matches from derived-only rows. Each record also carries resolution_action (resolved = organic PII match, refreshed = the row submitted a valid iag_person_id, unmatched = no real match, identity_unavailable = a previously valid id no longer resolves to deliverable data) and license_action (none, started, or renewed), plus license_expires_at (ISO-8601 or null) — these two fields are independent: a row can be resolution_action "resolved" and license_action "renewed" at once. The run_id can be passed immediately to get_match_run to retrieve or audit this call later. Billing: emits usage per matched record only — derived-only rows are free; amount_charged is a conservative pending-usage estimate, not a finalized invoice amount. A tier-01 Person ID from a prior real match or licensed audience delivery can go directly to Refresh; an audience-only ID has null match_level until a real match occurs. Include I in match_level for direct ID lookup, or omit the filter. An active license avoids another identity-license charge. For more than 100 records, use create_segment(subtype="matched") with a file upload instead. Requires 'creator' scope.

NameRequiredDescriptionDefault
recordsYesArray of 1–100 records to match. Each record is a key-value object of identity fields: email, phone, full_name (or first_name/middle_name/last_name/name_suffix), address_1/address_2/city/state/zip, dob, iag_person_id. If full_name is provided without first_name/last_name, the engine parses it into components automatically. Pre-hashed clients may submit email_sha256/phone_sha256 (lowercase-hex SHA-256) instead of raw email/phone — do not submit an already-hashed value in the raw field, it will be hashed a second time and never match. Extra permutations beyond the primary identity fields may be supplied as emails[]/phones[]/addresses[]/emails_sha256[]/phones_sha256[] arrays. Each addresses[] entry is read by exact key: address_1, address_2, city, state, zip (zip5/postal_code/zip_code accepted as ZIP aliases); any other key is ignored.
field_listNoOptional list of output fields to include in matched records
match_levelNoRestrict identity resolution to these match levels (Individual/Household/Digital/Spatial/Address). Omit to use the platform default (all levels).
template_idNoOptional enrichment template ID to apply
spatial_modeNoSpatial trade-area mode. residential is the default; use work for workplace-oriented spatial matching, or auto for dynamic commercial workplace routing.residential

Output Schema

NameRequiredDescription
run_idYes
recordsYes
guidanceNoInterpretation or recovery guidance for this result
count_unitNo
match_rateYes
page_countNoNumber of objects on this page, not the organization total
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
match_countYes
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
record_countYes
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
amount_chargedYesPending usage estimate in USD, not a finalized invoice
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A4.5/5.0
Behavior5/5

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

Goes far beyond the annotations: discloses the billing model (usage per matched record only, derived-only rows free, amount_charged is a pending estimate not an invoice), the 'creator' scope requirement, and the non-obvious semantics of iag_person_id (org-scoped, non-reversible, best-effort derived id on unmatched rows — use match_count/record_count rather than id-presence to distinguish). It also explains the independent resolution_action and license_action axes with a concrete combined case.

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 return contract are front-loaded, which is good, but the body collapses into a single dense run-on paragraph mixing billing, ID semantics, action enums, and filtering advice. The sentence "Include I in match_level for direct ID lookup, or omit the filter" is cryptic and buried mid-paragraph where it is easy to miss.

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 existing, the description supplies the interpretation layer that the schema cannot: what each action value means, how the two action fields interact, and how to determine real matches from derived rows. Scope requirements, billing caveats, and the scale-up alternative are all covered, leaving nothing an agent needs to call this correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description still adds real meaning on top: it clarifies that a tier-01 Person ID from a prior real match can go straight to Refresh while an audience-only ID has null match_level, and gives guidance on match_level filtering. The remaining parameters (template_id, spatial_mode, field_list) are left entirely to the schema.

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

Purpose5/5

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

Opens with a specific verb and resource ("Perform real-time identity resolution on up to 100 records") and immediately establishes the scope limit and the inline-record input shape. It is clearly distinct from sibling tools like create_segment and get_match_run, which it names as complements rather than substitutes.

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 routing rule for large batches ("more than 100 records, use create_segment(subtype=\"matched\") with a file upload instead") and points to get_match_run for later retrieval. It also warns that an active license avoids another identity-license charge. It stops short of contrasting against other match-adjacent siblings such as deliver_file_match or list_match_runs, so it is strong but not exhaustive.

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

patch_audiencePatch AudienceA
DestructiveIdempotent
Inspect

Rename, archive/restore, or change the composition of an existing audience. Also supports adding/removing included or excluded segments. set_logic must be "union" or "intersection" — never "exclusion". To exclude records, use add_excluded_segment_id. Requires 'creator' scope.

NameRequiredDescriptionDefault
nameNoNew display name for the audience
statusNoStatus transition: active once ready, archived to hide from the default list; active restores it
set_logicNoChange inclusion logic: "union" (OR) or "intersection" (AND)
audience_idYesThe audience ID returned by create_audience or list_audiences
add_segment_idNoSegment ID to append to the included list
remove_segment_idNoSegment ID to remove from the included list
add_excluded_segment_idNoSegment ID to add as an exclusion — records matching this segment are subtracted from the audience
remove_excluded_segment_idNoExcluded segment ID to stop excluding

Output Schema

NameRequiredDescription
statusYes
guidanceNoInterpretation or recovery guidance for this result
count_unitNo
page_countNoNumber of objects on this page, not the organization total
audience_idYes
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description adds meaningful context beyond that: the 'creator' scope requirement and the invalid-value warning on set_logic, which an agent would otherwise only learn from a failed call.

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?

Four short sentences, front-loaded with the capability summary and followed by constraints and prerequisites; no filler. There is minor redundancy where the set_logic restriction restates the schema enum.

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, and the annotations carry the destructive/idempotent profile. What is missing is whether multiple segments can be added in one call (the schema exposes only singular add/remove fields) and how this tool relates to archive_audience for the archived status.

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter is already documented, including the exclusion semantics of add_excluded_segment_id. The description reinforces the set_logic enum constraint but adds no syntax, cardinality, or format detail beyond the schema – baseline 3 applies.

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

Purpose4/5

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

The description names specific verbs (rename, archive/restore, change composition) against a specific resource (an existing audience), so the agent knows this is a mutating edit tool. It does not distinguish itself from the sibling archive_audience, which appears to overlap with the status=archived path described here, leaving a small ambiguity about which to use for archiving.

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

Usage Guidelines3/5

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

It gives one useful routing rule ('To exclude records, use add_excluded_segment_id') and a hard constraint ('never exclusion'), plus a prerequisite ('Requires creator scope'). However, it never says when to prefer this tool over archive_audience or patch_segment, so the alternative-tool guidance is only implied.

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

patch_segmentUpdate SegmentA
Destructive
Inspect

Rename a segment or replace a filter segment definition. Supply filters OR filter_groups, never both. record_limit=null removes a size limit; a positive limit requires bounded State, City, or ZIP Code geography. Definition changes create a new version; renaming does not. Use archive_segment to archive or restore. Requires the creator scope. Requires 'creator' scope.

NameRequiredDescriptionDefault
nameNoNew display name
filtersNoReplacement AND-combined filters (filter subtype only)
segment_idYesSaved segment ID
record_limitNoMaximum population size (up to 1 billion); null removes the limit
filter_groupsNoReplacement grouped filters (filter subtype only)

Output Schema

NameRequiredDescription
statusYes
guidanceNoInterpretation or recovery guidance for this result
count_unitNo
page_countNoNumber of objects on this page, not the organization total
segment_idYes
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A4.5/5.0
Behavior4/5

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

Adds real behavior beyond the annotations: definition changes create a new version while renaming does not, and the call requires creator scope. It also signals replacement (not merge) semantics for filters. It falls short of describing what is lost when a definition is replaced, which matters for a tool flagged destructiveHint=true.

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

Conciseness4/5

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

Dense, front-loaded sentences covering mode selection, constraints, versioning, and scope in a short block. The final two sentences duplicate the same requirement ("Requires the creator scope. Requires 'creator' scope."), wasting one sentence.

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, non-idempotent mutation with an output schema, it covers prerequisites, mutual exclusion, versioning side effects, and the sibling for archiving. The one gap is not spelling out that replaced filters are discarded entirely, which is the main thing an agent could get wrong.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds two facts the schema does not carry: filters and filter_groups are mutually exclusive, and record_limit must be paired with bounded geography when positive. It does not explain how name interacts with a definition change in the same call.

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 two specific operations on a specific resource: rename a segment or replace its filter definition. It also explicitly routes archiving elsewhere ("Use archive_segment to archive or restore"), so an agent can distinguish it from the nearest 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?

Gives concrete when-to-use rules: filters XOR filter_groups, record_limit=null to remove a cap, a positive limit requires bounded State/City/ZIP geography, and archive_segment is the tool for archive/restore. Exclusions and alternatives are both stated explicitly.

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

preview_saved_integration_segmentPreview Saved Integration SegmentA
Read-onlyIdempotent
Inspect

Preview exact unique identities, duplicate receipts, expiry/privacy exclusions, existing overlap, and net additions before creating or extending a segment. This performs no mutation and records no usage. Requires 'discovery' scope.

NameRequiredDescriptionDefault
filtersNoOptional provider, connection, run, source-kind, and time-window filters
target_segment_idNoOptional existing matched segment for overlap and net-addition counts

Output Schema

NameRequiredDescription
previewYes
guidanceNoInterpretation or recovery guidance for this result
cutoff_atYes
count_unitNo
page_countNoNumber of objects on this page, not the organization total
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

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=false and openWorldHint=false, so the safety profile is covered. The description adds genuinely new operational context beyond them: 'records no usage' (cost/quota behavior) and "Requires 'discovery' scope" (an auth prerequisite the agent cannot infer from the schema). It stops short of noting latency or result-size expectations for a preview over large filter sets.

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

Conciseness5/5

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

Three short sentences with zero filler; the enumerated outputs are front-loaded and the scope prerequisite is placed last where it reads as a gate. Every clause earns its place.

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

Completeness4/5

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

An output schema exists, so return values need not be explained, and the description covers the mutation-free guarantee plus the required scope. Slightly incomplete in that it never clarifies how the preview result relates to the eventual build (e.g., whether counts are guaranteed identical at build time).

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

Parameters3/5

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

Schema description coverage is 100% with only 2 parameters, both described in the schema (filters and target_segment_id), so the schema carries the semantics. The description adds no detail about filter composition, time-window semantics, or how target_segment_id changes the overlap calculation, 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 (Preview) and a specific resource (saved integration segment), then enumerates the exact outputs produced: unique identities, duplicate receipts, expiry/privacy exclusions, overlap, net additions. The phrase 'before creating or extending a segment' distinguishes it from the mutating sibling build_saved_integration_segment without needing to open 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 Guidelines4/5

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

'before creating or extending a segment' gives a clear decision point for when to reach for this tool. It does not explicitly name build_saved_integration_segment as the alternative, so the routing is implied by lifecycle position rather than stated.

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

quote_deliveryQuote DeliveryA
Destructive
Inspect

Get a usage estimate for delivering an audience before creating billable work. A fresh quote creates a pending quote record and replaces the audience current quote reference; it does not purchase or deliver records. Returns TWO cost figures: cost_estimate is the license-aware expected charge (identities this audience already holds an active 12-month license for elsewhere are excluded from the billable count), and max_cost_estimate is the worst-case ceiling assuming nothing is pre-licensed — always quote max_cost_estimate as the ceiling and cost_estimate as the expected price when license_pricing.status is "live" or "cached"; if license_pricing.status is "unavailable", cost_estimate equals max_cost_estimate exactly and only one number needs mentioning. Key response fields: already_delivered (true = this exact delivery is free), cost_estimate.total_cost / max_cost_estimate.total_cost (total USD), cost_estimate.base_cost / match_cost / field_cost / destination_cost (breakdown; match_cost is the one-time deferred file-match component, never license-discounted), billing_count (records that will be billed), sufficient_balance, shortfall. Call this before deliver_audience so the user can review cost. Requires 'discovery' scope.

NameRequiredDescriptionDefault
field_listNoCustom field list (alternative to template_id)
audience_idYesAudience to quote
destinationYesActive delivery destination; partner pushes are not yet available
template_idNoEnrichment template ID
output_formatNoRequested download artifact format.
output_compressionNoRequested download compression. gzip supports csv/json/jsonl; Avro uses native DEFLATE.none

Output Schema

NameRequiredDescription
guidanceNoInterpretation or recovery guidance for this result
shortfallYes
count_unitNo
page_countNoNumber of objects on this page, not the organization total
audience_idYes
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
destinationYes
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
cost_estimateYesExpected license-aware charge in USD
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
license_pricingYes
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions
already_deliveredYes
max_cost_estimateYesWorst-case charge ceiling in USD
sufficient_balanceYes

TDQS

A4.6/5.0
Behavior5/5

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

Discloses non-obvious side effects beyond the annotations — a fresh quote creates a pending quote record and replaces the audience's current quote reference — which is consistent with destructiveHint=true and idempotentHint=false. It also explains license-aware billing exclusions, the match_cost exception, behavior when license_pricing.status is 'unavailable', and the required 'discovery' scope.

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 and the pre-delivery rule, then layers cost semantics; every clause carries meaning. It is dense but long, and some of the enumerated response fields would be available in the output schema, which costs a point on 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?

Covers when to call, side effects, billing semantics, edge cases (licensing unavailable, already_delivered), and the OAuth scope requirement. For a quote tool with a destructive annotation, this leaves nothing an agent needs to know before invoking it.

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 parameter documentation is already handled by the schema, and the description adds nothing about field_list, template_id, output_format, or output_compression. Baseline 3 applies since the schema does the heavy lifting here.

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

Purpose5/5

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

States a specific verb and resource ('Get a usage estimate for delivering an audience') plus a scope qualifier ('before creating billable work'). It explicitly separates itself from the sibling deliver_audience by noting it does not purchase or deliver records.

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 ordering rule: 'Call this before deliver_audience so the user can review cost.' The alternative (actually delivering) is named and the condition selecting this tool is unambiguous.

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

recount_audienceRecount AudienceA
DestructiveIdempotent
Inspect

Refresh the stored record_count of one saved audience from its current included/excluded segment composition. Call after adding or removing segments. For an unsaved population preview use discovery_count; for a segment snapshot use count_segment. Requires 'discovery' scope.

NameRequiredDescriptionDefault
audience_idYesThe audience ID to recount

Output Schema

NameRequiredDescription
guidanceNoInterpretation or recovery guidance for this result
count_unitNo
page_countNoNumber of objects on this page, not the organization total
audience_idYes
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
record_countYesFresh audience count, or null when unavailable
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare the mutating profile (readOnlyHint=false, destructiveHint=true, idempotentHint=true), and the description adds real context beyond them: the prerequisite 'discovery' scope and the fact that the mutation overwrites a previously stored record_count. It does not explain why the operation is flagged destructive or what happens to the stored value if the recount fails, so it stops short of full disclosure.

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

Conciseness5/5

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

Four short sentences in a deliberate order: what it does, when to call it, which siblings to use instead, and the auth requirement. Every sentence carries distinct information and the purpose is front-loaded.

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 an output schema present, rich annotations, and a single fully-documented parameter, the description covers everything an agent needs to select and invoke it: scope requirement, post-segment-edit trigger, and sibling disambiguation.

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

Parameters3/5

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

Schema coverage is 100% for the single parameter, so the schema already documents audience_id. The description only implies scope ('one saved audience') and adds no format or lookup guidance beyond what the schema provides, making the baseline 3 appropriate.

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

Purpose5/5

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

States a specific verb and resource ('Refresh the stored record_count of one saved audience') and adds the mechanism ('from its current included/excluded segment composition'), which tells an agent exactly what is recomputed. It also names the two nearest siblings (discovery_count, count_segment) so the tool is distinguishable 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?

Gives an explicit trigger ('Call after adding or removing segments') and explicit alternative routing with the conditions that select them: unsaved population preview -> discovery_count, segment snapshot -> count_segment. 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.

refresh_audienceRefresh AudienceA
Destructive
Inspect

Refresh one named member segment of an audience against the current IAG, then refresh the audience's own version/expiry. An audience is a composition of one or more member segments, possibly of different subtypes — there is no "primary" segment, so segment_id is required (400 SEGMENT_ID_REQUIRED if omitted, 400 SEGMENT_NOT_A_MEMBER if it is not part of this audience). Behaviour is specific to the chosen segment's subtype:

  • filter: synchronous — returns status: active immediately. record_count is null; call recount_audience if a fresh count is needed before quoting.

  • matched: with hitl false/unset (default): returns status: pending + upload_url. Instruct the user to upload their identity list to upload_url (same or updated file). After upload, call wait_for_segment(segment_id) to block until identity resolution completes. With hitl: true: the upload is staged instead — follow the analyze_audience_upload -> confirm_column_mappings / cancel_matched_upload -> wait_for_segment sequence documented on create_segment(subtype=matched) (confirm_column_mappings/cancel_matched_upload take this segment_id, not audience_id).

  • similarity: returns status: pending + workflow_run_id. Call wait_for_workflow(workflow_run_id) to monitor progress. Do not attempt to deliver until status is active.

  • propensity: returns status: pending + workflow_run_id. Call wait_for_workflow(workflow_run_id) to monitor progress. Do not attempt to deliver until status is active. Returns 422 MISSING_POSITIVE_CLASS_ID for legacy propensity segments that predate field storage — archive the affected segment with archive_segment and create a replacement using create_segment. Always call get_audience first to see the member segments and their subtypes, so you can pick (or have the user pick) the right segment_id. Requires 'creator' scope.

NameRequiredDescriptionDefault
hitlNoIf true: pauses similarity/propensity workflows at human-in-the-loop gates; stages a matched segment's re-upload instead of resolving automatically. Defaults to false.
segment_idYesWhich member segment of this audience to refresh. Required — there is no default/primary segment.
audience_idYesThe audience ID to refresh
compressionNoMatched subtype: replacement upload compression.none
shard_countNoMatched subtype: number of same-format shards. Every CSV shard must include its own header row.

Output Schema

NameRequiredDescription
statusYes
subtypeYes
versionYes
guidanceNoInterpretation or recovery guidance for this result
next_stepYes
refreshedYes
count_unitNo
page_countNoNumber of objects on this page, not the organization total
segment_idYes
upload_urlNo
audience_idYes
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
upload_urlsNo
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
workflow_run_idNo
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A4.5/5.0
Behavior5/5

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

Annotations declare destructive/non-idempotent/openWorld, and the description goes well past them: synchronous vs pending return states per subtype, the upload_url and workflow_run_id handoffs, the hitl staging variant, the 400 SEGMENT_ID_REQUIRED / SEGMENT_NOT_A_MEMBER / 422 MISSING_POSITIVE_CLASS_ID failure modes, and the 'creator' scope requirement. This is unusually rich behavioral disclosure.

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

Conciseness4/5

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

Long but front-loaded and well structured with a subtype-keyed bullet list, so scanning is easy. The similarity and propensity bullets are near-verbatim duplicates and could be merged, which is the only real waste.

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, multi-subtype orchestration tool, the description covers prerequisites, per-path branching, downstream tool chains, and error recovery. An output schema exists, so return-value detail is correctly omitted.

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

Parameters4/5

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

Schema coverage is 100%, so the schema alone justifies a 3. The description still adds semantic value: it explains why segment_id has no default (audiences may contain multiple subtypes, no 'primary'), and it clarifies that hitl stages a matched re-upload rather than merely pausing workflows. compression and shard_count are left to the schema.

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

Purpose4/5

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

Opens with a specific verb and resource: refresh one named member segment against the current IAG, then refresh the audience's version/expiry. That is far more precise than the title. It does not, however, distinguish itself from the sibling refresh_segment, which an agent could plausibly confuse it with given the near-identical name.

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 sequencing: call get_audience first to pick the right segment_id, then branch by subtype. It names the exact follow-up tools (wait_for_segment, wait_for_workflow, analyze_audience_upload, confirm_column_mappings) per case, states when delivery must not be attempted, and gives the remedy for legacy propensity segments. 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.

refresh_segmentRefresh SegmentA
Destructive
Inspect

Re-derive a single stale or expired segment from the current IAG. Updates ONLY the segment — referencing audiences are never touched; the response lists them in affected_audiences so you can recount or refresh them (use refresh_audience for a whole-composition refresh). Behaviour is subtype-specific:

  • filter: synchronous — bumps current_version, nulls record_count, resets the 90-day TTL, returns status: active. If the segment is already fresh the call is a no-op (refreshed: false); pass force: true to bump anyway. Call count_segment afterwards for a fresh count.

  • matched: with hitl false/unset (default): returns status: pending + upload_url (24 h presign) targeting the canonical upload path — or upload_urls (an array) when shard_count > 1 — instruct the user to re-upload their identity list (one same-format file per URL for a sharded upload; every CSV shard needs its own header); identity resolution runs automatically once all shards are uploaded. Then call wait_for_segment(segment_id). With hitl: true: the upload is staged instead — after upload, follow the analyze_audience_upload -> confirm_column_mappings / cancel_matched_upload -> wait_for_segment sequence documented on create_segment(subtype=matched). Returns 409 SHARED_SOURCE_DATA for matched duplicates that reference another segment's data — the message names the source segment to refresh instead.

  • similarity: returns status: pending + workflow_run_id (re-launched scoring workflow). Call wait_for_workflow(workflow_run_id).

  • propensity: returns status: pending + workflow_run_id. 422 MISSING_POSITIVE_CLASS_ID for legacy segments that predate positive_class_segment_id storage — archive those with archive_segment and create a replacement. Returns 409 SEGMENT_ARCHIVED for archived segments — restore them first with archive_segment(restore=true). Requires 'creator' scope.

NameRequiredDescriptionDefault
hitlNoIf true: pauses re-launched similarity/propensity workflows at human-in-the-loop gates; stages a matched segment's re-upload instead of resolving automatically. Defaults to false.
forceNoFilter subtype only: bump the version even when the segment already looks fresh. Defaults to false.
segment_idYesThe segment ID to refresh
compressionNoMatched subtype: replacement upload compression.none
shard_countNoMatched subtype: set > 1 for multiple same-format shards.

Output Schema

NameRequiredDescription
nameYes
statusYes
subtypeYes
guidanceNoInterpretation or recovery guidance for this result
next_stepYes
refreshedYes
count_unitNo
page_countNoNumber of objects on this page, not the organization total
segment_idYes
upload_urlNo
audience_idNo
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
upload_urlsNo
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
record_countNoStored count; null means unknown. Call count_segment for a current count.
record_limitNoMaximum members; null means no explicit cap
filter_groupsNoComplete saved filter definition; one AND group also represents a simple flat filter list
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
current_versionNo
workflow_run_idNo
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions
upload_expires_atNo
affected_audiencesYes

TDQS

A4.8/5.0
Behavior5/5

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

Although annotations already declare destructive=true, idempotent=false, and openWorld=true, the description adds substantial context: version bumping, TTL reset, no-op semantics, 409 SEGMENT_ARCHIVED and SHARED_SOURCE_DATA errors with remediation, 422 MISSING_POSITIVE_CLASS_ID, the 24-hour presign upload flow, and the required 'creator' scope. No statement contradicts the annotations.

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

Conciseness4/5

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

The description is long, but the length is justified by four distinct subtypes and several error paths. It is front-loaded with the core scope and then structured as per-subtype bullets, with no obvious filler sentences.

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-value explanation is technically optional, yet the description still names key response fields (affected_audiences, status, upload_url, workflow_run_id) and explains every subtype's downstream step. Given the destructive annotation and multi-path behavior, nothing an agent needs in order to call it correctly appears to be 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 100%, so the schema already documents all five parameters, setting the baseline at 3. The description adds real semantic value by tying force to the filter no-op path, hitl to staged matched uploads and paused workflows, shard_count to the array of upload_urls, and compression to matched re-uploads.

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 ('Re-derive a single stale or expired segment from the current IAG') and immediately scopes it against siblings: it updates ONLY the segment and names refresh_audience for whole-composition refreshes. An agent can distinguish it from refresh_audience, count_segment, and create_segment without inspecting 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?

It gives subtype-specific when-to-use behavior: filter is synchronous and calls count_segment afterwards; matched requires wait_for_segment and has a HITL staging path; similarity/propensity require wait_for_workflow. It also names alternatives and fallbacks (refresh_audience, archive_segment, create_segment) and states the exact conditions that select them.

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

respond_to_workflow_gateRespond to Workflow GateA
Destructive
Inspect

Submit a user response to a paused HITL gate in a running workflow. Only relevant when the segment was created with hitl=true. After responding, call wait_for_workflow again to continue monitoring. Requires 'creator' scope.

NameRequiredDescriptionDefault
gate_idYesThe gate_id from the paused_gate payload returned by wait_for_workflow or get_workflow_status
responseYesThe user's chosen response — must be one of the options listed in the gate payload
workflow_run_idYesThe workflow run ID

Output Schema

NameRequiredDescription
statusYes
guidanceNoInterpretation or recovery guidance for this result
count_unitNo
page_countNoNumber of objects on this page, not the organization total
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
workflow_run_idYes
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A4.4/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, so the safety profile is carried by structured data. The description adds genuinely non-redundant operational context: the creator-scope requirement and the required post-response monitoring call, which tell the agent this mutates run state and must be followed by a wait. It stops short of explaining what 'destructive' means here (e.g., whether a submitted response is final and cannot be revised).

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

Conciseness5/5

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

Four short sentences, each carrying distinct load: purpose, applicability condition, follow-up call, and auth requirement. The primary action is front-loaded and there is no filler.

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

Completeness4/5

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

An output schema exists, so return values need no explanation, and the description covers prerequisites, scope, and next steps for a state-mutating tool. The remaining gap is failure-mode guidance: what happens if the response is not one of the offered options or if the gate was already resolved.

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

Parameters3/5

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

Schema description coverage is 100%, and each of the three parameters is documented in-schema, including that gate_id comes from the paused_gate payload and response must match a gate option. The description adds no parameter semantics beyond what the schema already states, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource: 'Submit a user response to a paused HITL gate in a running workflow.' The gate/response framing and the HITL qualifier distinguish it cleanly from siblings like wait_for_workflow and get_workflow_status, which only observe rather than resolve a gate.

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 precondition ('Only relevant when the segment was created with hitl=true'), the follow-up action ('After responding, call wait_for_workflow again to continue monitoring'), and the authorization requirement ('Requires creator scope'). An agent knows both when to call it and what to do next without inference.

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

update_campaignUpdate CampaignA
DestructiveIdempotent
Inspect

Update a campaign name, description, or status. Set status=archived to soft-archive it while preserving linked audiences; set status=active to restore an archived campaign. Requires 'creator' scope.

NameRequiredDescriptionDefault
nameNoNew display name for the campaign
statusNoNew status for the campaign
campaign_idYesThe campaign ID to update
descriptionNoCampaign brief, goals, intended market, and desired outcomes; use an empty string to clear it

Output Schema

NameRequiredDescription
idYes
nameYes
statusYes
guidanceNoInterpretation or recovery guidance for this result
audiencesYes
count_unitNo
page_countNoNumber of objects on this page, not the organization total
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

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=true, and readOnlyHint=false, so the description only needs to add context — and it does: it discloses that archiving is a soft archive that preserves linked audiences, that the operation is reversible via status=active, and that 'creator' scope is required. What is missing is whether unspecified fields are left untouched on a partial update.

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

Conciseness5/5

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

Three sentences, front-loaded with the primary action, then the status semantics, then the authorization prerequisite. Every sentence carries information an agent would otherwise have to guess at; no filler or restatement of the title.

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

Completeness5/5

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

For a 4-parameter mutation with full schema coverage, annotations covering safety and idempotency, and an output schema in place, the description covers the remaining unknowns an agent needs: reversibility, data preservation, and the required scope. Nothing needed to invoke it correctly is absent.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description earns an extra point by explaining the behavioral consequence of each status enum value (soft-archive vs restore) rather than just restating the field. It still says nothing about name/description constraints or clearing behavior, which the schema handles alone.

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

Purpose4/5

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

States a specific verb (update) and resource (campaign) plus the exact mutable fields (name, description, status), which cleanly separates it from create_campaign, get_campaign, and the audience-side patch tools. It stops short of naming a sibling it is commonly confused with, so it lands at 4 rather than 5.

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

Usage Guidelines4/5

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

Gives concrete conditional guidance for the two status values: status=archived to soft-archive while preserving linked audiences, status=active to restore an archived campaign. It does not address when to prefer this over sibling tools like archive_audience or link_audience_to_campaign, so it is clear context without explicit alternatives.

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

wait_for_deliveryWait For DeliveryA
Read-onlyIdempotent
Inspect

Block until a delivery completes or fails. Call this immediately after deliver_audience or deliver_file_match when the response has status: "processing". Polls GET /v1/audiences/{audience_id}/deliveries/{delivery_id} every 15 seconds. On success returns the full delivery object including download_urls[] — share these directly with the user. Each signed link is valid for 24 hours; expires_at is the delivery artifact retention date, not the link expiry. Call get_delivery for a fresh link while the artifact remains available. Throws DELIVERY_FAILED if the export failed (check failure_reason), or DELIVERY_TIMEOUT if it did not finish within timeout_seconds (default 30 seconds). A wait timeout does not cancel or fail the job; use the corresponding get tool to check it again. Requires 'discovery' scope.

NameRequiredDescriptionDefault
audience_idYesAudience ID returned by the delivery or file-match job; do not assume it equals match_id or segment_id
delivery_idYesDelivery ID returned by deliver_audience or deliver_file_match
timeout_secondsNoMaximum seconds to wait (default 30). Prefer get_delivery for a single status check; a wait timeout is not an export failure.

Output Schema

NameRequiredDescription
statusYesCurrent delivery state
guidanceNoInterpretation or recovery guidance for this result
count_unitNo
page_countNoNumber of objects on this page, not the organization total
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
download_urlsNoFresh signed artifact URLs on an individual completed download delivery
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A4.8/5.0
Behavior5/5

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

Beyond the readOnly/idempotent annotations, it discloses the 15s polling interval, the return shape (download_urls[], expires_at semantics vs link expiry), the 24h link validity, both error codes with their meanings, that a timeout does not cancel the job, and the required 'discovery' scope. Rich behavioral context that annotations alone could not convey.

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

Conciseness4/5

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

Front-loaded with the core action, then branching into behavior, errors, and prerequisites. Every sentence carries operational value, though it is fairly dense; nothing is wasted but it is near the upper bound of length before becoming a reference doc.

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 read-only, idempotent wait tool with an output schema and full schema coverage, the description covers the wait/poll semantics, failure modes, link retention nuances, retry/tool-switching guidance, and auth scope. Nothing an agent needs to invoke it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100% so the baseline is 3, but the description adds meaning beyond the schema: it clarifies the timeout default (30s) and that a wait timeout is not an export failure, disambiguating timeout_seconds' true effect. The audience_id mis-assumption caveat is in the schema itself, so the description needn't repeat it.

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

Purpose5/5

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

States a specific verb (block/wait) and resource (a delivery) with clear scope: until it completes or fails. The opening line plus the polling description makes it unambiguous how this differs from the sibling get_delivery, which 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 Guidelines5/5

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

Gives precise trigger conditions ('Call this immediately after deliver_audience or deliver_file_match when the response has status: processing') and names alternatives for adjacent cases (get_delivery for a fresh link, get tool to re-check after a timeout). Both when-to-use and when-to-switch are covered.

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

wait_for_segmentWait For SegmentA
Idempotent
Inspect

Poll a segment until its status is "active" or "failed". Use after create_segment(subtype=matched) once the file has been uploaded AND confirm_column_mappings has succeeded — the segment will not progress past "pending" before that (the upload is staged). Do not call this before confirm_column_mappings. Also use after create_segment(subtype=similarity/propensity) to wait for the async workflow to complete. Polls GET /v1/segments/{segment_id} every 15 seconds. On success returns the customer-facing segment details — pass segment_id in create_audience.segment_refs, then use the returned audience_id to quote_delivery and deliver_audience. Throws SEGMENT_FAILED if processing failed, or SEGMENT_TIMEOUT if it did not complete within timeout_seconds (default 30 seconds). A wait timeout does not cancel or fail the job; use the corresponding get tool to check it again. Requires 'discovery' scope.

NameRequiredDescriptionDefault
segment_idYesThe segment ID returned by create_segment
timeout_secondsNoMaximum seconds to wait (default 30). Prefer get_segment for a single status check; a wait timeout does not stop processing.

Output Schema

NameRequiredDescription
nameYes
statusYes
subtypeYes
guidanceNoInterpretation or recovery guidance for this result
count_unitNo
page_countNoNumber of objects on this page, not the organization total
segment_idYes
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
record_countNoStored count; null means unknown. Call count_segment for a current count.
record_limitNoMaximum members; null means no explicit cap
filter_groupsNoComplete saved filter definition; one AND group also represents a simple flat filter list
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
current_versionNo
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A4.8/5.0
Behavior5/5

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

Adds substantial context beyond the annotations: 15-second polling against GET /v1/segments/{segment_id}, named error modes (SEGMENT_FAILED, SEGMENT_TIMEOUT), the crucial clarification that a timeout neither cancels nor fails the job, and the 'discovery' scope requirement. The only tension is a minor one—the description frames the tool as read-only polling while readOnlyHint is false—but this is a conservative annotation rather than a genuine contradiction.

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 and terminal states, and nearly every clause is functional (preconditions, error modes, downstream routing). It is dense and somewhat overstuffed—the sequencing advice is spread across three clauses that repeat the create_segment entry point—but nothing is padding.

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?

Covers everything an agent needs to call it correctly: preconditions, poll cadence, timeout behavior, auth scope, failure modes, and what to do next with the result. With an output schema present, the description correctly omits return-field detail and instead explains how the returned handle is consumed downstream.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description earns a step up by giving segment_id downstream meaning ('pass segment_id in create_audience.segment_refs') and reinforcing timeout_seconds' non-destructive semantics. It does not add syntax detail beyond the schema, so it stops short of 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?

States a specific verb and resource ('Poll a segment until its status is "active" or "failed"') plus the exact terminal states. This distinguishes it immediately from single-shot siblings get_segment and get_workflow_status without needing schema inspection.

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 specifies preconditions ('once the file has been uploaded AND confirm_column_mappings has succeeded') and a hard prohibition ('Do not call this before confirm_column_mappings') for the matched subtype, plus a second valid entry point for similarity/propensity. It also names the alternative for the single-check case ('Prefer get_segment for a single status check').

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

wait_for_workflowWait For WorkflowA
Destructive
Inspect

Block until a similarity or propensity segment workflow completes, fails, or hits a HITL gate. Call this after create_segment(subtype=similarity/propensity) returns a workflow_run_id. Polls GET /v1/workflows/{id} every 30 seconds. Returns completed status with segment_id/audience_id when done. If hitl=true and a gate is hit, returns the gate payload so you can call respond_to_workflow_gate then wait_for_workflow again. Returns an actionable failure code and message if the workflow fails, or WORKFLOW_TIMEOUT after timeout_seconds (default 30 seconds). A wait timeout does not cancel or fail the workflow. Requires 'discovery' scope.

NameRequiredDescriptionDefault
timeout_secondsNoMaximum seconds to wait (default 30). Prefer get_workflow_status for a single status check; processing continues after a wait timeout.
workflow_run_idYesThe workflow run ID returned by create_segment(subtype=similarity/propensity)

Output Schema

NameRequiredDescription
statusYes
failureNoSafe failure reason and next action when status is failed
guidanceNoInterpretation or recovery guidance for this result
count_unitNo
page_countNoNumber of objects on this page, not the organization total
segment_idNo
step_countYes
audience_idNo
count_stateNoUnknown means no count; available does not guarantee freshness. Recount for a current value.
paused_gateNo
current_stepYes
next_actionsNoSuggested next calls using returned IDs and available scopes. Not executed and not user consent.
money_displayNoCurrency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.
workflow_run_idYes
population_inputNoPopulation input used for the preview; IDs refer to their current saved definitions

TDQS

A3.6/5.0
Behavior1/5

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

The description says this polls GET /v1/workflows/{id} and that a wait timeout does not cancel or fail the workflow, indicating a non-destructive read-only wait. The annotations declare destructiveHint=true and readOnlyHint=false, which directly conflicts with that behavior.

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

Conciseness5/5

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

The description is front-loaded with the core blocking behavior and then adds only operationally relevant details about polling, HITL handling, failure returns, timeout semantics, and required scope. Every sentence carries useful information for invoking the tool correctly.

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 asynchronous/HITL workflow tool, the description covers when to call it, polling behavior, timeout outcomes, HITL gate continuation, failure returns, and required scope. The main remaining gaps are the undefined hitl reference and the contradictory destructive annotation, though the output schema reduces the need to explain return values in prose.

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

Parameters3/5

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

Schema coverage is 100%, so the baseline is 3. The description adds some value by linking workflow_run_id to create_segment and explaining WORKFLOW_TIMEOUT behavior, but it also references hitl=true even though no hitl parameter exists in this tool's schema, creating ambiguity.

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

Purpose5/5

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

The description states a specific verb/resource and scope: it blocks until a similarity or propensity segment workflow completes, fails, or hits a HITL gate. It also distinguishes its role from a one-off status check by describing the blocking/polling behavior and the create_segment follow-up.

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

Usage Guidelines4/5

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

It clearly says to call this after create_segment returns a workflow_run_id and explains the HITL loop with respond_to_workflow_gate followed by another wait. It does not explicitly contrast the tool with get_workflow_status or wait_for_segment in the description, though the timeout parameter schema mentions get_workflow_status.

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. 60 tool updates
    • Changedanalyze_audience_upload1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "analysis": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "columns": {
        +          "items": {
        +            "additionalProperties": {},
        +            "properties": {
        +              "source_column": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "source_column"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "recommendations": {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "unmapped_columns": {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        }
        +      },
        +      "required": [
        +        "columns",
        +        "unmapped_columns",
        +        "recommendations"
        +      ],
        +      "type": "object"
        +    },
        +    "count_state": {
        +      "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.",
        +      "enum": [
        +        "unknown",
        +        "available"
        +      ],
        +      "type": "string"
        +    },
        +    "count_unit": {
        +      "const": "records",
        +      "type": "string"
        +    },
        +    "guidance": {
        +      "description": "Interpretation or recovery guidance for this result",
        +      "type": "string"
        +    },
        +    "money_display": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "next_actions": {
        +      "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "arguments": {
        +            "additionalProperties": {},
        +            "propertyNames": {
        +              "type": "string"
        +            },
        +            "type": "object"
        +          },
        +          "reason": {
        +            "type": "string"
        +          },
        +          "tool": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "tool",
        +          "arguments",
        +          "reason"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "page_count": {
        +      "description": "Number of objects on this page, not the organization total",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "population_input": {
        +      "additionalProperties": {},
        +      "description": "Population input used for the preview; IDs refer to their current saved definitions",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "segment_id": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "segment_id",
        +    "analysis"
        +  ],
        +  "type": "object"
        +}
    • Addedarchive_audience
    • Addedarchive_segment
    • Addedbuild_saved_integration_segment
    • Addedcancel_matched_upload
    • Addedcheck_balance
    • Addedcheck_topup_status
    • Addedconfirm_column_mappings
    • Changedcount_segment1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "count_state": {
        +      "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.",
        +      "enum": [
        +        "unknown",
        +        "available"
        +      ],
        +      "type": "string"
        +    },
        +    "count_unit": {
        +      "const": "records",
        +      "type": "string"
        +    },
        +    "guidance": {
        +      "description": "Interpretation or recovery guidance for this result",
        +      "type": "string"
        +    },
        +    "money_display": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "next_actions": {
        +      "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "arguments": {
        +            "additionalProperties": {},
        +            "propertyNames": {
        +              "type": "string"
        +            },
        +            "type": "object"
        +          },
        +          "reason": {
        +            "type": "string"
        +          },
        +          "tool": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "tool",
        +          "arguments",
        +          "reason"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "page_count": {
        +      "description": "Number of objects on this page, not the organization total",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "population_input": {
        +      "additionalProperties": {},
        +      "description": "Population input used for the preview; IDs refer to their current saved definitions",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "record_count": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "Fresh segment count, or null when pending or failed"
        +    },
        +    "segment_id": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "segment_id",
        +    "record_count"
        +  ],
        +  "type": "object"
        +}
    • Addedcreate_audience
    • Addedcreate_campaign
    • Addedcreate_segment
    • Addeddeliver_audience
    • Addeddeliver_file_match
    • Changeddiscovery_count21 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / criteria
        Removed value: -{
        -  "description": "Simple demographic criteria; choose this or one other population input, not both",
        -  "properties": {
        -    "age_max": {
        -      "description": "Maximum age in years",
        -      "type": "number"
        -    },
        -    "age_min": {
        -      "description": "Minimum age in years",
        -      "type": "number"
        -    },
        -    "genders": {
        -      "description": "Gender labels to include",
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    },
        -    "income_max": {
        -      "description": "Legacy input; ignored because household income is categorical. Use field-catalog filters instead.",
        -      "type": "number"
        -    },
        -    "income_min": {
        -      "description": "Legacy input; ignored because household income is categorical. Use field-catalog filters instead.",
        -      "type": "number"
        -    },
        -    "interests": {
        -      "description": "Interest labels to include",
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    },
        -    "states": {
        -      "description": "US state abbreviations to include",
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    },
        -    "zip_codes": {
        -      "description": "Five-digit ZIP codes to include",
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    }
        -  },
        -  "type": "object"
        -}
      • changedInput schema / properties / filter_groups / items / additionalProperties
        Previous value: -{}New value: +false
      • addedInput schema / properties / filter_groups / items / properties
        Added value: +{
        +  "combinator": {
        +    "description": "Join to the preceding included group; ignored for the first group. AND binds before OR. Exclusion groups always subtract.",
        +    "enum": [
        +      "AND",
        +      "OR"
        +    ],
        +    "type": "string"
        +  },
        +  "filters": {
        +    "description": "All conditions in this group must match",
        +    "items": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "field": {
        +          "description": "field_name from get_field_catalog; ZIP5 also accepts zip, zip_code or postal_code. Use published operators and enum_values",
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "op": {
        +          "enum": [
        +            "=",
        +            "!=",
        +            "<",
        +            "<=",
        +            ">",
        +            ">=",
        +            "IN",
        +            "NOT IN",
        +            "BETWEEN",
        +            "LIKE",
        +            "ARRAY_CONTAINS",
        +            "ARRAY_CONTAINS_ANY",
        +            "IS NULL",
        +            "IS NOT NULL"
        +          ],
        +          "type": "string"
        +        },
        +        "text_comparison": {
        +          "description": "STRING =, !=, IN, NOT IN, LIKE and ARRAY<STRING> ARRAY_CONTAINS, ARRAY_CONTAINS_ANY. Default exact. case_insensitive applies Unicode case folding to stored text and the supplied value; use when capitalization is incidental.",
        +          "enum": [
        +            "exact",
        +            "case_insensitive"
        +          ],
        +          "type": "string"
        +        },
        +        "trim_whitespace": {
        +          "description": "Supported STRING or ARRAY<STRING> comparisons only. Trim leading/trailing whitespace on both sides; default false.",
        +          "type": "boolean"
        +        },
        +        "value": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "number"
        +            },
        +            {
        +              "type": "boolean"
        +            },
        +            {
        +              "items": {
        +                "anyOf": [
        +                  {
        +                    "type": "string"
        +                  },
        +                  {
        +                    "type": "number"
        +                  },
        +                  {
        +                    "type": "boolean"
        +                  }
        +                ]
        +              },
        +              "type": "array"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ],
        +          "description": "Scalar for comparisons; array for IN/NOT IN; ARRAY_CONTAINS_ANY matches any listed value; [lower, upper] inclusive for BETWEEN; LIKE uses % for any sequence and _ for one character; omit for IS NULL/IS NOT NULL. Use enum_values codes, not display labels"
        +        }
        +      },
        +      "required": [
        +        "field",
        +        "op"
        +      ],
        +      "type": "object"
        +    },
        +    "minItems": 1,
        +    "type": "array"
        +  },
        +  "id": {
        +    "description": "Caller-chosen group ID, for example geography; prefix _exclude:: to subtract this group",
        +    "minLength": 1,
        +    "type": "string"
        +  }
        +}
      • removedInput schema / properties / filter_groups / items / propertyNames
        Removed value: -{
        -  "type": "string"
        -}
      • addedInput schema / properties / filter_groups / items / required
        Added value: +[
        +  "id",
        +  "combinator",
        +  "filters"
        +]
      • changedInput schema / properties / filters / items / additionalProperties
        Previous value: -{}New value: +false
      • addedInput schema / properties / filters / items / properties
        Added value: +{
        +  "field": {
        +    "description": "field_name from get_field_catalog; ZIP5 also accepts zip, zip_code or postal_code. Use published operators and enum_values",
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  "op": {
        +    "enum": [
        +      "=",
        +      "!=",
        +      "<",
        +      "<=",
        +      ">",
        +      ">=",
        +      "IN",
        +      "NOT IN",
        +      "BETWEEN",
        +      "LIKE",
        +      "ARRAY_CONTAINS",
        +      "ARRAY_CONTAINS_ANY",
        +      "IS NULL",
        +      "IS NOT NULL"
        +    ],
        +    "type": "string"
        +  },
        +  "text_comparison": {
        +    "description": "STRING =, !=, IN, NOT IN, LIKE and ARRAY<STRING> ARRAY_CONTAINS, ARRAY_CONTAINS_ANY. Default exact. case_insensitive applies Unicode case folding to stored text and the supplied value; use when capitalization is incidental.",
        +    "enum": [
        +      "exact",
        +      "case_insensitive"
        +    ],
        +    "type": "string"
        +  },
        +  "trim_whitespace": {
        +    "description": "Supported STRING or ARRAY<STRING> comparisons only. Trim leading/trailing whitespace on both sides; default false.",
        +    "type": "boolean"
        +  },
        +  "value": {
        +    "anyOf": [
        +      {
        +        "type": "string"
        +      },
        +      {
        +        "type": "number"
        +      },
        +      {
        +        "type": "boolean"
        +      },
        +      {
        +        "items": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "number"
        +            },
        +            {
        +              "type": "boolean"
        +            }
        +          ]
        +        },
        +        "type": "array"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ],
        +    "description": "Scalar for comparisons; array for IN/NOT IN; ARRAY_CONTAINS_ANY matches any listed value; [lower, upper] inclusive for BETWEEN; LIKE uses % for any sequence and _ for one character; omit for IS NULL/IS NOT NULL. Use enum_values codes, not display labels"
        +  }
        +}
      • removedInput schema / properties / filters / items / propertyNames
        Removed value: -{
        -  "type": "string"
        -}
      • addedInput schema / properties / filters / items / required
        Added value: +[
        +  "field",
        +  "op"
        +]
      • changedInput schema / properties / group_by / description
        Previous value: -"Field to group counts by; mutually exclusive with automatic breakdowns"New value: +"Field with groupable=true in get_field_catalog; mutually exclusive with automatic breakdowns"
      • removedOutput schema / properties / bytes_scanned
        Removed value: -{
        -  "description": "Measured query bytes scanned",
        -  "type": "number"
        -}
      • addedOutput schema / properties / count_state
        Added value: +{
        +  "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.",
        +  "enum": [
        +    "unknown",
        +    "available"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / count_unit
        Added value: +{
        +  "const": "records",
        +  "type": "string"
        +}
      • removedOutput schema / properties / estimated_cost_usd
        Removed value: -{
        -  "description": "Estimated query cost in US dollars",
        -  "type": "number"
        -}
      • addedOutput schema / properties / guidance
        Added value: +{
        +  "description": "Interpretation or recovery guidance for this result",
        +  "type": "string"
        +}
      • addedOutput schema / properties / money_display
        Added value: +{
        +  "additionalProperties": {
        +    "type": "string"
        +  },
        +  "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.",
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / next_actions
        Added value: +{
        +  "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "arguments": {
        +        "additionalProperties": {},
        +        "propertyNames": {
        +          "type": "string"
        +        },
        +        "type": "object"
        +      },
        +      "reason": {
        +        "type": "string"
        +      },
        +      "tool": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "tool",
        +      "arguments",
        +      "reason"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / page_count
        Added value: +{
        +  "description": "Number of objects on this page, not the organization total",
        +  "maximum": 9007199254740991,
        +  "minimum": -9007199254740991,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / population_input
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Population input used for the preview; IDs refer to their current saved definitions",
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "count",
        -  "bytes_scanned",
        -  "estimated_cost_usd"
        -]New value: +[
        +  "count"
        +]
    • Changeddiscovery_crosstab12 fields changed
      • changedInput schema / properties / col_field / description
        Previous value: -"Field name for pivot columns"New value: +"Different field with groupable=true from get_field_catalog for pivot columns"
      • changedInput schema / properties / filter_groups / items / additionalProperties
        Previous value: -{}New value: +false
      • addedInput schema / properties / filter_groups / items / properties
        Added value: +{
        +  "combinator": {
        +    "description": "Join to the preceding included group; ignored for the first group. AND binds before OR. Exclusion groups always subtract.",
        +    "enum": [
        +      "AND",
        +      "OR"
        +    ],
        +    "type": "string"
        +  },
        +  "filters": {
        +    "description": "All conditions in this group must match",
        +    "items": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "field": {
        +          "description": "field_name from get_field_catalog; ZIP5 also accepts zip, zip_code or postal_code. Use published operators and enum_values",
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "op": {
        +          "enum": [
        +            "=",
        +            "!=",
        +            "<",
        +            "<=",
        +            ">",
        +            ">=",
        +            "IN",
        +            "NOT IN",
        +            "BETWEEN",
        +            "LIKE",
        +            "ARRAY_CONTAINS",
        +            "ARRAY_CONTAINS_ANY",
        +            "IS NULL",
        +            "IS NOT NULL"
        +          ],
        +          "type": "string"
        +        },
        +        "text_comparison": {
        +          "description": "STRING =, !=, IN, NOT IN, LIKE and ARRAY<STRING> ARRAY_CONTAINS, ARRAY_CONTAINS_ANY. Default exact. case_insensitive applies Unicode case folding to stored text and the supplied value; use when capitalization is incidental.",
        +          "enum": [
        +            "exact",
        +            "case_insensitive"
        +          ],
        +          "type": "string"
        +        },
        +        "trim_whitespace": {
        +          "description": "Supported STRING or ARRAY<STRING> comparisons only. Trim leading/trailing whitespace on both sides; default false.",
        +          "type": "boolean"
        +        },
        +        "value": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "number"
        +            },
        +            {
        +              "type": "boolean"
        +            },
        +            {
        +              "items": {
        +                "anyOf": [
        +                  {
        +                    "type": "string"
        +                  },
        +                  {
        +                    "type": "number"
        +                  },
        +                  {
        +                    "type": "boolean"
        +                  }
        +                ]
        +              },
        +              "type": "array"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ],
        +          "description": "Scalar for comparisons; array for IN/NOT IN; ARRAY_CONTAINS_ANY matches any listed value; [lower, upper] inclusive for BETWEEN; LIKE uses % for any sequence and _ for one character; omit for IS NULL/IS NOT NULL. Use enum_values codes, not display labels"
        +        }
        +      },
        +      "required": [
        +        "field",
        +        "op"
        +      ],
        +      "type": "object"
        +    },
        +    "minItems": 1,
        +    "type": "array"
        +  },
        +  "id": {
        +    "description": "Caller-chosen group ID, for example geography; prefix _exclude:: to subtract this group",
        +    "minLength": 1,
        +    "type": "string"
        +  }
        +}
      • removedInput schema / properties / filter_groups / items / propertyNames
        Removed value: -{
        -  "type": "string"
        -}
      • addedInput schema / properties / filter_groups / items / required
        Added value: +[
        +  "id",
        +  "combinator",
        +  "filters"
        +]
      • changedInput schema / properties / filters / items / additionalProperties
        Previous value: -{}New value: +false
      • addedInput schema / properties / filters / items / properties
        Added value: +{
        +  "field": {
        +    "description": "field_name from get_field_catalog; ZIP5 also accepts zip, zip_code or postal_code. Use published operators and enum_values",
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  "op": {
        +    "enum": [
        +      "=",
        +      "!=",
        +      "<",
        +      "<=",
        +      ">",
        +      ">=",
        +      "IN",
        +      "NOT IN",
        +      "BETWEEN",
        +      "LIKE",
        +      "ARRAY_CONTAINS",
        +      "ARRAY_CONTAINS_ANY",
        +      "IS NULL",
        +      "IS NOT NULL"
        +    ],
        +    "type": "string"
        +  },
        +  "text_comparison": {
        +    "description": "STRING =, !=, IN, NOT IN, LIKE and ARRAY<STRING> ARRAY_CONTAINS, ARRAY_CONTAINS_ANY. Default exact. case_insensitive applies Unicode case folding to stored text and the supplied value; use when capitalization is incidental.",
        +    "enum": [
        +      "exact",
        +      "case_insensitive"
        +    ],
        +    "type": "string"
        +  },
        +  "trim_whitespace": {
        +    "description": "Supported STRING or ARRAY<STRING> comparisons only. Trim leading/trailing whitespace on both sides; default false.",
        +    "type": "boolean"
        +  },
        +  "value": {
        +    "anyOf": [
        +      {
        +        "type": "string"
        +      },
        +      {
        +        "type": "number"
        +      },
        +      {
        +        "type": "boolean"
        +      },
        +      {
        +        "items": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "number"
        +            },
        +            {
        +              "type": "boolean"
        +            }
        +          ]
        +        },
        +        "type": "array"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ],
        +    "description": "Scalar for comparisons; array for IN/NOT IN; ARRAY_CONTAINS_ANY matches any listed value; [lower, upper] inclusive for BETWEEN; LIKE uses % for any sequence and _ for one character; omit for IS NULL/IS NOT NULL. Use enum_values codes, not display labels"
        +  }
        +}
      • removedInput schema / properties / filters / items / propertyNames
        Removed value: -{
        -  "type": "string"
        -}
      • addedInput schema / properties / filters / items / required
        Added value: +[
        +  "field",
        +  "op"
        +]
      • changedInput schema / properties / max_cols / maximum
        Previous value: -50New value: +20
      • changedInput schema / properties / row_field / description
        Previous value: -"Field name for pivot rows (e.g. \"state\", \"age_band\", \"gender\")"New value: +"Field with groupable=true from get_field_catalog for pivot rows"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "cells": {
        +      "additionalProperties": {
        +        "additionalProperties": {
        +          "type": "number"
        +        },
        +        "propertyNames": {
        +          "type": "string"
        +        },
        +        "type": "object"
        +      },
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "col_field": {
        +      "type": "string"
        +    },
        +    "col_label": {
        +      "type": "string"
        +    },
        +    "columns": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "count_state": {
        +      "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.",
        +      "enum": [
        +        "unknown",
        +        "available"
        +      ],
        +      "type": "string"
        +    },
        +    "count_unit": {
        +      "const": "records",
        +      "type": "string"
        +    },
        +    "displayed_count": {
        +      "type": "number"
        +    },
        +    "guidance": {
        +      "description": "Interpretation or recovery guidance for this result",
        +      "type": "string"
        +    },
        +    "money_display": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "next_actions": {
        +      "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "arguments": {
        +            "additionalProperties": {},
        +            "propertyNames": {
        +              "type": "string"
        +            },
        +            "type": "object"
        +          },
        +          "reason": {
        +            "type": "string"
        +          },
        +          "tool": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "tool",
        +          "arguments",
        +          "reason"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "page_count": {
        +      "description": "Number of objects on this page, not the organization total",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "population_input": {
        +      "additionalProperties": {},
        +      "description": "Population input used for the preview; IDs refer to their current saved definitions",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "row_field": {
        +      "type": "string"
        +    },
        +    "row_label": {
        +      "type": "string"
        +    },
        +    "rows": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "total_count": {
        +      "type": "number"
        +    },
        +    "truncated": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "row_field",
        +    "col_field",
        +    "row_label",
        +    "col_label",
        +    "rows",
        +    "columns",
        +    "cells",
        +    "total_count",
        +    "displayed_count",
        +    "truncated"
        +  ],
        +  "type": "object"
        +}
    • Changeddiscovery_lookup23 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • removedInput schema / properties / criteria
        Removed value: -{
        -  "description": "Simple demographic criteria; choose this or one other population input, not both",
        -  "properties": {
        -    "age_max": {
        -      "description": "Maximum age in years",
        -      "type": "number"
        -    },
        -    "age_min": {
        -      "description": "Minimum age in years",
        -      "type": "number"
        -    },
        -    "genders": {
        -      "description": "Gender labels to include",
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    },
        -    "income_max": {
        -      "description": "Legacy input; ignored because household income is categorical. Use field-catalog filters instead.",
        -      "type": "number"
        -    },
        -    "income_min": {
        -      "description": "Legacy input; ignored because household income is categorical. Use field-catalog filters instead.",
        -      "type": "number"
        -    },
        -    "interests": {
        -      "description": "Interest labels to include",
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    },
        -    "states": {
        -      "description": "US state abbreviations to include",
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    },
        -    "zip_codes": {
        -      "description": "Five-digit ZIP codes to include",
        -      "items": {
        -        "type": "string"
        -      },
        -      "type": "array"
        -    }
        -  },
        -  "type": "object"
        -}
      • addedInput schema / properties / fields
        Added value: +{
        +  "description": "Non-PII audience fields to preview; defaults to a small demographic selection. Discover fields with get_field_catalog.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "maxItems": 30,
        +  "minItems": 1,
        +  "type": "array"
        +}
      • changedInput schema / properties / filter_groups / items / additionalProperties
        Previous value: -{}New value: +false
      • addedInput schema / properties / filter_groups / items / properties
        Added value: +{
        +  "combinator": {
        +    "description": "Join to the preceding included group; ignored for the first group. AND binds before OR. Exclusion groups always subtract.",
        +    "enum": [
        +      "AND",
        +      "OR"
        +    ],
        +    "type": "string"
        +  },
        +  "filters": {
        +    "description": "All conditions in this group must match",
        +    "items": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "field": {
        +          "description": "field_name from get_field_catalog; ZIP5 also accepts zip, zip_code or postal_code. Use published operators and enum_values",
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "op": {
        +          "enum": [
        +            "=",
        +            "!=",
        +            "<",
        +            "<=",
        +            ">",
        +            ">=",
        +            "IN",
        +            "NOT IN",
        +            "BETWEEN",
        +            "LIKE",
        +            "ARRAY_CONTAINS",
        +            "ARRAY_CONTAINS_ANY",
        +            "IS NULL",
        +            "IS NOT NULL"
        +          ],
        +          "type": "string"
        +        },
        +        "text_comparison": {
        +          "description": "STRING =, !=, IN, NOT IN, LIKE and ARRAY<STRING> ARRAY_CONTAINS, ARRAY_CONTAINS_ANY. Default exact. case_insensitive applies Unicode case folding to stored text and the supplied value; use when capitalization is incidental.",
        +          "enum": [
        +            "exact",
        +            "case_insensitive"
        +          ],
        +          "type": "string"
        +        },
        +        "trim_whitespace": {
        +          "description": "Supported STRING or ARRAY<STRING> comparisons only. Trim leading/trailing whitespace on both sides; default false.",
        +          "type": "boolean"
        +        },
        +        "value": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "number"
        +            },
        +            {
        +              "type": "boolean"
        +            },
        +            {
        +              "items": {
        +                "anyOf": [
        +                  {
        +                    "type": "string"
        +                  },
        +                  {
        +                    "type": "number"
        +                  },
        +                  {
        +                    "type": "boolean"
        +                  }
        +                ]
        +              },
        +              "type": "array"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ],
        +          "description": "Scalar for comparisons; array for IN/NOT IN; ARRAY_CONTAINS_ANY matches any listed value; [lower, upper] inclusive for BETWEEN; LIKE uses % for any sequence and _ for one character; omit for IS NULL/IS NOT NULL. Use enum_values codes, not display labels"
        +        }
        +      },
        +      "required": [
        +        "field",
        +        "op"
        +      ],
        +      "type": "object"
        +    },
        +    "minItems": 1,
        +    "type": "array"
        +  },
        +  "id": {
        +    "description": "Caller-chosen group ID, for example geography; prefix _exclude:: to subtract this group",
        +    "minLength": 1,
        +    "type": "string"
        +  }
        +}
      • removedInput schema / properties / filter_groups / items / propertyNames
        Removed value: -{
        -  "type": "string"
        -}
      • addedInput schema / properties / filter_groups / items / required
        Added value: +[
        +  "id",
        +  "combinator",
        +  "filters"
        +]
      • changedInput schema / properties / filters / items / additionalProperties
        Previous value: -{}New value: +false
      • addedInput schema / properties / filters / items / properties
        Added value: +{
        +  "field": {
        +    "description": "field_name from get_field_catalog; ZIP5 also accepts zip, zip_code or postal_code. Use published operators and enum_values",
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  "op": {
        +    "enum": [
        +      "=",
        +      "!=",
        +      "<",
        +      "<=",
        +      ">",
        +      ">=",
        +      "IN",
        +      "NOT IN",
        +      "BETWEEN",
        +      "LIKE",
        +      "ARRAY_CONTAINS",
        +      "ARRAY_CONTAINS_ANY",
        +      "IS NULL",
        +      "IS NOT NULL"
        +    ],
        +    "type": "string"
        +  },
        +  "text_comparison": {
        +    "description": "STRING =, !=, IN, NOT IN, LIKE and ARRAY<STRING> ARRAY_CONTAINS, ARRAY_CONTAINS_ANY. Default exact. case_insensitive applies Unicode case folding to stored text and the supplied value; use when capitalization is incidental.",
        +    "enum": [
        +      "exact",
        +      "case_insensitive"
        +    ],
        +    "type": "string"
        +  },
        +  "trim_whitespace": {
        +    "description": "Supported STRING or ARRAY<STRING> comparisons only. Trim leading/trailing whitespace on both sides; default false.",
        +    "type": "boolean"
        +  },
        +  "value": {
        +    "anyOf": [
        +      {
        +        "type": "string"
        +      },
        +      {
        +        "type": "number"
        +      },
        +      {
        +        "type": "boolean"
        +      },
        +      {
        +        "items": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "number"
        +            },
        +            {
        +              "type": "boolean"
        +            }
        +          ]
        +        },
        +        "type": "array"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ],
        +    "description": "Scalar for comparisons; array for IN/NOT IN; ARRAY_CONTAINS_ANY matches any listed value; [lower, upper] inclusive for BETWEEN; LIKE uses % for any sequence and _ for one character; omit for IS NULL/IS NOT NULL. Use enum_values codes, not display labels"
        +  }
        +}
      • removedInput schema / properties / filters / items / propertyNames
        Removed value: -{
        -  "type": "string"
        -}
      • addedInput schema / properties / filters / items / required
        Added value: +[
        +  "field",
        +  "op"
        +]
      • changedInput schema / properties / limit / type
        Previous value: -"number"New value: +"integer"
      • changedOutput schema / properties / available_fields / description
        Previous value: -"Fields available in the audience graph"New value: +"Non-PII fields selected for this sample; use get_field_catalog to discover other fields"
      • removedOutput schema / properties / bytes_scanned
        Removed value: -{
        -  "description": "Measured query bytes scanned",
        -  "type": "number"
        -}
      • addedOutput schema / properties / count_state
        Added value: +{
        +  "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.",
        +  "enum": [
        +    "unknown",
        +    "available"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / count_unit
        Added value: +{
        +  "const": "records",
        +  "type": "string"
        +}
      • removedOutput schema / properties / estimated_cost_usd
        Removed value: -{
        -  "description": "Estimated query cost in US dollars",
        -  "type": "number"
        -}
      • addedOutput schema / properties / guidance
        Added value: +{
        +  "description": "Interpretation or recovery guidance for this result",
        +  "type": "string"
        +}
      • addedOutput schema / properties / money_display
        Added value: +{
        +  "additionalProperties": {
        +    "type": "string"
        +  },
        +  "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.",
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / next_actions
        Added value: +{
        +  "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "arguments": {
        +        "additionalProperties": {},
        +        "propertyNames": {
        +          "type": "string"
        +        },
        +        "type": "object"
        +      },
        +      "reason": {
        +        "type": "string"
        +      },
        +      "tool": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "tool",
        +      "arguments",
        +      "reason"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / page_count
        Added value: +{
        +  "description": "Number of objects on this page, not the organization total",
        +  "maximum": 9007199254740991,
        +  "minimum": -9007199254740991,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / population_input
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Population input used for the preview; IDs refer to their current saved definitions",
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "rows",
        -  "total_matched",
        -  "bytes_scanned",
        -  "estimated_cost_usd",
        -  "available_fields"
        -]New value: +[
        +  "rows",
        +  "total_matched",
        +  "available_fields"
        +]
    • Changeddiscovery_overlap17 fields changed
      • changedInput schema / properties / a / properties / filter_groups / items / additionalProperties
        Previous value: -{}New value: +false
      • addedInput schema / properties / a / properties / filter_groups / items / properties
        Added value: +{
        +  "combinator": {
        +    "description": "Join to the preceding included group; ignored for the first group. AND binds before OR. Exclusion groups always subtract.",
        +    "enum": [
        +      "AND",
        +      "OR"
        +    ],
        +    "type": "string"
        +  },
        +  "filters": {
        +    "description": "All conditions in this group must match",
        +    "items": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "field": {
        +          "description": "field_name from get_field_catalog; ZIP5 also accepts zip, zip_code or postal_code. Use published operators and enum_values",
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "op": {
        +          "enum": [
        +            "=",
        +            "!=",
        +            "<",
        +            "<=",
        +            ">",
        +            ">=",
        +            "IN",
        +            "NOT IN",
        +            "BETWEEN",
        +            "LIKE",
        +            "ARRAY_CONTAINS",
        +            "ARRAY_CONTAINS_ANY",
        +            "IS NULL",
        +            "IS NOT NULL"
        +          ],
        +          "type": "string"
        +        },
        +        "text_comparison": {
        +          "description": "STRING =, !=, IN, NOT IN, LIKE and ARRAY<STRING> ARRAY_CONTAINS, ARRAY_CONTAINS_ANY. Default exact. case_insensitive applies Unicode case folding to stored text and the supplied value; use when capitalization is incidental.",
        +          "enum": [
        +            "exact",
        +            "case_insensitive"
        +          ],
        +          "type": "string"
        +        },
        +        "trim_whitespace": {
        +          "description": "Supported STRING or ARRAY<STRING> comparisons only. Trim leading/trailing whitespace on both sides; default false.",
        +          "type": "boolean"
        +        },
        +        "value": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "number"
        +            },
        +            {
        +              "type": "boolean"
        +            },
        +            {
        +              "items": {
        +                "anyOf": [
        +                  {
        +                    "type": "string"
        +                  },
        +                  {
        +                    "type": "number"
        +                  },
        +                  {
        +                    "type": "boolean"
        +                  }
        +                ]
        +              },
        +              "type": "array"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ],
        +          "description": "Scalar for comparisons; array for IN/NOT IN; ARRAY_CONTAINS_ANY matches any listed value; [lower, upper] inclusive for BETWEEN; LIKE uses % for any sequence and _ for one character; omit for IS NULL/IS NOT NULL. Use enum_values codes, not display labels"
        +        }
        +      },
        +      "required": [
        +        "field",
        +        "op"
        +      ],
        +      "type": "object"
        +    },
        +    "minItems": 1,
        +    "type": "array"
        +  },
        +  "id": {
        +    "description": "Caller-chosen group ID, for example geography; prefix _exclude:: to subtract this group",
        +    "minLength": 1,
        +    "type": "string"
        +  }
        +}
      • removedInput schema / properties / a / properties / filter_groups / items / propertyNames
        Removed value: -{
        -  "type": "string"
        -}
      • addedInput schema / properties / a / properties / filter_groups / items / required
        Added value: +[
        +  "id",
        +  "combinator",
        +  "filters"
        +]
      • changedInput schema / properties / a / properties / filters / items / additionalProperties
        Previous value: -{}New value: +false
      • addedInput schema / properties / a / properties / filters / items / properties
        Added value: +{
        +  "field": {
        +    "description": "field_name from get_field_catalog; ZIP5 also accepts zip, zip_code or postal_code. Use published operators and enum_values",
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  "op": {
        +    "enum": [
        +      "=",
        +      "!=",
        +      "<",
        +      "<=",
        +      ">",
        +      ">=",
        +      "IN",
        +      "NOT IN",
        +      "BETWEEN",
        +      "LIKE",
        +      "ARRAY_CONTAINS",
        +      "ARRAY_CONTAINS_ANY",
        +      "IS NULL",
        +      "IS NOT NULL"
        +    ],
        +    "type": "string"
        +  },
        +  "text_comparison": {
        +    "description": "STRING =, !=, IN, NOT IN, LIKE and ARRAY<STRING> ARRAY_CONTAINS, ARRAY_CONTAINS_ANY. Default exact. case_insensitive applies Unicode case folding to stored text and the supplied value; use when capitalization is incidental.",
        +    "enum": [
        +      "exact",
        +      "case_insensitive"
        +    ],
        +    "type": "string"
        +  },
        +  "trim_whitespace": {
        +    "description": "Supported STRING or ARRAY<STRING> comparisons only. Trim leading/trailing whitespace on both sides; default false.",
        +    "type": "boolean"
        +  },
        +  "value": {
        +    "anyOf": [
        +      {
        +        "type": "string"
        +      },
        +      {
        +        "type": "number"
        +      },
        +      {
        +        "type": "boolean"
        +      },
        +      {
        +        "items": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "number"
        +            },
        +            {
        +              "type": "boolean"
        +            }
        +          ]
        +        },
        +        "type": "array"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ],
        +    "description": "Scalar for comparisons; array for IN/NOT IN; ARRAY_CONTAINS_ANY matches any listed value; [lower, upper] inclusive for BETWEEN; LIKE uses % for any sequence and _ for one character; omit for IS NULL/IS NOT NULL. Use enum_values codes, not display labels"
        +  }
        +}
      • removedInput schema / properties / a / properties / filters / items / propertyNames
        Removed value: -{
        -  "type": "string"
        -}
      • addedInput schema / properties / a / properties / filters / items / required
        Added value: +[
        +  "field",
        +  "op"
        +]
      • changedInput schema / properties / b / properties / filter_groups / items / additionalProperties
        Previous value: -{}New value: +false
      • addedInput schema / properties / b / properties / filter_groups / items / properties
        Added value: +{
        +  "combinator": {
        +    "description": "Join to the preceding included group; ignored for the first group. AND binds before OR. Exclusion groups always subtract.",
        +    "enum": [
        +      "AND",
        +      "OR"
        +    ],
        +    "type": "string"
        +  },
        +  "filters": {
        +    "description": "All conditions in this group must match",
        +    "items": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "field": {
        +          "description": "field_name from get_field_catalog; ZIP5 also accepts zip, zip_code or postal_code. Use published operators and enum_values",
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "op": {
        +          "enum": [
        +            "=",
        +            "!=",
        +            "<",
        +            "<=",
        +            ">",
        +            ">=",
        +            "IN",
        +            "NOT IN",
        +            "BETWEEN",
        +            "LIKE",
        +            "ARRAY_CONTAINS",
        +            "ARRAY_CONTAINS_ANY",
        +            "IS NULL",
        +            "IS NOT NULL"
        +          ],
        +          "type": "string"
        +        },
        +        "text_comparison": {
        +          "description": "STRING =, !=, IN, NOT IN, LIKE and ARRAY<STRING> ARRAY_CONTAINS, ARRAY_CONTAINS_ANY. Default exact. case_insensitive applies Unicode case folding to stored text and the supplied value; use when capitalization is incidental.",
        +          "enum": [
        +            "exact",
        +            "case_insensitive"
        +          ],
        +          "type": "string"
        +        },
        +        "trim_whitespace": {
        +          "description": "Supported STRING or ARRAY<STRING> comparisons only. Trim leading/trailing whitespace on both sides; default false.",
        +          "type": "boolean"
        +        },
        +        "value": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "number"
        +            },
        +            {
        +              "type": "boolean"
        +            },
        +            {
        +              "items": {
        +                "anyOf": [
        +                  {
        +                    "type": "string"
        +                  },
        +                  {
        +                    "type": "number"
        +                  },
        +                  {
        +                    "type": "boolean"
        +                  }
        +                ]
        +              },
        +              "type": "array"
        +            },
        +            {
        +              "type": "null"
        +            }
        +          ],
        +          "description": "Scalar for comparisons; array for IN/NOT IN; ARRAY_CONTAINS_ANY matches any listed value; [lower, upper] inclusive for BETWEEN; LIKE uses % for any sequence and _ for one character; omit for IS NULL/IS NOT NULL. Use enum_values codes, not display labels"
        +        }
        +      },
        +      "required": [
        +        "field",
        +        "op"
        +      ],
        +      "type": "object"
        +    },
        +    "minItems": 1,
        +    "type": "array"
        +  },
        +  "id": {
        +    "description": "Caller-chosen group ID, for example geography; prefix _exclude:: to subtract this group",
        +    "minLength": 1,
        +    "type": "string"
        +  }
        +}
      • removedInput schema / properties / b / properties / filter_groups / items / propertyNames
        Removed value: -{
        -  "type": "string"
        -}
      • addedInput schema / properties / b / properties / filter_groups / items / required
        Added value: +[
        +  "id",
        +  "combinator",
        +  "filters"
        +]
      • changedInput schema / properties / b / properties / filters / items / additionalProperties
        Previous value: -{}New value: +false
      • addedInput schema / properties / b / properties / filters / items / properties
        Added value: +{
        +  "field": {
        +    "description": "field_name from get_field_catalog; ZIP5 also accepts zip, zip_code or postal_code. Use published operators and enum_values",
        +    "minLength": 1,
        +    "type": "string"
        +  },
        +  "op": {
        +    "enum": [
        +      "=",
        +      "!=",
        +      "<",
        +      "<=",
        +      ">",
        +      ">=",
        +      "IN",
        +      "NOT IN",
        +      "BETWEEN",
        +      "LIKE",
        +      "ARRAY_CONTAINS",
        +      "ARRAY_CONTAINS_ANY",
        +      "IS NULL",
        +      "IS NOT NULL"
        +    ],
        +    "type": "string"
        +  },
        +  "text_comparison": {
        +    "description": "STRING =, !=, IN, NOT IN, LIKE and ARRAY<STRING> ARRAY_CONTAINS, ARRAY_CONTAINS_ANY. Default exact. case_insensitive applies Unicode case folding to stored text and the supplied value; use when capitalization is incidental.",
        +    "enum": [
        +      "exact",
        +      "case_insensitive"
        +    ],
        +    "type": "string"
        +  },
        +  "trim_whitespace": {
        +    "description": "Supported STRING or ARRAY<STRING> comparisons only. Trim leading/trailing whitespace on both sides; default false.",
        +    "type": "boolean"
        +  },
        +  "value": {
        +    "anyOf": [
        +      {
        +        "type": "string"
        +      },
        +      {
        +        "type": "number"
        +      },
        +      {
        +        "type": "boolean"
        +      },
        +      {
        +        "items": {
        +          "anyOf": [
        +            {
        +              "type": "string"
        +            },
        +            {
        +              "type": "number"
        +            },
        +            {
        +              "type": "boolean"
        +            }
        +          ]
        +        },
        +        "type": "array"
        +      },
        +      {
        +        "type": "null"
        +      }
        +    ],
        +    "description": "Scalar for comparisons; array for IN/NOT IN; ARRAY_CONTAINS_ANY matches any listed value; [lower, upper] inclusive for BETWEEN; LIKE uses % for any sequence and _ for one character; omit for IS NULL/IS NOT NULL. Use enum_values codes, not display labels"
        +  }
        +}
      • removedInput schema / properties / b / properties / filters / items / propertyNames
        Removed value: -{
        -  "type": "string"
        -}
      • addedInput schema / properties / b / properties / filters / items / required
        Added value: +[
        +  "field",
        +  "op"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "a_count": {
        +      "type": "number"
        +    },
        +    "a_name": {
        +      "type": "string"
        +    },
        +    "b_count": {
        +      "type": "number"
        +    },
        +    "b_name": {
        +      "type": "string"
        +    },
        +    "count_state": {
        +      "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.",
        +      "enum": [
        +        "unknown",
        +        "available"
        +      ],
        +      "type": "string"
        +    },
        +    "count_unit": {
        +      "const": "records",
        +      "type": "string"
        +    },
        +    "demographic_deltas": {
        +      "items": {
        +        "additionalProperties": {},
        +        "propertyNames": {
        +          "type": "string"
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "guidance": {
        +      "description": "Interpretation or recovery guidance for this result",
        +      "type": "string"
        +    },
        +    "money_display": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "next_actions": {
        +      "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "arguments": {
        +            "additionalProperties": {},
        +            "propertyNames": {
        +              "type": "string"
        +            },
        +            "type": "object"
        +          },
        +          "reason": {
        +            "type": "string"
        +          },
        +          "tool": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "tool",
        +          "arguments",
        +          "reason"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "overlap_count": {
        +      "type": "number"
        +    },
        +    "overlap_pct": {
        +      "type": "number"
        +    },
        +    "page_count": {
        +      "description": "Number of objects on this page, not the organization total",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "population_input": {
        +      "additionalProperties": {},
        +      "description": "Population input used for the preview; IDs refer to their current saved definitions",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "warnings": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "a_name",
        +    "b_name",
        +    "a_count",
        +    "b_count",
        +    "overlap_count",
        +    "overlap_pct",
        +    "demographic_deltas"
        +  ],
        +  "type": "object"
        +}
    • Addedduplicate_audience
    • Addedduplicate_segment
    • Addedget_account_usage
    • Changedget_audience11 fields changed
      • changedInput schema / properties / audience_id / description
        Previous value: -"The audience ID (from builder context, list_audiences, or direct reference)"New value: +"The audience ID returned by list_audiences or create_audience"
      • addedOutput schema / properties / campaign_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / count_state
        Added value: +{
        +  "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.",
        +  "enum": [
        +    "unknown",
        +    "available"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / count_unit
        Added value: +{
        +  "const": "records",
        +  "type": "string"
        +}
      • addedOutput schema / properties / guidance
        Added value: +{
        +  "description": "Interpretation or recovery guidance for this result",
        +  "type": "string"
        +}
      • addedOutput schema / properties / money_display
        Added value: +{
        +  "additionalProperties": {
        +    "type": "string"
        +  },
        +  "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.",
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / next_actions
        Added value: +{
        +  "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "arguments": {
        +        "additionalProperties": {},
        +        "propertyNames": {
        +          "type": "string"
        +        },
        +        "type": "object"
        +      },
        +      "reason": {
        +        "type": "string"
        +      },
        +      "tool": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "tool",
        +      "arguments",
        +      "reason"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / page_count
        Added value: +{
        +  "description": "Number of objects on this page, not the organization total",
        +  "maximum": 9007199254740991,
        +  "minimum": -9007199254740991,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / population_input
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Population input used for the preview; IDs refer to their current saved definitions",
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / record_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Saved composition count; null is unknown. Use recount_audience for a current value."
        +}
      • addedOutput schema / properties / set_logic
        Added value: +{
        +  "description": "How included segments combine; excluded segments always subtract",
        +  "enum": [
        +    "union",
        +    "intersection"
        +  ],
        +  "type": "string"
        +}
    • Changedget_audience_demographics1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "age_breakdown": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "label": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "label"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "audience_id": {
        +      "type": "string"
        +    },
        +    "audience_name": {
        +      "type": "string"
        +    },
        +    "breakdown_extra": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "label": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "label"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "count_state": {
        +      "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.",
        +      "enum": [
        +        "unknown",
        +        "available"
        +      ],
        +      "type": "string"
        +    },
        +    "count_unit": {
        +      "const": "records",
        +      "type": "string"
        +    },
        +    "extra_field": {
        +      "type": "string"
        +    },
        +    "generated_at": {
        +      "description": "ISO timestamp of the demographic snapshot",
        +      "type": "string"
        +    },
        +    "geo_breakdown": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "label": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "label"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "guidance": {
        +      "description": "Interpretation or recovery guidance for this result",
        +      "type": "string"
        +    },
        +    "money_display": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "next_actions": {
        +      "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "arguments": {
        +            "additionalProperties": {},
        +            "propertyNames": {
        +              "type": "string"
        +            },
        +            "type": "object"
        +          },
        +          "reason": {
        +            "type": "string"
        +          },
        +          "tool": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "tool",
        +          "arguments",
        +          "reason"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "page_count": {
        +      "description": "Number of objects on this page, not the organization total",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "population_input": {
        +      "additionalProperties": {},
        +      "description": "Population input used for the preview; IDs refer to their current saved definitions",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "total_count": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "total_count",
        +    "age_breakdown",
        +    "geo_breakdown",
        +    "generated_at",
        +    "audience_id",
        +    "audience_name"
        +  ],
        +  "type": "object"
        +}
    • Changedget_campaign7 fields changed
      • addedOutput schema / properties / count_state
        Added value: +{
        +  "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.",
        +  "enum": [
        +    "unknown",
        +    "available"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / count_unit
        Added value: +{
        +  "const": "records",
        +  "type": "string"
        +}
      • addedOutput schema / properties / guidance
        Added value: +{
        +  "description": "Interpretation or recovery guidance for this result",
        +  "type": "string"
        +}
      • addedOutput schema / properties / money_display
        Added value: +{
        +  "additionalProperties": {
        +    "type": "string"
        +  },
        +  "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.",
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / next_actions
        Added value: +{
        +  "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "arguments": {
        +        "additionalProperties": {},
        +        "propertyNames": {
        +          "type": "string"
        +        },
        +        "type": "object"
        +      },
        +      "reason": {
        +        "type": "string"
        +      },
        +      "tool": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "tool",
        +      "arguments",
        +      "reason"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / page_count
        Added value: +{
        +  "description": "Number of objects on this page, not the organization total",
        +  "maximum": 9007199254740991,
        +  "minimum": -9007199254740991,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / population_input
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Population input used for the preview; IDs refer to their current saved definitions",
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
    • Changedget_data_release7 fields changed
      • addedOutput schema / properties / count_state
        Added value: +{
        +  "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.",
        +  "enum": [
        +    "unknown",
        +    "available"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / count_unit
        Added value: +{
        +  "const": "records",
        +  "type": "string"
        +}
      • addedOutput schema / properties / guidance
        Added value: +{
        +  "description": "Interpretation or recovery guidance for this result",
        +  "type": "string"
        +}
      • addedOutput schema / properties / money_display
        Added value: +{
        +  "additionalProperties": {
        +    "type": "string"
        +  },
        +  "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.",
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / next_actions
        Added value: +{
        +  "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "arguments": {
        +        "additionalProperties": {},
        +        "propertyNames": {
        +          "type": "string"
        +        },
        +        "type": "object"
        +      },
        +      "reason": {
        +        "type": "string"
        +      },
        +      "tool": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "tool",
        +      "arguments",
        +      "reason"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / page_count
        Added value: +{
        +  "description": "Number of objects on this page, not the organization total",
        +  "maximum": 9007199254740991,
        +  "minimum": -9007199254740991,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / population_input
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Population input used for the preview; IDs refer to their current saved definitions",
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
    • Changedget_delivery1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "count_state": {
        +      "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.",
        +      "enum": [
        +        "unknown",
        +        "available"
        +      ],
        +      "type": "string"
        +    },
        +    "count_unit": {
        +      "const": "records",
        +      "type": "string"
        +    },
        +    "download_urls": {
        +      "description": "Fresh signed artifact URLs on an individual completed download delivery",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "guidance": {
        +      "description": "Interpretation or recovery guidance for this result",
        +      "type": "string"
        +    },
        +    "money_display": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "next_actions": {
        +      "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "arguments": {
        +            "additionalProperties": {},
        +            "propertyNames": {
        +              "type": "string"
        +            },
        +            "type": "object"
        +          },
        +          "reason": {
        +            "type": "string"
        +          },
        +          "tool": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "tool",
        +          "arguments",
        +          "reason"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "page_count": {
        +      "description": "Number of objects on this page, not the organization total",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "population_input": {
        +      "additionalProperties": {},
        +      "description": "Population input used for the preview; IDs refer to their current saved definitions",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "status": {
        +      "description": "Current delivery state",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status"
        +  ],
        +  "type": "object"
        +}
    • Changedget_field_catalog43 fields changed
      • addedInput schema / properties / cursor
        Added value: +{
        +  "description": "next_cursor returned by the previous page",
        +  "type": "string"
        +}
      • addedInput schema / properties / field_name
        Added value: +{
        +  "description": "Retrieve one exact field, including a page of its coded values",
        +  "type": "string"
        +}
      • addedInput schema / properties / include_pricing
        Added value: +{
        +  "default": false,
        +  "description": "Include account-specific pricing; requires configured billing",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 20,
        +  "description": "Maximum fields per page; response size may shorten the page",
        +  "maximum": 100,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / product_usage
        Added value: +{
        +  "description": "Filter by supported product usage",
        +  "enum": [
        +    "audience",
        +    "feature_store"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / purpose
        Added value: +{
        +  "default": "filter",
        +  "description": "Default filter: show fields usable for population filters. Use enrichment for all selectable output fields. Explicit product_usage, template_id or field_name overrides this default.",
        +  "enum": [
        +    "filter",
        +    "enrichment"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / search
        Added value: +{
        +  "description": "Case-insensitive search across field names, accepted aliases, labels and descriptions",
        +  "type": "string"
        +}
      • addedInput schema / properties / template_id
        Added value: +{
        +  "description": "Show fields in this delivery template",
        +  "enum": [
        +    "standard_iag",
        +    "standard_enrichment"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / value_cursor
        Added value: +{
        +  "description": "values_next_cursor from a field; requires field_name",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / value_limit
        Added value: +{
        +  "description": "Maximum enum values per field; defaults to 100 for one field or 25 in a list",
        +  "maximum": 100,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / count_state
        Added value: +{
        +  "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.",
        +  "enum": [
        +    "unknown",
        +    "available"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / count_unit
        Added value: +{
        +  "const": "records",
        +  "type": "string"
        +}
      • addedOutput schema / properties / fields / items / properties / coverage_basis
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / fields / items / properties / coverage_rate
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / fields / items / properties / data_type
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / fields / items / properties / default_text_comparison
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "exact"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Exact by default for supported text comparisons; null otherwise"
        +}
      • addedOutput schema / properties / fields / items / properties / description
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / fields / items / properties / enum_values
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Exact request values, not display labels"
        +}
      • addedOutput schema / properties / fields / items / properties / filterable
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / fields / items / properties / groupable
        Added value: +{
        +  "description": "May be used as a group_by/crosstab dimension",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / fields / items / properties / label
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / fields / items / properties / operators
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / fields / items / properties / text_comparison_modes
        Added value: +{
        +  "description": "Supported comparison modes for text filter values; empty for non-text fields",
        +  "items": {
        +    "enum": [
        +      "exact",
        +      "case_insensitive"
        +    ],
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / fields / items / properties / trim_whitespace_supported
        Added value: +{
        +  "description": "Whether filter values can request trimming of outer whitespace",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / fields / items / properties / value_labels
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / fields / items / properties / values_next_cursor
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • changedOutput schema / properties / fields / items / required
        Previous value: -[
        -  "field_name",
        -  "product_usage"
        -]New value: +[
        +  "field_name",
        +  "product_usage",
        +  "text_comparison_modes",
        +  "default_text_comparison",
        +  "trim_whitespace_supported"
        +]
      • addedOutput schema / properties / guidance
        Added value: +{
        +  "description": "Interpretation or recovery guidance for this result",
        +  "type": "string"
        +}
      • addedOutput schema / properties / money_display
        Added value: +{
        +  "additionalProperties": {
        +    "type": "string"
        +  },
        +  "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.",
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / next_actions
        Added value: +{
        +  "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "arguments": {
        +        "additionalProperties": {},
        +        "propertyNames": {
        +          "type": "string"
        +        },
        +        "type": "object"
        +      },
        +      "reason": {
        +        "type": "string"
        +      },
        +      "tool": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "tool",
        +      "arguments",
        +      "reason"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / next_cursor
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / page_count
        Added value: +{
        +  "description": "Number of objects on this page, not the organization total",
        +  "maximum": 9007199254740991,
        +  "minimum": -9007199254740991,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / population_input
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Population input used for the preview; IDs refer to their current saved definitions",
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
      • removedOutput schema / properties / pricing / additionalProperties
        Removed value: -{}
      • addedOutput schema / properties / pricing / anyOf
        Added value: +[
        +  {
        +    "additionalProperties": {},
        +    "propertyNames": {
        +      "type": "string"
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / properties / pricing / description
        Previous value: -"Organization-specific prices"New value: +"Organization prices when include_pricing=true; otherwise null"
      • removedOutput schema / properties / pricing / propertyNames
        Removed value: -{
        -  "type": "string"
        -}
      • removedOutput schema / properties / pricing / type
        Removed value: -"object"
      • changedOutput schema / properties / templates / description
        Previous value: -"Available field templates"New value: +"Templates; request template_id to page their fields"
      • addedOutput schema / properties / templates / items / properties / field_count
        Added value: +{
        +  "type": "number"
        +}
      • changedOutput schema / properties / templates / items / required
        Previous value: -[
        -  "template_id",
        -  "fields"
        -]New value: +[
        +  "template_id"
        +]
      • addedOutput schema / properties / total
        Added value: +{
        +  "type": "number"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "fields",
        -  "templates",
        -  "pricing"
        -]New value: +[
        +  "fields",
        +  "templates",
        +  "total",
        +  "next_cursor",
        +  "pricing"
        +]
    • Changedget_file_match_job1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "count_state": {
        +      "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.",
        +      "enum": [
        +        "unknown",
        +        "available"
        +      ],
        +      "type": "string"
        +    },
        +    "count_unit": {
        +      "const": "records",
        +      "type": "string"
        +    },
        +    "guidance": {
        +      "description": "Interpretation or recovery guidance for this result",
        +      "type": "string"
        +    },
        +    "match_id": {
        +      "type": "string"
        +    },
        +    "money_display": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "next_actions": {
        +      "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "arguments": {
        +            "additionalProperties": {},
        +            "propertyNames": {
        +              "type": "string"
        +            },
        +            "type": "object"
        +          },
        +          "reason": {
        +            "type": "string"
        +          },
        +          "tool": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "tool",
        +          "arguments",
        +          "reason"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "page_count": {
        +      "description": "Number of objects on this page, not the organization total",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "population_input": {
        +      "additionalProperties": {},
        +      "description": "Population input used for the preview; IDs refer to their current saved definitions",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "status": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "match_id",
        +    "status"
        +  ],
        +  "type": "object"
        +}
    • Changedget_integration_run1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "connection_id": {
        +      "type": "string"
        +    },
        +    "count_state": {
        +      "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.",
        +      "enum": [
        +        "unknown",
        +        "available"
        +      ],
        +      "type": "string"
        +    },
        +    "count_unit": {
        +      "const": "records",
        +      "type": "string"
        +    },
        +    "counts": {
        +      "additionalProperties": {
        +        "type": "number"
        +      },
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "created_at": {
        +      "type": "string"
        +    },
        +    "guidance": {
        +      "description": "Interpretation or recovery guidance for this result",
        +      "type": "string"
        +    },
        +    "kind": {
        +      "type": "string"
        +    },
        +    "money_display": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "next_actions": {
        +      "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "arguments": {
        +            "additionalProperties": {},
        +            "propertyNames": {
        +              "type": "string"
        +            },
        +            "type": "object"
        +          },
        +          "reason": {
        +            "type": "string"
        +          },
        +          "tool": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "tool",
        +          "arguments",
        +          "reason"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "page_count": {
        +      "description": "Number of objects on this page, not the organization total",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "population_input": {
        +      "additionalProperties": {},
        +      "description": "Population input used for the preview; IDs refer to their current saved definitions",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "provider": {
        +      "type": "string"
        +    },
        +    "run_id": {
        +      "type": "string"
        +    },
        +    "status": {
        +      "type": "string"
        +    },
        +    "updated_at": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "run_id",
        +    "provider",
        +    "connection_id",
        +    "kind",
        +    "status",
        +    "counts",
        +    "created_at",
        +    "updated_at"
        +  ],
        +  "type": "object"
        +}
    • Changedget_match_run1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "count_state": {
        +      "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.",
        +      "enum": [
        +        "unknown",
        +        "available"
        +      ],
        +      "type": "string"
        +    },
        +    "count_unit": {
        +      "const": "records",
        +      "type": "string"
        +    },
        +    "guidance": {
        +      "description": "Interpretation or recovery guidance for this result",
        +      "type": "string"
        +    },
        +    "input_record_count": {
        +      "type": "number"
        +    },
        +    "match_count": {
        +      "type": "number"
        +    },
        +    "money_display": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "next_actions": {
        +      "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "arguments": {
        +            "additionalProperties": {},
        +            "propertyNames": {
        +              "type": "string"
        +            },
        +            "type": "object"
        +          },
        +          "reason": {
        +            "type": "string"
        +          },
        +          "tool": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "tool",
        +          "arguments",
        +          "reason"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "page_count": {
        +      "description": "Number of objects on this page, not the organization total",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "population_input": {
        +      "additionalProperties": {},
        +      "description": "Population input used for the preview; IDs refer to their current saved definitions",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "run_id": {
        +      "type": "string"
        +    },
        +    "status": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "run_id",
        +    "status",
        +    "input_record_count",
        +    "match_count"
        +  ],
        +  "type": "object"
        +}
    • Changedget_saved_integration_segment_build1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "collection_id": {
        +      "type": "string"
        +    },
        +    "count_state": {
        +      "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.",
        +      "enum": [
        +        "unknown",
        +        "available"
        +      ],
        +      "type": "string"
        +    },
        +    "count_unit": {
        +      "const": "records",
        +      "type": "string"
        +    },
        +    "failure_code": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "failure_message": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "guidance": {
        +      "description": "Interpretation or recovery guidance for this result",
        +      "type": "string"
        +    },
        +    "identity_count": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "materialization_id": {
        +      "type": "string"
        +    },
        +    "mode": {
        +      "enum": [
        +        "new_segment",
        +        "add_to_segment"
        +      ],
        +      "type": "string"
        +    },
        +    "money_display": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "next_actions": {
        +      "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "arguments": {
        +            "additionalProperties": {},
        +            "propertyNames": {
        +              "type": "string"
        +            },
        +            "type": "object"
        +          },
        +          "reason": {
        +            "type": "string"
        +          },
        +          "tool": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "tool",
        +          "arguments",
        +          "reason"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "page_count": {
        +      "description": "Number of objects on this page, not the organization total",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "population_input": {
        +      "additionalProperties": {},
        +      "description": "Population input used for the preview; IDs refer to their current saved definitions",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "preview": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": {},
        +          "properties": {
        +            "already_present": {
        +              "type": "number"
        +            },
        +            "duplicate_observations": {
        +              "type": "number"
        +            },
        +            "expired_identities": {
        +              "type": "number"
        +            },
        +            "net_additions": {
        +              "type": "number"
        +            },
        +            "source_observations": {
        +              "type": "number"
        +            },
        +            "suppressed_identities": {
        +              "type": "number"
        +            },
        +            "unique_identities": {
        +              "type": "number"
        +            }
        +          },
        +          "required": [
        +            "source_observations",
        +            "unique_identities",
        +            "duplicate_observations",
        +            "expired_identities",
        +            "suppressed_identities",
        +            "already_present",
        +            "net_additions"
        +          ],
        +          "type": "object"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "status": {
        +      "enum": [
        +        "created",
        +        "processing",
        +        "completed",
        +        "failed"
        +      ],
        +      "type": "string"
        +    },
        +    "target_segment_id": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "materialization_id",
        +    "collection_id",
        +    "mode",
        +    "status",
        +    "target_segment_id",
        +    "preview",
        +    "identity_count",
        +    "failure_code",
        +    "failure_message"
        +  ],
        +  "type": "object"
        +}
    • Changedget_segment11 fields changed
      • addedOutput schema / properties / count_state
        Added value: +{
        +  "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.",
        +  "enum": [
        +    "unknown",
        +    "available"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / count_unit
        Added value: +{
        +  "const": "records",
        +  "type": "string"
        +}
      • addedOutput schema / properties / current_version
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / filter_groups
        Added value: +{
        +  "description": "Complete saved filter definition; one AND group also represents a simple flat filter list",
        +  "items": {
        +    "additionalProperties": {},
        +    "properties": {
        +      "combinator": {
        +        "description": "Join to the preceding included group; ignored for the first group. AND binds before OR. Exclusion groups always subtract.",
        +        "enum": [
        +          "AND",
        +          "OR"
        +        ],
        +        "type": "string"
        +      },
        +      "filters": {
        +        "items": {
        +          "additionalProperties": {},
        +          "properties": {
        +            "field": {
        +              "description": "field_name from get_field_catalog; ZIP5 also accepts zip, zip_code or postal_code. Use published operators and enum_values",
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "op": {
        +              "enum": [
        +                "=",
        +                "!=",
        +                "<",
        +                "<=",
        +                ">",
        +                ">=",
        +                "IN",
        +                "NOT IN",
        +                "BETWEEN",
        +                "LIKE",
        +                "ARRAY_CONTAINS",
        +                "ARRAY_CONTAINS_ANY",
        +                "IS NULL",
        +                "IS NOT NULL"
        +              ],
        +              "type": "string"
        +            },
        +            "text_comparison": {
        +              "description": "STRING =, !=, IN, NOT IN, LIKE and ARRAY<STRING> ARRAY_CONTAINS, ARRAY_CONTAINS_ANY. Default exact. case_insensitive applies Unicode case folding to stored text and the supplied value; use when capitalization is incidental.",
        +              "enum": [
        +                "exact",
        +                "case_insensitive"
        +              ],
        +              "type": "string"
        +            },
        +            "trim_whitespace": {
        +              "description": "Supported STRING or ARRAY<STRING> comparisons only. Trim leading/trailing whitespace on both sides; default false.",
        +              "type": "boolean"
        +            },
        +            "value": {
        +              "anyOf": [
        +                {
        +                  "type": "string"
        +                },
        +                {
        +                  "type": "number"
        +                },
        +                {
        +                  "type": "boolean"
        +                },
        +                {
        +                  "items": {
        +                    "anyOf": [
        +                      {
        +                        "type": "string"
        +                      },
        +                      {
        +                        "type": "number"
        +                      },
        +                      {
        +                        "type": "boolean"
        +                      }
        +                    ]
        +                  },
        +                  "type": "array"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ],
        +              "description": "Scalar for comparisons; array for IN/NOT IN; ARRAY_CONTAINS_ANY matches any listed value; [lower, upper] inclusive for BETWEEN; LIKE uses % for any sequence and _ for one character; omit for IS NULL/IS NOT NULL. Use enum_values codes, not display labels"
        +            }
        +          },
        +          "required": [
        +            "field",
        +            "op"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "id": {
        +        "description": "Caller-chosen group ID, for example geography; prefix _exclude:: to subtract this group",
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "combinator",
        +      "filters"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / guidance
        Added value: +{
        +  "description": "Interpretation or recovery guidance for this result",
        +  "type": "string"
        +}
      • addedOutput schema / properties / money_display
        Added value: +{
        +  "additionalProperties": {
        +    "type": "string"
        +  },
        +  "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.",
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / next_actions
        Added value: +{
        +  "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "arguments": {
        +        "additionalProperties": {},
        +        "propertyNames": {
        +          "type": "string"
        +        },
        +        "type": "object"
        +      },
        +      "reason": {
        +        "type": "string"
        +      },
        +      "tool": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "tool",
        +      "arguments",
        +      "reason"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / page_count
        Added value: +{
        +  "description": "Number of objects on this page, not the organization total",
        +  "maximum": 9007199254740991,
        +  "minimum": -9007199254740991,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / population_input
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Population input used for the preview; IDs refer to their current saved definitions",
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / record_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Stored count; null means unknown. Call count_segment for a current count."
        +}
      • addedOutput schema / properties / record_limit
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Maximum members; null means no explicit cap"
        +}
    • Changedget_segment_audiences1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "audience_count": {
        +      "type": "number"
        +    },
        +    "audiences": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "id": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "name"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "campaign_count": {
        +      "type": "number"
        +    },
        +    "count_state": {
        +      "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.",
        +      "enum": [
        +        "unknown",
        +        "available"
        +      ],
        +      "type": "string"
        +    },
        +    "count_unit": {
        +      "const": "records",
        +      "type": "string"
        +    },
        +    "guidance": {
        +      "description": "Interpretation or recovery guidance for this result",
        +      "type": "string"
        +    },
        +    "money_display": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "next_actions": {
        +      "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "arguments": {
        +            "additionalProperties": {},
        +            "propertyNames": {
        +              "type": "string"
        +            },
        +            "type": "object"
        +          },
        +          "reason": {
        +            "type": "string"
        +          },
        +          "tool": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "tool",
        +          "arguments",
        +          "reason"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "page_count": {
        +      "description": "Number of objects on this page, not the organization total",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "population_input": {
        +      "additionalProperties": {},
        +      "description": "Population input used for the preview; IDs refer to their current saved definitions",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "audiences",
        +    "audience_count",
        +    "campaign_count"
        +  ],
        +  "type": "object"
        +}
    • Changedget_segment_demographics1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "age_breakdown": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "label": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "label"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "breakdown_extra": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "label": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "label"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "count_state": {
        +      "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.",
        +      "enum": [
        +        "unknown",
        +        "available"
        +      ],
        +      "type": "string"
        +    },
        +    "count_unit": {
        +      "const": "records",
        +      "type": "string"
        +    },
        +    "extra_field": {
        +      "type": "string"
        +    },
        +    "generated_at": {
        +      "description": "ISO timestamp of the demographic snapshot",
        +      "type": "string"
        +    },
        +    "geo_breakdown": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "label": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "label"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "guidance": {
        +      "description": "Interpretation or recovery guidance for this result",
        +      "type": "string"
        +    },
        +    "money_display": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "next_actions": {
        +      "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "arguments": {
        +            "additionalProperties": {},
        +            "propertyNames": {
        +              "type": "string"
        +            },
        +            "type": "object"
        +          },
        +          "reason": {
        +            "type": "string"
        +          },
        +          "tool": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "tool",
        +          "arguments",
        +          "reason"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "page_count": {
        +      "description": "Number of objects on this page, not the organization total",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "population_input": {
        +      "additionalProperties": {},
        +      "description": "Population input used for the preview; IDs refer to their current saved definitions",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "segment_id": {
        +      "type": "string"
        +    },
        +    "segment_name": {
        +      "type": "string"
        +    },
        +    "total_count": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "total_count",
        +    "age_breakdown",
        +    "geo_breakdown",
        +    "generated_at",
        +    "segment_id",
        +    "segment_name"
        +  ],
        +  "type": "object"
        +}
    • Changedget_workflow_status1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "audience_id": {
        +      "type": "string"
        +    },
        +    "count_state": {
        +      "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.",
        +      "enum": [
        +        "unknown",
        +        "available"
        +      ],
        +      "type": "string"
        +    },
        +    "count_unit": {
        +      "const": "records",
        +      "type": "string"
        +    },
        +    "current_step": {
        +      "type": "number"
        +    },
        +    "failure": {
        +      "additionalProperties": false,
        +      "description": "Safe failure reason and next action when status is failed",
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message"
        +      ],
        +      "type": "object"
        +    },
        +    "guidance": {
        +      "description": "Interpretation or recovery guidance for this result",
        +      "type": "string"
        +    },
        +    "money_display": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "next_actions": {
        +      "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "arguments": {
        +            "additionalProperties": {},
        +            "propertyNames": {
        +              "type": "string"
        +            },
        +            "type": "object"
        +          },
        +          "reason": {
        +            "type": "string"
        +          },
        +          "tool": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "tool",
        +          "arguments",
        +          "reason"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "page_count": {
        +      "description": "Number of objects on this page, not the organization total",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "paused_gate": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "gate_id": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "options": {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        }
        +      },
        +      "required": [
        +        "gate_id",
        +        "message",
        +        "options"
        +      ],
        +      "type": "object"
        +    },
        +    "population_input": {
        +      "additionalProperties": {},
        +      "description": "Population input used for the preview; IDs refer to their current saved definitions",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "segment_id": {
        +      "type": "string"
        +    },
        +    "status": {
        +      "type": "string"
        +    },
        +    "step_count": {
        +      "type": "number"
        +    },
        +    "workflow_run_id": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "workflow_run_id",
        +    "status",
        +    "current_step",
        +    "step_count"
        +  ],
        +  "type": "object"
        +}
    • Addedlink_audience_to_campaign
    • Changedlist_all_deliveries1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "count_state": {
        +      "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.",
        +      "enum": [
        +        "unknown",
        +        "available"
        +      ],
        +      "type": "string"
        +    },
        +    "count_unit": {
        +      "const": "records",
        +      "type": "string"
        +    },
        +    "deliveries": {
        +      "description": "Delivery summaries; signed download URLs are omitted from history",
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "status": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "status"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "guidance": {
        +      "description": "Interpretation or recovery guidance for this result",
        +      "type": "string"
        +    },
        +    "money_display": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "next_actions": {
        +      "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "arguments": {
        +            "additionalProperties": {},
        +            "propertyNames": {
        +              "type": "string"
        +            },
        +            "type": "object"
        +          },
        +          "reason": {
        +            "type": "string"
        +          },
        +          "tool": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "tool",
        +          "arguments",
        +          "reason"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "page_count": {
        +      "description": "Number of objects on this page, not the organization total",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "population_input": {
        +      "additionalProperties": {},
        +      "description": "Population input used for the preview; IDs refer to their current saved definitions",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "deliveries"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_audiences14 fields changed
      • addedInput schema / properties / campaign_id
        Added value: +{
        +  "description": "Only audiences linked to this campaign (newest link first). Use list_campaigns to find campaign IDs.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / compact
        Added value: +{
        +  "default": true,
        +  "description": "Return small summaries by default. Use the matching get tool for a complete definition, or compact=false for full entries.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / cursor
        Added value: +{
        +  "description": "next_cursor from a previous response",
        +  "type": "string"
        +}
      • addedInput schema / properties / include_archived
        Added value: +{
        +  "description": "Include archived objects so they can be found and restored",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / limit / default
        Added value: +10
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of audiences to return (default 50; REST maximum 100)"New value: +"Maximum number of audiences to return (default 10; maximum 100)"
      • addedInput schema / properties / unlinked
        Added value: +{
        +  "description": "When true, only audiences that belong to no campaign. Do not combine with campaign_id.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / count_state
        Added value: +{
        +  "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.",
        +  "enum": [
        +    "unknown",
        +    "available"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / count_unit
        Added value: +{
        +  "const": "records",
        +  "type": "string"
        +}
      • addedOutput schema / properties / guidance
        Added value: +{
        +  "description": "Interpretation or recovery guidance for this result",
        +  "type": "string"
        +}
      • addedOutput schema / properties / money_display
        Added value: +{
        +  "additionalProperties": {
        +    "type": "string"
        +  },
        +  "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.",
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / next_actions
        Added value: +{
        +  "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "arguments": {
        +        "additionalProperties": {},
        +        "propertyNames": {
        +          "type": "string"
        +        },
        +        "type": "object"
        +      },
        +      "reason": {
        +        "type": "string"
        +      },
        +      "tool": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "tool",
        +      "arguments",
        +      "reason"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / page_count
        Added value: +{
        +  "description": "Number of objects on this page, not the organization total",
        +  "maximum": 9007199254740991,
        +  "minimum": -9007199254740991,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / population_input
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Population input used for the preview; IDs refer to their current saved definitions",
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
    • Changedlist_campaigns10 fields changed
      • addedInput schema / properties / compact
        Added value: +{
        +  "default": true,
        +  "description": "Return small name/status summaries by default; set false for each saved brief and timestamps. Call get_campaign for linked audiences.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / limit / default
        Added value: +10
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum campaigns per page (default 25)"New value: +"Maximum campaigns per page (default 10)"
      • addedOutput schema / properties / count_state
        Added value: +{
        +  "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.",
        +  "enum": [
        +    "unknown",
        +    "available"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / count_unit
        Added value: +{
        +  "const": "records",
        +  "type": "string"
        +}
      • addedOutput schema / properties / guidance
        Added value: +{
        +  "description": "Interpretation or recovery guidance for this result",
        +  "type": "string"
        +}
      • addedOutput schema / properties / money_display
        Added value: +{
        +  "additionalProperties": {
        +    "type": "string"
        +  },
        +  "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.",
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / next_actions
        Added value: +{
        +  "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "arguments": {
        +        "additionalProperties": {},
        +        "propertyNames": {
        +          "type": "string"
        +        },
        +        "type": "object"
        +      },
        +      "reason": {
        +        "type": "string"
        +      },
        +      "tool": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "tool",
        +      "arguments",
        +      "reason"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / page_count
        Added value: +{
        +  "description": "Number of objects on this page, not the organization total",
        +  "maximum": 9007199254740991,
        +  "minimum": -9007199254740991,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / population_input
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Population input used for the preview; IDs refer to their current saved definitions",
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
    • Changedlist_deliveries1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "count_state": {
        +      "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.",
        +      "enum": [
        +        "unknown",
        +        "available"
        +      ],
        +      "type": "string"
        +    },
        +    "count_unit": {
        +      "const": "records",
        +      "type": "string"
        +    },
        +    "deliveries": {
        +      "description": "Delivery summaries; signed download URLs are omitted from history",
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "status": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "status"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "guidance": {
        +      "description": "Interpretation or recovery guidance for this result",
        +      "type": "string"
        +    },
        +    "money_display": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "next_actions": {
        +      "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "arguments": {
        +            "additionalProperties": {},
        +            "propertyNames": {
        +              "type": "string"
        +            },
        +            "type": "object"
        +          },
        +          "reason": {
        +            "type": "string"
        +          },
        +          "tool": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "tool",
        +          "arguments",
        +          "reason"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "page_count": {
        +      "description": "Number of objects on this page, not the organization total",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "population_input": {
        +      "additionalProperties": {},
        +      "description": "Population input used for the preview; IDs refer to their current saved definitions",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "deliveries"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_file_match_deliveries1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "count_state": {
        +      "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.",
        +      "enum": [
        +        "unknown",
        +        "available"
        +      ],
        +      "type": "string"
        +    },
        +    "count_unit": {
        +      "const": "records",
        +      "type": "string"
        +    },
        +    "deliveries": {
        +      "description": "Delivery summaries; signed download URLs are omitted from history",
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "status": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "status"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "guidance": {
        +      "description": "Interpretation or recovery guidance for this result",
        +      "type": "string"
        +    },
        +    "money_display": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "next_actions": {
        +      "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "arguments": {
        +            "additionalProperties": {},
        +            "propertyNames": {
        +              "type": "string"
        +            },
        +            "type": "object"
        +          },
        +          "reason": {
        +            "type": "string"
        +          },
        +          "tool": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "tool",
        +          "arguments",
        +          "reason"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "page_count": {
        +      "description": "Number of objects on this page, not the organization total",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "population_input": {
        +      "additionalProperties": {},
        +      "description": "Population input used for the preview; IDs refer to their current saved definitions",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "deliveries"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_file_match_jobs3 fields changed
      • changedInput schema / properties / before / description
        Previous value: -"ISO timestamp cursor for pagination"New value: +"Legacy ISO timestamp cursor for pagination"
      • addedInput schema / properties / cursor
        Added value: +{
        +  "description": "Opaque next_cursor from the preceding page; mutually exclusive with before",
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "count_state": {
        +      "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.",
        +      "enum": [
        +        "unknown",
        +        "available"
        +      ],
        +      "type": "string"
        +    },
        +    "count_unit": {
        +      "const": "records",
        +      "type": "string"
        +    },
        +    "guidance": {
        +      "description": "Interpretation or recovery guidance for this result",
        +      "type": "string"
        +    },
        +    "has_more": {
        +      "type": "boolean"
        +    },
        +    "jobs": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "match_id": {
        +            "type": "string"
        +          },
        +          "status": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "match_id",
        +          "status"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "money_display": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "next_actions": {
        +      "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "arguments": {
        +            "additionalProperties": {},
        +            "propertyNames": {
        +              "type": "string"
        +            },
        +            "type": "object"
        +          },
        +          "reason": {
        +            "type": "string"
        +          },
        +          "tool": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "tool",
        +          "arguments",
        +          "reason"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "next_cursor": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "page_count": {
        +      "description": "Number of objects on this page, not the organization total",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "population_input": {
        +      "additionalProperties": {},
        +      "description": "Population input used for the preview; IDs refer to their current saved definitions",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "jobs",
        +    "has_more"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_integration_runs3 fields changed
      • changedInput schema / properties / kind / enum
        Previous value: -[
        -  "enrichment",
        -  "onboarding",
        -  "activation",
        -  "sync",
        -  "file_match",
        -  "delivery"
        -]New value: +[
        +  "batch_enrichment",
        +  "file_enrichment",
        +  "ingest",
        +  "activation",
        +  "export"
        +]
      • changedInput schema / properties / status / enum
        Previous value: -[
        -  "created",
        -  "processing",
        -  "awaiting_provider_writeback",
        -  "completed",
        -  "failed",
        -  "expired"
        -]New value: +[
        +  "created",
        +  "processing",
        +  "awaiting_boundary",
        +  "settling",
        +  "completed",
        +  "failed",
        +  "cancelled"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "count_state": {
        +      "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.",
        +      "enum": [
        +        "unknown",
        +        "available"
        +      ],
        +      "type": "string"
        +    },
        +    "count_unit": {
        +      "const": "records",
        +      "type": "string"
        +    },
        +    "guidance": {
        +      "description": "Interpretation or recovery guidance for this result",
        +      "type": "string"
        +    },
        +    "has_more": {
        +      "type": "boolean"
        +    },
        +    "money_display": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "next_actions": {
        +      "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "arguments": {
        +            "additionalProperties": {},
        +            "propertyNames": {
        +              "type": "string"
        +            },
        +            "type": "object"
        +          },
        +          "reason": {
        +            "type": "string"
        +          },
        +          "tool": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "tool",
        +          "arguments",
        +          "reason"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "next_cursor": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "page_count": {
        +      "description": "Number of objects on this page, not the organization total",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "population_input": {
        +      "additionalProperties": {},
        +      "description": "Population input used for the preview; IDs refer to their current saved definitions",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "runs": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "connection_id": {
        +            "type": "string"
        +          },
        +          "counts": {
        +            "additionalProperties": {
        +              "type": "number"
        +            },
        +            "propertyNames": {
        +              "type": "string"
        +            },
        +            "type": "object"
        +          },
        +          "created_at": {
        +            "type": "string"
        +          },
        +          "kind": {
        +            "type": "string"
        +          },
        +          "provider": {
        +            "type": "string"
        +          },
        +          "run_id": {
        +            "type": "string"
        +          },
        +          "status": {
        +            "type": "string"
        +          },
        +          "updated_at": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "run_id",
        +          "provider",
        +          "connection_id",
        +          "kind",
        +          "status",
        +          "counts",
        +          "created_at",
        +          "updated_at"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "runs",
        +    "has_more",
        +    "next_cursor"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_match_runs3 fields changed
      • changedInput schema / properties / before / description
        Previous value: -"ISO timestamp cursor — returns runs created before this time. Use the created_at of the last run in a previous response to paginate."New value: +"Legacy ISO timestamp cursor — returns runs created before this time. Use the created_at of the last run in a previous response to paginate."
      • addedInput schema / properties / cursor
        Added value: +{
        +  "description": "Opaque next_cursor from the preceding page; mutually exclusive with before",
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "count_state": {
        +      "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.",
        +      "enum": [
        +        "unknown",
        +        "available"
        +      ],
        +      "type": "string"
        +    },
        +    "count_unit": {
        +      "const": "records",
        +      "type": "string"
        +    },
        +    "guidance": {
        +      "description": "Interpretation or recovery guidance for this result",
        +      "type": "string"
        +    },
        +    "has_more": {
        +      "type": "boolean"
        +    },
        +    "money_display": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "next_actions": {
        +      "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "arguments": {
        +            "additionalProperties": {},
        +            "propertyNames": {
        +              "type": "string"
        +            },
        +            "type": "object"
        +          },
        +          "reason": {
        +            "type": "string"
        +          },
        +          "tool": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "tool",
        +          "arguments",
        +          "reason"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "next_cursor": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "page_count": {
        +      "description": "Number of objects on this page, not the organization total",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "population_input": {
        +      "additionalProperties": {},
        +      "description": "Population input used for the preview; IDs refer to their current saved definitions",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "runs": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "input_record_count": {
        +            "type": "number"
        +          },
        +          "match_count": {
        +            "type": "number"
        +          },
        +          "run_id": {
        +            "type": "string"
        +          },
        +          "status": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "run_id",
        +          "status",
        +          "input_record_count",
        +          "match_count"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "runs",
        +    "has_more"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_saved_integration_matches1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "collections": {
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "collection_id": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "status": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "collection_id",
        +          "name",
        +          "status"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "count_state": {
        +      "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.",
        +      "enum": [
        +        "unknown",
        +        "available"
        +      ],
        +      "type": "string"
        +    },
        +    "count_unit": {
        +      "const": "records",
        +      "type": "string"
        +    },
        +    "guidance": {
        +      "description": "Interpretation or recovery guidance for this result",
        +      "type": "string"
        +    },
        +    "money_display": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "next_actions": {
        +      "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "arguments": {
        +            "additionalProperties": {},
        +            "propertyNames": {
        +              "type": "string"
        +            },
        +            "type": "object"
        +          },
        +          "reason": {
        +            "type": "string"
        +          },
        +          "tool": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "tool",
        +          "arguments",
        +          "reason"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "page_count": {
        +      "description": "Number of objects on this page, not the organization total",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "population_input": {
        +      "additionalProperties": {},
        +      "description": "Population input used for the preview; IDs refer to their current saved definitions",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "collections"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_segments12 fields changed
      • addedInput schema / properties / compact
        Added value: +{
        +  "default": true,
        +  "description": "Return small summaries by default. Set false to include saved filter_groups on filter segments; get_segment retrieves one complete definition.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / cursor
        Added value: +{
        +  "description": "next_cursor from a previous response",
        +  "type": "string"
        +}
      • addedInput schema / properties / include_archived
        Added value: +{
        +  "description": "Include archived objects so they can be found and restored",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / limit / default
        Added value: +10
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of segments to return (default 50; REST maximum 100)"New value: +"Maximum number of segments to return (default 10; maximum 100)"
      • addedOutput schema / properties / count_state
        Added value: +{
        +  "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.",
        +  "enum": [
        +    "unknown",
        +    "available"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / count_unit
        Added value: +{
        +  "const": "records",
        +  "type": "string"
        +}
      • addedOutput schema / properties / guidance
        Added value: +{
        +  "description": "Interpretation or recovery guidance for this result",
        +  "type": "string"
        +}
      • addedOutput schema / properties / money_display
        Added value: +{
        +  "additionalProperties": {
        +    "type": "string"
        +  },
        +  "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.",
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / next_actions
        Added value: +{
        +  "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.",
        +  "items": {
        +    "additionalProperties": false,
        +    "properties": {
        +      "arguments": {
        +        "additionalProperties": {},
        +        "propertyNames": {
        +          "type": "string"
        +        },
        +        "type": "object"
        +      },
        +      "reason": {
        +        "type": "string"
        +      },
        +      "tool": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "tool",
        +      "arguments",
        +      "reason"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / page_count
        Added value: +{
        +  "description": "Number of objects on this page, not the organization total",
        +  "maximum": 9007199254740991,
        +  "minimum": -9007199254740991,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / population_input
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Population input used for the preview; IDs refer to their current saved definitions",
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
    • Addedmatch_records
    • Addedpatch_audience
    • Addedpatch_segment
    • Changedpreview_saved_integration_segment1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "count_state": {
        +      "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.",
        +      "enum": [
        +        "unknown",
        +        "available"
        +      ],
        +      "type": "string"
        +    },
        +    "count_unit": {
        +      "const": "records",
        +      "type": "string"
        +    },
        +    "cutoff_at": {
        +      "type": "string"
        +    },
        +    "guidance": {
        +      "description": "Interpretation or recovery guidance for this result",
        +      "type": "string"
        +    },
        +    "money_display": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "next_actions": {
        +      "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "arguments": {
        +            "additionalProperties": {},
        +            "propertyNames": {
        +              "type": "string"
        +            },
        +            "type": "object"
        +          },
        +          "reason": {
        +            "type": "string"
        +          },
        +          "tool": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "tool",
        +          "arguments",
        +          "reason"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "page_count": {
        +      "description": "Number of objects on this page, not the organization total",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "population_input": {
        +      "additionalProperties": {},
        +      "description": "Population input used for the preview; IDs refer to their current saved definitions",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "preview": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "already_present": {
        +          "type": "number"
        +        },
        +        "duplicate_observations": {
        +          "type": "number"
        +        },
        +        "expired_identities": {
        +          "type": "number"
        +        },
        +        "net_additions": {
        +          "type": "number"
        +        },
        +        "source_observations": {
        +          "type": "number"
        +        },
        +        "suppressed_identities": {
        +          "type": "number"
        +        },
        +        "unique_identities": {
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "source_observations",
        +        "unique_identities",
        +        "duplicate_observations",
        +        "expired_identities",
        +        "suppressed_identities",
        +        "already_present",
        +        "net_additions"
        +      ],
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "cutoff_at",
        +    "preview"
        +  ],
        +  "type": "object"
        +}
    • Changedquote_delivery1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "already_delivered": {
        +      "type": "boolean"
        +    },
        +    "audience_id": {
        +      "type": "string"
        +    },
        +    "cost_estimate": {
        +      "additionalProperties": {},
        +      "description": "Expected license-aware charge in USD",
        +      "properties": {
        +        "base_cost": {
        +          "type": "number"
        +        },
        +        "billing_count": {
        +          "type": "number"
        +        },
        +        "destination_cost": {
        +          "type": "number"
        +        },
        +        "field_cost": {
        +          "type": "number"
        +        },
        +        "match_cost": {
        +          "type": "number"
        +        },
        +        "total_cost": {
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "base_cost",
        +        "match_cost",
        +        "field_cost",
        +        "destination_cost",
        +        "total_cost",
        +        "billing_count"
        +      ],
        +      "type": "object"
        +    },
        +    "count_state": {
        +      "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.",
        +      "enum": [
        +        "unknown",
        +        "available"
        +      ],
        +      "type": "string"
        +    },
        +    "count_unit": {
        +      "const": "records",
        +      "type": "string"
        +    },
        +    "destination": {
        +      "type": "string"
        +    },
        +    "guidance": {
        +      "description": "Interpretation or recovery guidance for this result",
        +      "type": "string"
        +    },
        +    "license_pricing": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "status": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "status"
        +      ],
        +      "type": "object"
        +    },
        +    "max_cost_estimate": {
        +      "additionalProperties": {},
        +      "description": "Worst-case charge ceiling in USD",
        +      "properties": {
        +        "base_cost": {
        +          "type": "number"
        +        },
        +        "billing_count": {
        +          "type": "number"
        +        },
        +        "destination_cost": {
        +          "type": "number"
        +        },
        +        "field_cost": {
        +          "type": "number"
        +        },
        +        "match_cost": {
        +          "type": "number"
        +        },
        +        "total_cost": {
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "base_cost",
        +        "match_cost",
        +        "field_cost",
        +        "destination_cost",
        +        "total_cost",
        +        "billing_count"
        +      ],
        +      "type": "object"
        +    },
        +    "money_display": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "next_actions": {
        +      "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "arguments": {
        +            "additionalProperties": {},
        +            "propertyNames": {
        +              "type": "string"
        +            },
        +            "type": "object"
        +          },
        +          "reason": {
        +            "type": "string"
        +          },
        +          "tool": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "tool",
        +          "arguments",
        +          "reason"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "page_count": {
        +      "description": "Number of objects on this page, not the organization total",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "population_input": {
        +      "additionalProperties": {},
        +      "description": "Population input used for the preview; IDs refer to their current saved definitions",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "shortfall": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "sufficient_balance": {
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "audience_id",
        +    "destination",
        +    "already_delivered",
        +    "cost_estimate",
        +    "max_cost_estimate",
        +    "sufficient_balance",
        +    "shortfall",
        +    "license_pricing"
        +  ],
        +  "type": "object"
        +}
    • Changedrecount_audience1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "audience_id": {
        +      "type": "string"
        +    },
        +    "count_state": {
        +      "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.",
        +      "enum": [
        +        "unknown",
        +        "available"
        +      ],
        +      "type": "string"
        +    },
        +    "count_unit": {
        +      "const": "records",
        +      "type": "string"
        +    },
        +    "guidance": {
        +      "description": "Interpretation or recovery guidance for this result",
        +      "type": "string"
        +    },
        +    "money_display": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "next_actions": {
        +      "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "arguments": {
        +            "additionalProperties": {},
        +            "propertyNames": {
        +              "type": "string"
        +            },
        +            "type": "object"
        +          },
        +          "reason": {
        +            "type": "string"
        +          },
        +          "tool": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "tool",
        +          "arguments",
        +          "reason"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "page_count": {
        +      "description": "Number of objects on this page, not the organization total",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "population_input": {
        +      "additionalProperties": {},
        +      "description": "Population input used for the preview; IDs refer to their current saved definitions",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "record_count": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "Fresh audience count, or null when unavailable"
        +    }
        +  },
        +  "required": [
        +    "audience_id",
        +    "record_count"
        +  ],
        +  "type": "object"
        +}
    • Addedrefresh_audience
    • Addedrefresh_segment
    • Addedrespond_to_workflow_gate
    • Addedunlink_audience_from_campaign
    • Addedupdate_campaign
    • Changedwait_for_delivery5 fields changed
      • changedInput schema / properties / audience_id / description
        Previous value: -"Audience ID the delivery belongs to (same as match_id for matched audiences)"New value: +"Audience ID returned by the delivery or file-match job; do not assume it equals match_id or segment_id"
      • changedInput schema / properties / timeout_seconds / default
        Previous value: -900New value: +30
      • changedInput schema / properties / timeout_seconds / description
        Previous value: -"Maximum seconds to wait. Default 900 (15 min)."New value: +"Maximum seconds to wait (default 30). Prefer get_delivery for a single status check; a wait timeout is not an export failure."
      • changedInput schema / properties / timeout_seconds / minimum
        Previous value: -30New value: +1
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "count_state": {
        +      "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.",
        +      "enum": [
        +        "unknown",
        +        "available"
        +      ],
        +      "type": "string"
        +    },
        +    "count_unit": {
        +      "const": "records",
        +      "type": "string"
        +    },
        +    "download_urls": {
        +      "description": "Fresh signed artifact URLs on an individual completed download delivery",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "guidance": {
        +      "description": "Interpretation or recovery guidance for this result",
        +      "type": "string"
        +    },
        +    "money_display": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "next_actions": {
        +      "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "arguments": {
        +            "additionalProperties": {},
        +            "propertyNames": {
        +              "type": "string"
        +            },
        +            "type": "object"
        +          },
        +          "reason": {
        +            "type": "string"
        +          },
        +          "tool": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "tool",
        +          "arguments",
        +          "reason"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "page_count": {
        +      "description": "Number of objects on this page, not the organization total",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "population_input": {
        +      "additionalProperties": {},
        +      "description": "Population input used for the preview; IDs refer to their current saved definitions",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "status": {
        +      "description": "Current delivery state",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status"
        +  ],
        +  "type": "object"
        +}
    • Changedwait_for_segment4 fields changed
      • changedInput schema / properties / timeout_seconds / default
        Previous value: -900New value: +30
      • changedInput schema / properties / timeout_seconds / description
        Previous value: -"Maximum seconds to wait before giving up. Default 900 (15 min). Use up to 7200 (2hr) for propensity/similarity workflows."New value: +"Maximum seconds to wait (default 30). Prefer get_segment for a single status check; a wait timeout does not stop processing."
      • changedInput schema / properties / timeout_seconds / minimum
        Previous value: -30New value: +1
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "count_state": {
        +      "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.",
        +      "enum": [
        +        "unknown",
        +        "available"
        +      ],
        +      "type": "string"
        +    },
        +    "count_unit": {
        +      "const": "records",
        +      "type": "string"
        +    },
        +    "current_version": {
        +      "type": "number"
        +    },
        +    "filter_groups": {
        +      "description": "Complete saved filter definition; one AND group also represents a simple flat filter list",
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "combinator": {
        +            "description": "Join to the preceding included group; ignored for the first group. AND binds before OR. Exclusion groups always subtract.",
        +            "enum": [
        +              "AND",
        +              "OR"
        +            ],
        +            "type": "string"
        +          },
        +          "filters": {
        +            "items": {
        +              "additionalProperties": {},
        +              "properties": {
        +                "field": {
        +                  "description": "field_name from get_field_catalog; ZIP5 also accepts zip, zip_code or postal_code. Use published operators and enum_values",
        +                  "minLength": 1,
        +                  "type": "string"
        +                },
        +                "op": {
        +                  "enum": [
        +                    "=",
        +                    "!=",
        +                    "<",
        +                    "<=",
        +                    ">",
        +                    ">=",
        +                    "IN",
        +                    "NOT IN",
        +                    "BETWEEN",
        +                    "LIKE",
        +                    "ARRAY_CONTAINS",
        +                    "ARRAY_CONTAINS_ANY",
        +                    "IS NULL",
        +                    "IS NOT NULL"
        +                  ],
        +                  "type": "string"
        +                },
        +                "text_comparison": {
        +                  "description": "STRING =, !=, IN, NOT IN, LIKE and ARRAY<STRING> ARRAY_CONTAINS, ARRAY_CONTAINS_ANY. Default exact. case_insensitive applies Unicode case folding to stored text and the supplied value; use when capitalization is incidental.",
        +                  "enum": [
        +                    "exact",
        +                    "case_insensitive"
        +                  ],
        +                  "type": "string"
        +                },
        +                "trim_whitespace": {
        +                  "description": "Supported STRING or ARRAY<STRING> comparisons only. Trim leading/trailing whitespace on both sides; default false.",
        +                  "type": "boolean"
        +                },
        +                "value": {
        +                  "anyOf": [
        +                    {
        +                      "type": "string"
        +                    },
        +                    {
        +                      "type": "number"
        +                    },
        +                    {
        +                      "type": "boolean"
        +                    },
        +                    {
        +                      "items": {
        +                        "anyOf": [
        +                          {
        +                            "type": "string"
        +                          },
        +                          {
        +                            "type": "number"
        +                          },
        +                          {
        +                            "type": "boolean"
        +                          }
        +                        ]
        +                      },
        +                      "type": "array"
        +                    },
        +                    {
        +                      "type": "null"
        +                    }
        +                  ],
        +                  "description": "Scalar for comparisons; array for IN/NOT IN; ARRAY_CONTAINS_ANY matches any listed value; [lower, upper] inclusive for BETWEEN; LIKE uses % for any sequence and _ for one character; omit for IS NULL/IS NOT NULL. Use enum_values codes, not display labels"
        +                }
        +              },
        +              "required": [
        +                "field",
        +                "op"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "id": {
        +            "description": "Caller-chosen group ID, for example geography; prefix _exclude:: to subtract this group",
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "combinator",
        +          "filters"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "guidance": {
        +      "description": "Interpretation or recovery guidance for this result",
        +      "type": "string"
        +    },
        +    "money_display": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "name": {
        +      "type": "string"
        +    },
        +    "next_actions": {
        +      "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "arguments": {
        +            "additionalProperties": {},
        +            "propertyNames": {
        +              "type": "string"
        +            },
        +            "type": "object"
        +          },
        +          "reason": {
        +            "type": "string"
        +          },
        +          "tool": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "tool",
        +          "arguments",
        +          "reason"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "page_count": {
        +      "description": "Number of objects on this page, not the organization total",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "population_input": {
        +      "additionalProperties": {},
        +      "description": "Population input used for the preview; IDs refer to their current saved definitions",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "record_count": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "Stored count; null means unknown. Call count_segment for a current count."
        +    },
        +    "record_limit": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "Maximum members; null means no explicit cap"
        +    },
        +    "segment_id": {
        +      "type": "string"
        +    },
        +    "status": {
        +      "type": "string"
        +    },
        +    "subtype": {
        +      "enum": [
        +        "filter",
        +        "matched",
        +        "similarity",
        +        "propensity"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "segment_id",
        +    "name",
        +    "subtype",
        +    "status"
        +  ],
        +  "type": "object"
        +}
    • Changedwait_for_workflow4 fields changed
      • changedInput schema / properties / timeout_seconds / default
        Previous value: -7200New value: +30
      • changedInput schema / properties / timeout_seconds / description
        Previous value: -"Maximum seconds to wait (default 7200 = 2hr; BQML training routinely takes 10–60 min and a brief network blip near completion could cause a 1hr timeout to fire prematurely)"New value: +"Maximum seconds to wait (default 30). Prefer get_workflow_status for a single status check; processing continues after a wait timeout."
      • changedInput schema / properties / timeout_seconds / minimum
        Previous value: -60New value: +1
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "properties": {
        +    "audience_id": {
        +      "type": "string"
        +    },
        +    "count_state": {
        +      "description": "Unknown means no count; available does not guarantee freshness. Recount for a current value.",
        +      "enum": [
        +        "unknown",
        +        "available"
        +      ],
        +      "type": "string"
        +    },
        +    "count_unit": {
        +      "const": "records",
        +      "type": "string"
        +    },
        +    "current_step": {
        +      "type": "number"
        +    },
        +    "failure": {
        +      "additionalProperties": false,
        +      "description": "Safe failure reason and next action when status is failed",
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message"
        +      ],
        +      "type": "object"
        +    },
        +    "guidance": {
        +      "description": "Interpretation or recovery guidance for this result",
        +      "type": "string"
        +    },
        +    "money_display": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "description": "Currency amounts formatted once from source paths ending in _cents. Use verbatim; do not divide again. Null/missing source amounts are omitted, not zero.",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "next_actions": {
        +      "description": "Suggested next calls using returned IDs and available scopes. Not executed and not user consent.",
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "arguments": {
        +            "additionalProperties": {},
        +            "propertyNames": {
        +              "type": "string"
        +            },
        +            "type": "object"
        +          },
        +          "reason": {
        +            "type": "string"
        +          },
        +          "tool": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "tool",
        +          "arguments",
        +          "reason"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "page_count": {
        +      "description": "Number of objects on this page, not the organization total",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "paused_gate": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "gate_id": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "options": {
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        }
        +      },
        +      "required": [
        +        "gate_id",
        +        "message",
        +        "options"
        +      ],
        +      "type": "object"
        +    },
        +    "population_input": {
        +      "additionalProperties": {},
        +      "description": "Population input used for the preview; IDs refer to their current saved definitions",
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "segment_id": {
        +      "type": "string"
        +    },
        +    "status": {
        +      "type": "string"
        +    },
        +    "step_count": {
        +      "type": "number"
        +    },
        +    "workflow_run_id": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "workflow_run_id",
        +    "status",
        +    "current_step",
        +    "step_count"
        +  ],
        +  "type": "object"
        +}
  2. 27 tool updates
    • Removedarchive_segment
    • Removedbuild_saved_integration_segment
    • Removedbulk_archive_audiences
    • Removedbulk_archive_segments
    • Removedbulk_create_audiences
    • Removedbulk_create_segments
    • Removedbulk_deliver_audiences
    • Removedbulk_patch_audiences
    • Removedbulk_patch_segments
    • Removedcancel_matched_upload
    • Removedconfirm_column_mappings
    • Removedcreate_audience
    • Removedcreate_campaign
    • Removedcreate_segment
    • Removeddelete_audience
    • Removeddeliver_audience
    • Removeddeliver_file_match
    • Removedduplicate_audience
    • Removedduplicate_segment
    • Removedlink_audience_to_campaign
    • Removedmatch_records
    • Removedpatch_audience
    • Removedrefresh_audience
    • Removedrefresh_segment
    • Removedrespond_to_workflow_gate
    • Removedunlink_audience_from_campaign
    • Removedupdate_campaign
  3. 63 tool updates
    • First observedanalyze_audience_upload
    • First observedarchive_segment
    • First observedbuild_saved_integration_segment
    • First observedbulk_archive_audiences
    • First observedbulk_archive_segments
    • First observedbulk_create_audiences
    • First observedbulk_create_segments
    • First observedbulk_deliver_audiences
    • First observedbulk_patch_audiences
    • First observedbulk_patch_segments
    • First observedcancel_matched_upload
    • First observedconfirm_column_mappings
    • First observedcount_segment
    • First observedcreate_audience
    • First observedcreate_campaign
    • First observedcreate_segment
    • First observeddelete_audience
    • First observeddeliver_audience
    • First observeddeliver_file_match
    • First observeddiscovery_count
    • First observeddiscovery_crosstab
    • First observeddiscovery_lookup
    • First observeddiscovery_overlap
    • First observedduplicate_audience
    • First observedduplicate_segment
    • First observedget_audience
    • First observedget_audience_demographics
    • First observedget_campaign
    • First observedget_data_release
    • First observedget_delivery
    • First observedget_field_catalog
    • First observedget_file_match_job
    • First observedget_integration_run
    • First observedget_match_run
    • First observedget_saved_integration_segment_build
    • First observedget_segment
    • First observedget_segment_audiences
    • First observedget_segment_demographics
    • First observedget_workflow_status
    • First observedlink_audience_to_campaign
    • First observedlist_all_deliveries
    • First observedlist_audiences
    • First observedlist_campaigns
    • First observedlist_deliveries
    • First observedlist_file_match_deliveries
    • First observedlist_file_match_jobs
    • First observedlist_integration_runs
    • First observedlist_match_runs
    • First observedlist_saved_integration_matches
    • First observedlist_segments
    • First observedmatch_records
    • First observedpatch_audience
    • First observedpreview_saved_integration_segment
    • First observedquote_delivery
    • First observedrecount_audience
    • First observedrefresh_audience
    • First observedrefresh_segment
    • First observedrespond_to_workflow_gate
    • First observedunlink_audience_from_campaign
    • First observedupdate_campaign
    • First observedwait_for_delivery
    • First observedwait_for_segment
    • First observedwait_for_workflow

Publisher details

Operator
NO FAIT
Vendor relationship
First-party
Restrictions
Requires paid plan

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables clients to run paid technographic domain enrichment, search a shared prospect database with technology filters, manage saved lists, and reconstruct CSV export snapshots through authenticated tools. It supports both API-key stdio and hosted OAuth connections with scoped workspace consent and credit tracking.
    37 npm
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables people and company discovery, enrichment, identity resolution, and contact finding through unified MCP tools, with optional provider endpoint catalog access using your own API keys.
    12
    1
    Apache 2.0
  • A
    license
    A
    quality
    B
    maintenance
    Enables users to search masked contact previews, unlock selected records with approval and credit controls, and prepare suppression-aware CSV exports through hosted Streamable HTTP or a local stdio bridge.
    7
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources