Skip to main content
Glama

Trillboards DOOH Advertising

Server Details

DOOH advertising via AI agents. 5,000+ screens with edge AI audience intelligence.

Status
Healthy
Last Tested
Transport
Streamable HTTP
URL

Glama MCP Gateway

Connect through Glama MCP Gateway for full control over tool access and complete visibility into every call.

MCP client
Glama
MCP server

Full call logging

Every tool call is logged with complete inputs and outputs, so you can debug issues and audit what your agents are doing.

Tool access control

Enable or disable individual tools per connector, so you decide what your agents can and cannot do.

Managed credentials

Glama handles OAuth flows, token storage, and automatic rotation, so credentials never expire on your clients.

Usage analytics

See which tools your agents call, how often, and when, so you can understand usage patterns and catch anomalies.

100% free. Your data is private.
Tool DescriptionsA

Average 4.3/5 across 83 of 83 tools scored. Lowest: 3.3/5.

Server CoherenceC
Disambiguation2/5

Many tools overlap in purpose, e.g., multiple observation/search tools (query_observations, semantic_search_observations, find_similar_moments) and several analytics tools (get_attention_metrics, get_creative_attention, get_campaign_performance). Explicit duplicate legacy names like get_task_status/tasks_get and list_tasks/tasks_list make selection even more ambiguous.

Naming Consistency3/5

Most tools follow a get_/list_/create_/update_/delete_ pattern, but there are inconsistent legacy names (tasks_get, tasks_list) and a wide variety of verbs (predict, recommend, export, sync, verify). The convention is readable but not consistently applied.

Tool Count1/5

With 83 tools, this server is far beyond the well-scoped 3-15 range. Even for a broad API, exposing the entire surface including billing, discovery, and legacy aliases makes the tool set unwieldy and likely to overwhelm agents.

Completeness4/5

The surface covers an extensive domain: device lifecycle, impressions, webhooks, campaigns, analytics, attribution, experiments, content, billing, and API discovery. Minor gaps exist (e.g., no update_campaign/delete_campaign for standard campaigns), but overall the domain is thoroughly represented.

Available Tools

83 tools
activate_signalAInspect

[AdCP Signals] Activate an audience signal for DSP targeting.

Returns an activation_key token for referencing this signal activation. Free-form Trillboards signal labels remain custom parameters. IAB Audience Taxonomy 1.1 segments are emitted only when registered IDs are supplied explicitly.

WHEN TO USE:

  • Converting audience signals into actionable targeting parameters

  • Activating already-curated, registered IAB segment IDs for programmatic requests

  • Creating reusable targeting configurations

RETURNS:

  • activation_key: Token for referencing this activation (24h expiry)

  • targeting: { iab_segments, iab_taxonomy_version, custom_params }

  • screen_count, provider, data_source, methodology

EXAMPLE: User: "Activate the registered $100k-$149k household-income segment on my screens" activate_signal({ signal_type: "audience", parameters: { iab_audience_segment_ids: ["68"] }, screen_ids: ["507f1f77bcf86cd799439011"] })

ParametersJSON Schema
NameRequiredDescriptionDefault
parametersYesSignal parameters to activate as targeting
screen_idsNoSpecific screens to activate on (optional, defaults to all partner screens)
signal_typeYesType of signal to activate (e.g., "audience", "venue", "behavior")
destinationsNoWhere to push activated segments
Behavior4/5

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

With no annotations provided, the description carries the burden of behavioral disclosure. It reveals important traits: activation_key expires in 24 hours, IAB segments are only emitted when registered IDs are explicitly supplied, and free-form labels remain custom parameters. It also outlines the return structure.

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

Conciseness4/5

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

The description is well-organized with clear sections (purpose, when-to-use, returns, example) and front-loaded with the primary action. It is slightly long but each section contributes useful information without unnecessary repetition.

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

Completeness4/5

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

Given there is no output schema, the description compensates by detailing return fields (activation_key, targeting, screen_count, etc.) and providing a concrete example. It covers the tool's core behavior, though it omits edge cases like invalid IAB IDs or error handling.

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

Parameters3/5

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

The schema covers all top-level properties with descriptions, but nested enums like income and purchase_intent lack descriptions. The description adds value through an example and the IAB caveat, but does not systematically explain each parameter 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 opens with 'Activate an audience signal for DSP targeting,' which clearly states the specific action (activate), the resource (audience signal), and the intent (DSP targeting). It also mentions returning an activation_key, further distinguishing it from sibling tools like get_signals or semantic_audience_search.

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?

A dedicated 'WHEN TO USE' section lists three concrete scenarios, such as converting signals into targeting parameters and activating registered IAB segments. It provides clear context for when to invoke the tool, though it does not explicitly state when not to use it or name alternative tools.

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

anomaly_detectAInspect

Detect anomalies in observation patterns. Alert when metrics deviate significantly from trailing averages.

Computes trailing mean and standard deviation for a given metric from the observation_stream, then identifies observations that fall beyond the configured sigma threshold (z-score based anomaly detection).

WHEN TO USE:

  • Monitoring for unusual audience patterns (sudden spikes or drops in face count)

  • Detecting equipment anomalies (confidence drops indicating sensor issues)

  • Identifying unusual commerce or vehicle patterns

  • Finding outlier moments that may indicate events, incidents, or opportunities

RETURNS:

  • anomalies: Array of anomalous observations with:

    • observation_id, device_id, venue_type, observed_at

    • metric_value: The observed value

    • z_score: How many standard deviations from the mean

    • direction: 'above' or 'below' the mean

    • payload: Full observation payload for context

  • baseline: { mean, stddev, sample_count, lookback_hours }

  • suggested_next_queries: Follow-up queries to investigate anomalies

EXAMPLE: User: "Are there any unusual audience patterns at retail venues?" anomaly_detect({ metric: "face_count", venue_type: "retail", lookback_hours: 24, threshold_sigma: 2.0 })

User: "Detect anomalies in vehicle counts at this screen" anomaly_detect({ metric: "vehicle_count", screen_id: "507f1f77bcf86cd799439011", lookback_hours: 48, threshold_sigma: 2.5 })

ParametersJSON Schema
NameRequiredDescriptionDefault
metricYesThe metric to check for anomalies. Extracted from observation payload (e.g., face_count, vehicle_count, confidence, emotional_engagement, crowd_energy, noise_level)
screen_idNoFilter to a specific screen (mongo ID). Optional.
venue_typeNoFilter to a specific venue type. Optional.
lookback_hoursNoHours of historical data to compute baseline from (default: 24, max: 168)
threshold_sigmaNoNumber of standard deviations to consider anomalous (default: 2.0, range: 1.0-5.0)
Behavior4/5

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

With no annotations provided, the description carries the full burden and does well: it discloses the algorithmic behavior (trailing mean/stddev, z-score), computes baseline statistics, and describes the return payload. It doesn't explicitly state side-effect safety, but the focus on detection and returns implies a read-only operation.

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

Conciseness4/5

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

The description is structured into clear sections (purpose, when to use, returns, examples) and every sentence contributes value. It is longer than average but appropriate given the tool's complexity and the absence of an output schema.

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

Completeness5/5

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

The description fully compensates for missing annotations and missing output schema by detailing return values, providing example invocations, and explaining the detection logic. It is complete enough for an agent to select and invoke the tool correctly.

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

Parameters3/5

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

Schema coverage is 100%, so the baseline is 3. The description adds meaningful context beyond the schema by explaining how parameters like metric, lookback_hours, and threshold_sigma interact in examples, but it doesn't provide per-parameter semantics beyond what the schema already offers.

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 ('Detect anomalies') and clearly identifies the resource ('observation patterns'), making the tool's purpose explicit. It distinguishes from siblings like predictive_query by focusing on statistical outlier detection in observation data.

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

Usage Guidelines4/5

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

A dedicated 'WHEN TO USE' section lists concrete scenarios such as monitoring audience patterns and detecting equipment anomalies, providing clear usage context. It does not explicitly name alternative tools or state when not to use this tool, but the context is strong enough to guide selection.

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

batch_impressionsAInspect

Record multiple impressions in a single request (up to 100).

WHEN TO USE:

  • Bulk reporting impressions from offline period

  • Efficient batch processing of impressions

  • When device was offline and needs to sync

RETURNS:

  • success: Boolean indicating success

  • processed: Number of impressions processed

  • failed: Number of failed impressions

  • total_earnings: Total earnings credited

  • errors: Any error details for failed impressions

EXAMPLE: User: "Sync the last hour of impressions" batch_impressions({ impressions: [ { fingerprint: "P_abc123", ad_id: "507f1f77bcf86cd799439011", duration_seconds: 15 }, { fingerprint: "P_abc123", ad_id: "507f1f77bcf86cd799439012", duration_seconds: 10 } ] })

ParametersJSON Schema
NameRequiredDescriptionDefault
impressionsYesArray of impression objects (max 100)
Behavior4/5

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

With no annotations provided, the description carries the full burden for behavioral disclosure. It discloses the request limit (up to 100), the return fields (success, processed, failed, total_earnings, errors), and the offline sync scenario, implying partial failures and earnings crediting. This goes beyond a minimal description, though it could mention idempotency or authentication details.

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

Conciseness4/5

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

The description is well-structured with separate sections for purpose, usage, returns, and an example. It is somewhat long but every section adds value, and the example is useful for illustrating the expected input. No superfluous content is present.

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

Completeness4/5

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

The tool has a single parameter with a nested object structure, no output schema, and no annotations. The description compensates by detailing the return values and providing an example. It adequately covers the essential usage context, but could elaborate on error handling or idempotency for full completeness.

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

Parameters3/5

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

The input schema already provides descriptions for all properties, achieving 100% coverage. The description adds an example illustrating the array structure, but it does not explain parameter meanings beyond what the schema offers. Since schema coverage is high, a baseline score of 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool records multiple impressions in a single request with a limit of 100. This distinguishes it from the sibling 'record_impression' tool which likely handles one at a time. The verb 'record' and resource 'impressions' are specific and unambiguous.

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

Usage Guidelines4/5

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

The 'WHEN TO USE' section explicitly provides three use cases: bulk reporting, efficient batch processing, and offline sync. This gives clear context on when to invoke this tool. It does not name alternatives explicitly, but the context naturally differentiates it from single-record operations.

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

configure_sensingAInspect

Configure what a screen should sense using natural language. Generates and optionally pushes a sensing profile to the device.

Uses Gemini AI to interpret a natural language sensing intent and generate a sensing profile that maps to available on-device ML models (BlazeFace, AgeGender, FER+, MoveNet, YAMNet, WhisperTiny, EfficientDet, YOLOv8-nano).

WHEN TO USE:

  • Setting up a new screen to sense specific things (faces, vehicles, emotions, etc.)

  • Changing what a screen detects based on venue type or business needs

  • Configuring custom sensing for special events or campaigns

  • Translating business intent into ML model configuration

RETURNS:

  • data: The generated sensing profile with:

    • profile_name, profile_type, description

    • models: Array of ML model IDs to activate

    • classes: COCO classes to detect (for object detection models)

    • thresholds: Confidence and alert thresholds

    • observation_families: What types of observations will be produced

    • capture_interval_ms, report_interval_ms: Timing configuration

    • estimated_fps_impact: CPU cost estimate

    • data_fields_produced: All data fields the profile will generate

    • reasoning: Why these models/classes were chosen

    • deployment_status: 'generated' | 'pushed' | 'push_failed'

  • metadata: { screen_id, auto_deploy, profile_id }

  • suggested_next_queries: Follow-up actions

EXAMPLE: User: "Set up the lobby screen to detect foot traffic and emotions" configure_sensing({ screen_id: "507f1f77bcf86cd799439011", intent: "Detect foot traffic patterns, count people, and measure emotional reactions to displayed content", auto_deploy: false })

User: "Configure this drive-through screen for vehicle counting" configure_sensing({ screen_id: "507f1f77bcf86cd799439011", intent: "Count vehicles in drive-through lane, detect vehicle types, measure queue length", auto_deploy: true })

ParametersJSON Schema
NameRequiredDescriptionDefault
intentYesNatural language description of what the screen should sense/detect/measure
screen_idYesScreen ID (mongo ID) to configure sensing for
auto_deployNoIf true, automatically push the profile to the device. If false (default), generate only for review.
Behavior3/5

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

No annotations are provided, so the description must carry the full burden. It does disclose the key mutation behavior: 'optionally pushes a sensing profile to the device' and includes deployment_status values (generated, pushed, push_failed). However, it stops short of explaining consequences like overwriting existing profiles, permission requirements, or reversibility of a push.

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

Conciseness4/5

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

The description is well-structured with clear sections (overview, when to use, returns, examples) and front-loaded with a concise first sentence. While longer than the get_calls example, the length is justified by the tool's complexity and the detailed return fields. No extraneous fluff.

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

Completeness5/5

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

Despite having no output schema, the description enumerates all return fields (profile details, metadata, deployment status, suggested queries) and provides two examples covering both auto_deploy outcomes. This gives the agent sufficient understanding of expected output and side effects for a complete interaction.

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

Parameters4/5

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

Schema coverage is 100% with each parameter described. The description adds value by providing concrete example intent strings and clarifying auto_deploy behavior through examples (false for review, true for direct push). This goes beyond the bare schema descriptions.

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

Purpose5/5

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

The description uses a specific verb 'configure' with a clear resource: 'what a screen should sense using natural language' and specifies the outcome (generates and optionally pushes a sensing profile). This clearly distinguishes it from the many read-oriented sibling tools like get_signals or get_device.

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 'WHEN TO USE' section provides four concrete scenarios (setting up a new screen, changing detection, custom events, translating business intent), giving solid context for when to invoke this tool. However, it does not explicitly state when not to use it or mention alternatives, which prevents a top score.

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

create_campaignAInspect

Create a new advertising campaign targeting DOOH screens.

WHEN TO USE:

  • Setting up a new ad campaign on available screens

  • Targeting specific venues, locations, or audience profiles

  • Allocating budget for programmatic DOOH buys

RETURNS:

  • campaign_id: Unique campaign identifier (UUID)

  • name, status, budget, screen_count, dates

Campaign starts in "draft" status. Use update_campaign to set status to "active".

EXAMPLE: User: "Create a campaign targeting retail screens in NYC at $5 CPM" create_campaign({ name: "NYC Retail Q1", budget_cpm: 5.0, daily_budget_usd: 100, venue_types: ["retail"], targeting: { geo: { city: "New York", state: "NY" } }, creative_url: "https://cdn.example.com/ad.mp4", start_date: "2026-03-01", end_date: "2026-03-31" })

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesCampaign name
end_dateNoCampaign end date (ISO 8601)
targetingNoAdditional targeting criteria
budget_cpmNoBid CPM in USD (default: 4.0)
screen_idsNoSpecific screen IDs to target (optional, overrides venue/geo targeting)
start_dateNoCampaign start date (ISO 8601)
venue_typesNoVenue types to target: transit, retail, outdoor, office, etc.
creative_urlNoURL to video/image creative asset
creative_typeNoCreative format
daily_budget_usdNoDaily budget cap in USD
total_budget_usdNoTotal campaign budget in USD
creative_durationNoDuration in seconds (default: 15)
Behavior4/5

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

With no annotations provided, the description carries the full behavioral disclosure burden. It goes beyond the schema by noting that campaigns start in 'draft' status and must be activated via update_campaign, and it lists the return fields (campaign_id, name, status, budget, screen_count, dates). This is meaningful behavioral context, though it doesn't cover auth requirements or potential errors.

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 well-structured with clear headings (summary, WHEN TO USE, RETURNS, example) and is front-loaded with the primary purpose. Every section earns its place, and the example is appropriately detailed without being bloated.

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

Completeness5/5

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

Given the tool's complexity (12 parameters, nested targeting objects) and the absence of an output schema or annotations, the description covers key aspects: the draft status lifecycle, return values, and a realistic invocation example. This provides sufficient context for an agent to select and invoke the tool correctly.

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

Parameters4/5

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

The schema already provides 100% description coverage for all 12 parameters, so the baseline is 3. The description adds a concrete example showing how parameters combine in practice (e.g., nested targeting with geo and venue_types), which clarifies correct usage beyond individual schema descriptions. This justifies a 4.

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

Purpose5/5

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

The description starts with a clear, specific verb and resource: 'Create a new advertising campaign targeting DOOH screens.' This distinguishes it from sibling tools like create_media_buy or create_experiment by explicitly naming the campaign object and the DOOH context.

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 'WHEN TO USE' section provides clear scenarios (setting up campaigns, targeting venues/locations/audiences, allocating budget) and explicitly points to update_campaign for a follow-up action. However, it does not explicitly state when not to use this tool or mention alternative tools like create_media_buy, so it earns 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.

create_experimentAInspect

Create an incrementality experiment for a campaign.

Sets up a geo-holdout, ghost ads, or propensity score matching experiment to causally measure DOOH advertising lift.

WHEN TO USE:

  • Setting up a new A/B test before or during a campaign

  • Defining treatment and control DMAs for geo-holdout tests

  • Configuring experiment parameters (holdout %, MDE, power)

RETURNS: The created experiment object with experiment_id, status, and all parameters.

EXAMPLE: create_experiment({ campaign_id: "camp_abc123", experiment_type: "geo_holdout", treatment_dmas: ["501", "504"], control_dmas: ["503", "505"], holdout_pct: 0.15, target_mde: 0.10 })

ParametersJSON Schema
NameRequiredDescriptionDefault
target_mdeNoMinimum detectable effect (relative, e.g. 0.10 = 10% lift). Default: 0.10
campaign_idYesCampaign identifier
holdout_pctNoFraction of devices to hold out (0.05-0.50). Default: 0.10
control_dmasNoDMA codes for control group (no ads)
target_alphaNoSignificance level (0.05 or 0.01). Default: 0.05
target_powerNoStatistical power (0.80 or 0.90). Default: 0.80
treatment_dmasNoDMA codes for treatment group (get ads)
experiment_typeYesExperiment type: geo_holdout (matched DMAs), ghost_ads (PSA control), psm (propensity score matching)
Behavior3/5

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

With no annotations, the description must carry behavioral disclosure. It states that the tool creates an experiment and returns an object, and explains the causal measurement intent. However, it does not mention side effects, whether the operation is synchronous, permission requirements, or reversibility. This is adequate but not rich.

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

Conciseness5/5

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

The description is front-loaded with the core purpose, followed by a focused WHEN TO USE section, RETURNS, and a compact EXAMPLE. Every section adds value with no redundancy or filler.

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

Completeness4/5

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

Given the tool's moderate complexity (8 params, no output schema, no annotations), the description covers purpose, usage context, return object, and a full example. It does not mention error conditions or prerequisites (e.g., campaign must exist), but overall it provides sufficient operational context.

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

Parameters4/5

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

Schema coverage is 100% with descriptive defaults and ranges. The description adds a concrete example showing how campaign_id, experiment_type, treatment_dmas, control_dmas, holdout_pct, and target_mde fit together. This goes beyond the schema and helps the agent construct a valid invocation.

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 states a specific action: 'Create an incrementality experiment for a campaign.' It then names the three experiment types (geo-holdout, ghost ads, PSM), clearly distinguishing this from sibling tools like create_campaign and get_incrementality. The verb+resource is specific and unambiguous.

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

Usage Guidelines4/5

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

A dedicated 'WHEN TO USE' section lists clear scenarios (setting up A/B test, defining treatment/control DMAs, configuring parameters). It does not explicitly mention when not to use it or name alternative tools, but the context is sufficient to guide selection.

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

create_media_buyAInspect

[AdCP Media Buy] Create a media buy (campaign) from an AdCP buy specification.

Creates a campaign that targets DOOH screens based on the provided specification. Returns a media_buy_id for tracking and a creative_deadline for asset submission.

WHEN TO USE:

  • Executing a programmatic DOOH buy via an AI agent

  • Creating campaigns from DSP trading desk agents

  • Automated media buying workflows

RETURNS:

  • media_buy_id: Unique identifier for this media buy

  • campaign_id: Internal campaign identifier

  • creative_deadline: Deadline for creative asset submission

  • targeting_summary: What was targeted

  • budget_summary: Budget allocation details

EXAMPLE: User: "Buy retail screens in NYC at $5 CPM for next week" create_media_buy({ name: "NYC Retail Week 12", buy_spec: { venue_types: ["retail"], geo: { city: "New York", state: "NY" }, budget: { daily_usd: 500, bid_cpm: 5.0 }, schedule: { start_date: "2026-03-16", end_date: "2026-03-22" } }, creative: { url: "https://cdn.example.com/creative.mp4", type: "video", duration_seconds: 15 }, buyer_ref: "agency-order-12345" })

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoMedia buy name
brandNoBrand reference
contextNo
buy_specNoBuy specification (legacy)
creativeNo
end_timeNoISO 8601 end time
packagesNoAdCP product packages to buy
buyer_refNoExternal reference ID from the buyer/agency
start_timeNoISO 8601 start time
total_budgetNo
Behavior3/5

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

With no annotations, the description is the sole source of behavioral transparency. It discloses return values (media_buy_id, campaign_id, creative_deadline, etc.) and the overall action, but it does not mention potential side effects (e.g., billing), validation rules, or the distinction between legacy buy_spec and the newer packages parameter. This is adequate but incomplete.

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

Conciseness4/5

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

The description is well-structured with clear sections: purpose, WHEN TO USE, RETURNS, and EXAMPLE. It is longer than necessary but the example is instructive and the structure makes it easy to scan. It could be trimmed slightly without loss, hence 4.

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

Completeness3/5

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

The tool has 10 parameters with nested objects, no output schema, and no annotations. The description compensates by listing return fields and providing an example, but it omits important context about the two distinct parameter paths (legacy buy_spec vs. packages) and does not clarify which parameters are needed for a valid request. This is a notable gap for a complex 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 70% and the description adds an illustrative example showing nested parameter usage for name, buy_spec, creative, and buyer_ref. However, it does not clarify the relationship between buy_spec (labeled 'legacy' in the schema) and packages, or explain total_budget and brand fields. The example adds value but leaves ambiguity around the two competing parameter structures.

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

Purpose5/5

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

The description clearly states the verb 'create' and the resource 'media buy (campaign)' with a specific target 'DOOH screens', distinguishing it from sibling tools like create_campaign. The phrase 'from an AdCP buy specification' adds specificity and aligns with the tool's name.

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

Usage Guidelines4/5

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

The 'WHEN TO USE' section explicitly lists three scenarios: programmatic DOOH buy via AI agent, DSP trading desk agents, and automated media buying workflows. This provides clear context, but it does not mention when not to use this tool or alternative tools, preventing a 5.

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

create_webhookAInspect

Create a new webhook subscription for real-time events.

WHEN TO USE:

  • Setting up real-time notifications for device events

  • Integrating with external systems

  • Monitoring ad playback and impressions

AVAILABLE EVENTS:

  • device.online: When a device comes online

  • device.offline: When a device goes offline

  • impression.recorded: When an impression is logged

  • campaign.allocated: When a campaign is allocated to a device

  • payout.processed: When a payout is processed

  • programmatic.ad_started: When a programmatic ad begins playing

  • programmatic.ad_ended: When a programmatic ad finishes playing

  • programmatic.no_fill: When a programmatic ad request gets no fill

  • programmatic.error: When a programmatic ad request errors

RETURNS:

  • webhook_id: Unique webhook identifier

  • url: The webhook endpoint URL

  • events: Subscribed events

  • secret: HMAC signing secret (if provided)

  • status: enabled/disabled

EXAMPLE: User: "Set up a webhook for device status changes" create_webhook({ url: "https://api.mycompany.com/trillboards/webhooks", events: ["device.online", "device.offline", "programmatic.error"], secret: "my-signing-secret-123" })

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesHTTPS endpoint URL to receive webhook events
eventsYesEvents to subscribe to
secretNoHMAC signing secret for verifying webhook authenticity (optional but recommended)
descriptionNoHuman-readable description for this webhook
Behavior3/5

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

With no annotations provided, the description carries the full burden. It discloses what the tool does (creates a webhook), lists available events, and describes the return payload including the HMAC secret. However, it omits important behavioral details such as authentication requirements, idempotency, whether duplicate webhooks are allowed, or error conditions that might occur. The addition of the 'RETURNS' section adds some context, but the description could be more transparent about side effects and prerequisites.

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 structured with clear headers (WHEN TO USE, AVAILABLE EVENTS, RETURNS, EXAMPLE) and the main purpose is front-loaded in the first sentence. It is longer than a simple one-liner but every section adds useful context. The example is valuable, and the return fields are clearly listed. Slight redundancy exists between the example and the parameter list, but overall it is well-organized.

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

Completeness4/5

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

Given no output schema, the description's 'RETURNS' section is critical and it provides a clear list of output fields. The tool has 4 parameters, and the description explains typical usage, events, and gives a concrete example. It does not cover error handling, rate limits, or edge cases, but for a create operation with good schema support, it is reasonably complete.

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

Parameters3/5

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

Schema description coverage is 100%, so each parameter already has a description in the schema. The tool description adds an example and repeats the secret explanation, but it does not significantly augment the schema. Moreover, the 'AVAILABLE EVENTS' list in the description is a partial subset of the enum values in the schema, which could mislead an agent into thinking only those 9 events are supported rather than all 26 in the enum. This is a minor detractor, keeping it at baseline rather than higher.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Create a new webhook subscription for real-time events.' The verb 'create' plus resource 'webhook subscription' is specific and distinguishes it from siblings like update_webhook, delete_webhook, and test_webhook. It also includes detailed event categories and return fields, leaving no ambiguity.

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

Usage Guidelines4/5

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

A dedicated 'WHEN TO USE' section explicitly lists relevant scenarios: 'Setting up real-time notifications for device events', 'Integrating with external systems', and 'Monitoring ad playback and impressions'. This provides clear context, but does not mention exclusions or alternatives (e.g., update_webhook for modifying existing webhooks), hence not a 5.

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

cross_signal_correlateAInspect

Discover correlations between different signal types. Example: relationship between ad fill rate and audience attention for QSR venues.

Queries the cross_signal_insights table for pre-computed correlations, or computes ad-hoc correlations from the observation_stream when no pre-computed insight exists.

WHEN TO USE:

  • Understanding relationships between different sensing signals

  • Finding which audience behaviors correlate with business outcomes

  • Discovering hidden patterns (e.g., crowd_energy vs purchase_intent)

  • Validating hypotheses about audience-venue-time relationships

RETURNS:

  • data: Correlation analysis with:

    • signal_a, signal_b: The two signals being correlated

    • correlation_r: Pearson correlation coefficient (-1 to +1)

    • correlation_r2: R-squared (proportion of variance explained)

    • p_value: Statistical significance

    • sample_count: Number of data points used

    • effect_size: Cohen's d effect size

    • confidence_interval_lower, confidence_interval_upper: 95% CI bounds

    • insight_summary: Human-readable interpretation

  • metadata: { computation_method, window, filters_applied }

  • suggested_next_queries: Related correlation analyses to explore

EXAMPLE: User: "Is there a correlation between audience attention and ad fill rate at QSR venues?" cross_signal_correlate({ signal_a: "attention_score", signal_b: "ad_fill_rate", filters: { venue_type: "restaurant_qsr" } })

User: "How does crowd energy relate to purchase intent during lunch hours?" cross_signal_correlate({ signal_a: "crowd_energy", signal_b: "purchase_intent", filters: { daypart: "lunch" } })

ParametersJSON Schema
NameRequiredDescriptionDefault
filtersNoOptional filters to narrow the correlation analysis
signal_aYesFirst signal to correlate (e.g., face_count, attention_score, crowd_energy, emotional_engagement, vehicle_count, noise_level, purchase_intent, ad_fill_rate)
signal_bYesSecond signal to correlate against signal_a
Behavior4/5

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

With no annotations provided, the description carries the full transparency burden. It discloses that the tool queries a pre-computed table or computes ad-hoc correlations, and details the exact return structure. It doesn't mention auth requirements or rate limits, but the read-only nature is strongly implied through 'queries' and 'computes.'

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 well-structured with clear sections: intro, WHEN TO USE, RETURNS, and EXAMPLE. Each section earns its place, and the front-loaded purpose ensures immediate understanding. No irrelevant details or redundant phrasing.

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 no output schema, yet the description thoroughly documents all return fields (correlation_r, p_value, metadata, etc.) and includes examples. It covers purpose, usage, return format, and parameter illustrations, making it complete for an agent to select and invoke the 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 baseline is 3. The description adds value with concrete example values for signal_a and signal_b (attention_score, ad_fill_rate) and shows how to use filters (venue_type, daypart). This goes beyond the schema's enum-like examples, warranting a 4.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Discover correlations between different signal types,' with a concrete example. It distinguishes itself from sibling tools by focusing on cross-signal correlation analysis, and the verb+resource pairing is specific and actionable.

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?

A dedicated 'WHEN TO USE' section enumerates four clear scenarios (understanding relationships, finding hidden patterns, etc.) and includes two full examples. However, it does not explicitly name alternative tools or state when not to use this tool, so it falls just short of a perfect score.

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

delete_deviceAInspect

Soft-delete a device from the partner account.

WHEN TO USE:

  • Removing a device that's been decommissioned

  • Cleaning up test devices

  • Removing a device that's been relocated to another partner

RETURNS:

  • success: Boolean indicating success

  • device_id: The deleted device ID

  • message: Confirmation message

EXAMPLE: User: "Remove the old lobby kiosk" delete_device({ device_id: "lobby-kiosk-old" })

ParametersJSON Schema
NameRequiredDescriptionDefault
device_idYesYour internal device identifier to delete
Behavior4/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It explicitly states 'Soft-delete', indicating non-permanent deletion, and lists return fields (success, device_id, message) plus an example. This adds valuable context beyond a simple 'delete' term, though it does not address permissions or recoverability nuances beyond the soft-delete label.

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

Conciseness5/5

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

The description is compact and well-structured with clear sections (definition, WHEN TO USE, RETURNS, EXAMPLE). The first sentence delivers the core purpose, and each subsequent section provides justifiable detail without redundancy. It is an ideal length for a single-parameter tool.

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

Completeness4/5

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

For a single-parameter delete tool with no annotations or output schema, the description covers the essential context: use scenarios, return values, and a usage example. It is sufficiently complete for an agent to select and invoke the tool, though it could briefly elaborate on the implications of soft-delete (e.g., whether the device remains visible in list_devices).

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

Parameters3/5

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

The schema fully describes device_id as 'Your internal device identifier to delete' with length constraints, so the baseline for parameter semantics is met. The description's example uses a concrete identifier but does not add new semantic detail beyond the schema. There is no ambiguity introduced.

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 'Soft-delete a device from the partner account', which clearly identifies the action and resource. The 'soft-delete' nuance adds specificity beyond just 'delete', and the WHEN TO USE list further clarifies its scope. This distinguishes it from other tools in the same domain, such as delete_webhook.

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 WHEN TO USE section provides three concrete scenarios (decommissioned devices, test cleanup, relocation) that give explicit context for when to invoke the tool. However, it does not mention when not to use it or cite alternatives like a hard-delete or re-registration tool, so it lacks full exclusion or alternative guidance.

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

delete_webhookAInspect

Delete a webhook subscription.

WHEN TO USE:

  • Removing a webhook that's no longer needed

  • Cleaning up old integrations

  • Removing test webhooks

RETURNS:

  • success: Boolean indicating success

  • webhook_id: The deleted webhook ID

  • message: Confirmation message

EXAMPLE: User: "Delete the old webhook" delete_webhook({ webhook_id: "wh_mmmpdbvj_8b7c5a59296d" })

ParametersJSON Schema
NameRequiredDescriptionDefault
webhook_idYesWebhook ID to delete (wh_xxx format or legacy ObjectId)
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It discloses the return shape (success, webhook_id, message) but does not mention irreversibility or consequences of deletion, which is a gap for a destructive operation.

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

Conciseness5/5

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

The description is well-structured with clear sections for purpose, usage, returns, and an example. Every sentence adds value, and the overall length is appropriate.

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 tool with one parameter and no output schema, the description covers purpose, usage, and returns adequately. It could add a warning about the permanent nature of deletion but is otherwise 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?

The input schema already documents the parameter (webhook_id) with a pattern and description (100% coverage). The description adds an example value, which is helpful but does not significantly go 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 clearly states 'Delete a webhook subscription' with a specific verb and resource. It is distinct from sibling tools like create_webhook or update_webhook, but does not explicitly name alternatives.

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?

A 'WHEN TO USE' section provides three specific scenarios, which is explicit guidance. However, it lacks exclusions or references to alternative tools, so it does not fully reach the top score.

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

describe_endpointAInspect

Describe a single API operation including its parameters, response shape, and error codes.

WHEN TO USE:

  • Inspecting an endpoint's full contract before calling it.

  • Discovering which error codes an endpoint can return and how to recover.

RETURNS:

  • operation: Full discovery record for the endpoint.

  • parameters: Raw OpenAPI parameter definitions.

  • request_body: Body schema (when applicable).

  • responses: Map of status code → description/schema.

  • linked_error_codes: Error catalog entries the endpoint can emit.

EXAMPLE: Agent: "How do I call the screen audience endpoint?" describe_endpoint({ path: "/v1/data/screens/{screenId}/audience", method: "GET" })

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesThe operation path (OpenAPI template form, e.g. "/v1/data/screens/{screenId}/audience").
methodYesHTTP method (case-insensitive).
Behavior3/5

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

With no annotations provided, the description carries the full burden. It reveals the return structure and the example implies a read-only operation, but it does not explicitly state that the tool has no side effects, nor does it mention any behavior around error handling for the tool call itself (e.g., invalid path). The RETURNS section provides useful output context, but deeper behavioral disclosure is missing.

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

Conciseness4/5

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

The description is well-structured with WHEN TO USE, RETURNS, and EXAMPLE sections. It is longer than the minimum, but each section contributes meaningful information. The example is particularly helpful without being redundant. It is not excessive, so a 4 is appropriate.

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 tool is simple (2 params), has no output schema, and no annotations. The description compensates well by listing the return fields, providing usage guidance, and including an illustrative example. It covers the essential aspects needed for an agent to select and invoke the tool correctly. A small gap is the lack of explicit statement about response status codes for the tool itself, but overall it is fairly complete.

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

Parameters4/5

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

Schema coverage is 100% and both parameters are described in the schema. The description adds value with a concrete example showing a real path with template syntax and method 'GET', which clarifies how to format the path. This goes beyond the schema's dry descriptions, earning a 4 rather than the baseline 3.

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

Purpose5/5

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

The first sentence clearly states 'Describe a single API operation including its parameters, response shape, and error codes.' This uses a specific verb ('describe') and resource ('API operation'), and the singular scope distinguishes it from sibling tools like list_endpoints. No ambiguity.

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

Usage Guidelines4/5

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

The 'WHEN TO USE' section explicitly lists two use cases: inspecting an endpoint's full contract before calling it, and discovering error codes and recovery. This gives clear context for when to use the tool. However, it does not explicitly mention alternatives or when not to use it, so it stops short of a 5.

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

device_heartbeatAInspect

Send a heartbeat signal from a device to report its status.

WHEN TO USE:

  • Regular device health monitoring (every 30-60 seconds)

  • Reporting current playback status

  • Reporting errors or issues

RETURNS:

  • success: Boolean indicating success

  • device_status: Current device status in system

  • next_heartbeat_seconds: Recommended interval for next heartbeat

EXAMPLE: User: "Send heartbeat for device P_abc123" device_heartbeat({ fingerprint: "P_abc123", status: "playing", current_ad_id: "507f1f77bcf86cd799439011", uptime_seconds: 3600 })

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoCurrent device status
fingerprintYesDevice fingerprint (e.g., "P_abc123")
current_ad_idNoCurrently playing ad ID (if status is "playing")
error_messageNoError message (if status is "error")
uptime_secondsNoDevice uptime in seconds
Behavior4/5

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

With no annotations provided, the description carries full responsibility for behavioral disclosure. It states the action, lists return parameters (success, device_status, next_heartbeat_seconds), and provides a concrete example. However, it does not address idempotency, prerequisites, or error handling, leaving some behavioral uncertainty.

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 efficiently structured with clear sections (WHEN TO USE, RETURNS, EXAMPLE) and a front-loaded purpose. Every section adds value, and the example is instructive without being redundant with the schema.

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

Completeness4/5

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

The description compensates for the lack of an output schema by explicitly listing return values and provides context on cadence and example usage. However, it omits potential prerequisites (e.g., device registration) or error conditions, making it slightly incomplete for a production context.

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

Parameters3/5

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

The input schema provides complete descriptions and an enum for status, so the description adds little beyond an illustrative example. The example demonstrates realistic parameter usage but does not introduce new semantic information; the schema already does the heavy lifting.

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

Purpose5/5

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

The description opens with 'Send a heartbeat signal from a device to report its status,' providing a specific verb and resource. It clearly distinguishes from sibling tools like register_device and get_device by framing it as a status-reporting action, and the WHEN TO USE section reinforces this purpose.

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

Usage Guidelines4/5

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

The 'WHEN TO USE' section explicitly lists three applicable contexts and recommends a cadence of every 30-60 seconds. While it does not name alternatives or exclusions, the guidance is clear and specific enough to direct appropriate use.

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

discover_inventoryAInspect

Discover available DOOH screens across the exchange network.

WHEN TO USE:

  • Finding screens by venue type (retail, transit, office, etc.)

  • Finding screens in a specific city/state or within a radius

  • Finding screens with a specific audience profile (high income, professionals, etc.)

  • Getting an overview of available inventory with live audience data

RETURNS:

  • screens: Array of screen objects with location, venue type, online status, and live audience data

  • total: Total matching screens

  • online_count: Number of currently online screens

Each screen includes real-time audience data when available:

  • face_count, attention_score, income_level, mood, lifestyle

  • purchase_intent, crowd_density, ad_receptivity, dwell_time

EXAMPLE: User: "Find retail screens in New York with high-income audience" discover_inventory({ venue_types: ["retail"], location: { city: "New York", state: "NY" }, audience_profile: { income: "high" }, limit: 20 })

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum screens to return (default: 50, max: 200)
locationNoLocation filter — use city/state OR lat/lng/radius_km
venue_typesNoFilter by venue types: transit, retail, outdoor, health_beauty, point_care, education, office, entertainment, government, financial, residential
audience_profileNoFilter screens by current audience characteristics
Behavior4/5

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

With no annotations, the description carries the transparency burden. It discloses that the tool returns screens, total count, online_count, and real-time audience data when available, including a caveat about data availability. This conveys the read-only nature and likely output shape, though it does not discuss potential side effects or limitations beyond data availability.

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

Conciseness4/5

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

The description is well-structured with clear sections: summary, when to use, returns, and example. It is somewhat long due to the detailed RETURNS list, but every section contributes information useful for tool selection and invocation. The main purpose 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?

Given the four nested parameters and no output schema, the description sufficiently covers the tool's behavior, return structure, and usage scenarios. It does not mention error handling or rate limits, but for a discovery query tool, the provided details are strong. The example further enhances completeness.

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

Parameters4/5

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

The schema already covers 100% of parameters, so the baseline is 3. The description adds value with a concrete example showing how to combine venue_types, location, audience_profile, and limit, plus a RETURNS section that clarifies how parameters affect the response. This goes beyond the schema's per-field descriptions.

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

Purpose4/5

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

The description clearly states the tool's function: discovering available DOOH screens across the exchange network, with specific use cases for filtering by venue, location, and audience. It does not explicitly differentiate from siblings like get_live_audience or semantic_audience_search, but the verb 'discover' and resource are specific enough to distinguish it.

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

Usage Guidelines4/5

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

The 'WHEN TO USE' section explicitly lists three key scenarios: finding screens by venue type, location, or audience profile, plus getting an overview. This gives clear context for when to use the tool, but it does not state when not to use it or mention alternatives like get_live_audience, so it stops short of a 5.

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

export_cohortAInspect

Export exposed audience cohort to a DSP for retargeting.

Pushes MAID hashes from the campaign's exposed cohort to the specified DSP (The Trade Desk, DV360, or Meta). Creates or reuses a DSP segment.

WHEN TO USE:

  • Activating DOOH-exposed audiences for retargeting on digital channels

  • Pushing cohorts to TTD, DV360, or Meta Custom Audiences

  • Measuring cross-channel retargeting lift

RETURNS:

  • status: 'synced', 'no_cohort', 'credentials_missing', or 'empty_cohort'

  • destination: the DSP name

  • segmentId: internal segment ID

  • externalSegmentId: DSP-side segment ID

  • maidCount: number of MAIDs uploaded

  • accepted: number accepted by DSP

Supported destinations: ttd, dv360, meta, cadent, mediaocean

EXAMPLE: export_cohort({ campaign_id: "camp_abc123", destination: "ttd" })

ParametersJSON Schema
NameRequiredDescriptionDefault
campaign_idYesCampaign identifier
destinationYesDSP destination: ttd (The Trade Desk), dv360 (Google DV360), meta (Meta/Facebook), cadent, mediaocean
Behavior4/5

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

With no annotations, the description carries the full burden. It discloses the side effect of creating or reusing DSP segments, the data pushed (MAID hashes), and possible status outcomes ('no_cohort', 'credentials_missing', 'empty_cohort'). It does not cover rate limits or authentication specifics, but the disclosed behavior is above average.

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 well-structured with clear paragraphs, a WHEN TO USE section, a RETURNS list, supported destinations, and an example. Every section adds value without redundancy; the front-loaded purpose sentence immediately communicates the tool's function.

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

Completeness5/5

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

Despite having no output schema, the description explicitly lists all returned fields and their meaning, covers supported destinations, and provides a usage example. The tool has only two parameters, and the description fully covers its behavior, use cases, and outcomes, making it complete for an agent to select and invoke correctly.

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

Parameters3/5

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

The input schema already provides full coverage with descriptions for both parameters, including an enum for destination with DSP names. The description adds an example invocation and clarifies destination aliases (e.g., 'ttd (The Trade Desk)'), but most semantic value is already in the schema, so a baseline of 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool exports an exposed audience cohort to a DSP for retargeting, specifying the exact mechanism (pushes MAID hashes) and supported destinations. It distinguishes itself from sibling tools like export_dataset by focusing on DSP cohort activation for retargeting.

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 includes a dedicated 'WHEN TO USE' section with concrete scenarios (e.g., DOOH retargeting, pushing to TTD/DV360/Meta, measuring lift). It does not explicitly mention when not to use the tool or name alternative tools, but the provided use cases are clear and actionable.

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

export_datasetAInspect

Export observation data as a structured dataset. Supports filtering by time, geography, venue type, and observation family. Applies k-anonymity (k=5) to protect individual privacy.

Queries the relevant table based on the selected dataset type, applies filters, enforces k-anonymity by suppressing groups with fewer than 5 observations, and returns structured data.

WHEN TO USE:

  • Exporting audience data for external analysis

  • Building datasets for machine learning or reporting

  • Getting structured vehicle or commerce data for a specific time/place

  • Creating cross-signal datasets for correlation analysis

RETURNS:

  • data: Array of dataset rows (schema varies by dataset type)

  • metadata: { row_count, k_anonymity_applied, export_id, dataset, filters_applied, time_range }

  • suggested_next_queries: Related exports or analyses

Dataset types:

  • observations: Raw observation stream data (all families)

  • audience: Audience-specific data (face_count, demographics, attention, emotion)

  • vehicle: Vehicle counting and classification data

  • cross_signal: Pre-computed cross-signal correlation insights

EXAMPLE: User: "Export audience data from retail venues last week" export_dataset({ dataset: "audience", filters: { time_range: { start: "2026-03-09", end: "2026-03-16" }, venue_type: ["retail"] }, format: "json" })

User: "Get vehicle data near geohash 9q8yy" export_dataset({ dataset: "vehicle", filters: { time_range: { start: "2026-03-15", end: "2026-03-16" }, geo: "9q8yy" } })

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNoExport format (default: json). Currently only JSON is supported.
datasetYesType of dataset to export
filtersYesFilters to apply to the export
Behavior4/5

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

With no annotations available, the description carries the full burden and does well by disclosing k-anonymity enforcement (suppressing groups under 5), the query process, and the return structure. It does not mention potential rate limits or permission requirements, but the provided behavioral details are substantial and valuable.

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

Conciseness4/5

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

The description is well-structured with clear sections and front-loaded purpose. It is somewhat long, but every section (filters, when-to-use, returns, dataset types, examples) adds necessary value. No filler, though slightly more verbose than the absolute minimum.

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 there is no output schema and no annotations, the description fully compensates by explaining return fields (data, metadata, suggested_next_queries), dataset type semantics, filtering capabilities, and k-anonymity behavior. It also provides examples for common use cases, making it complete and self-contained.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description adds meaningful context beyond the schema by explaining each dataset type, giving filter usage examples, and noting that time_range is required for certain dataset types. This enriches parameter understanding and justifies a 4.

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

Purpose5/5

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

The description clearly states the tool exports observation data as a structured dataset, with a specific verb and resource. It also lists filtering dimensions and dataset types, effectively distinguishing it from sibling tools like query_observations or get_analytics.

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?

A dedicated 'WHEN TO USE' section provides explicit contexts like exporting audience data for external analysis, building ML datasets, or creating cross-signal datasets. However, it does not explicitly name alternative tools or state when NOT to use this tool, so it falls short of a 5.

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

find_similar_momentsAInspect

Find historically similar audience moments across the screen network using embedding similarity search. Input a natural-language description of the target moment.

Moment embeddings are 768-D vectors generated from multi-modal observation data (visual, audio, environmental, social) via the MomentEmbeddingService. This tool embeds your query text and finds the closest real-world moments via approximate nearest-neighbour (ANN) cosine similarity over a Lance IVF_PQ index.

CONSISTENCY: results are APPROXIMATE and EVENTUALLY CONSISTENT.

  • Approximate: retrieval is ANN, not an exhaustive scan (measured recall ~0.96 against exact KNN), so an identical query may omit a borderline match.

  • Eventually consistent: the index is served from a replicated pool whose replicas refresh independently, so for up to 5 minutes after new moments are published, two identical calls may return slightly different result sets. The difference is confined to the VISIBILITY of newly-published moments; the relative ranking of already-visible ones does not change. Do not use this tool where a repeatable, exhaustive result set is required.

WHEN TO USE:

  • Searching for historical moments similar to a target scenario

  • Finding "moments like this one" across different venues/times

  • Discovering when similar audience compositions or behaviors occurred

  • Planning ad placements based on past similar contexts

RETURNS:

  • data: Array of matching observations with similarity scores

    • observation_id, observed_at, venue_type, device_id, screen_mongo_id

    • payload: full observation data

    • evidence_grade: quality of observation

    • similarity: cosine similarity score (0-1, higher = more similar)

  • metadata: { result_count, embedding_model, min_similarity_threshold }

  • suggested_next_queries: Follow-up queries

EXAMPLE: User: "Find moments with high engagement in evening restaurants with families" find_similar_moments({ query: "evening restaurant venue with families present, high emotional engagement and attention" })

User: "When did we see young adults highly engaged at transit screens?" find_similar_moments({ query: "transit venue morning commute young adults high attention" })

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum results to return. Default: 10, max: 200.
queryYesNatural-language description of the target moment. Be descriptive about venue, time, audience, behavior, and conditions.
venue_typeNoFilter results to a specific venue type. Optional.
min_similarityNoMinimum cosine similarity threshold (0-1). Default: 0.7. Lower values return more but less relevant results.
Behavior5/5

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

With no annotations provided, the description carries full burden. It thoroughly discloses the approximate nature (ANN, recall ~0.96), eventual consistency (replicated pool, up to 5 minutes visibility differences), and what remains stable (relative ranking of already-visible moments). This is exemplary 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.

Conciseness5/5

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

Although relatively long, the description is well-structured with clear sections (intro, background, CONSISTENCY, WHEN TO USE, RETURNS, EXAMPLE). Every section earns its place, providing necessary technical context without redundancy. Front-loading the main purpose makes it immediately usable.

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 complexity of embedding-based search with ANN and eventual consistency, and the absence of an output schema, the description fully covers the return format (data, metadata, suggested_next_queries), the consistency caveats, and practical usage examples. It is complete enough for an agent to invoke the tool correctly and interpret results.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description adds value with examples showing how to phrase the query for different scenarios, which illustrates query semantics beyond the schema. However, it does not elaborate on limit or venue_type beyond what the schema already states.

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

Purpose5/5

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

Description begins with a specific verb+resource+method: 'Find historically similar audience moments across the screen network using embedding similarity search.' It clearly distinguishes the tool from exact query tools (like query_observations) and other semantic search tools by emphasizing the embedding-based ANN approach.

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

Usage Guidelines5/5

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

A dedicated 'WHEN TO USE' section lists four concrete scenarios, and an explicit exclusion states: 'Do not use this tool where a repeatable, exhaustive result set is required.' This gives clear guidance on when to choose this tool over alternatives.

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

get_adcp_capabilitiesAInspect

[AdCP] Get the seller agent's AdCP capabilities and supported protocols.

Returns the full capability declaration for this AdCP DOOH seller agent. This tool does NOT require authentication.

WHEN TO USE:

  • Discovering what protocols the seller agent supports (Signals, Media Buy)

  • Understanding available audience signals and data methodology

  • Getting MCP endpoint and discovery URLs

RETURNS:

  • supported_protocols: ['signals', 'media_buy']

  • inventory: DOOH format details, network size

  • audience_data: signal list, methodology, refresh rate

  • pricing: model, currency, floor CPM

  • discovery: well_known_url, mcp_endpoint

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Behavior4/5

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

With no annotations, the description carries the burden of behavioral disclosure. It states explicitly that it does NOT require authentication, and enumerates the exact return fields including protocols, inventory, audience data, pricing, and discovery URLs. This gives a clear picture of what to expect, though it doesn't address potential side effects or errors.

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 organized with clear sections and each sentence serves a purpose: the opening defines the tool, the authentication note sets expectations, WHEN TO USE provides context, and RETURNS lists the output. It is efficient without unnecessary fluff.

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

Completeness5/5

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

For a zero-parameter capability discovery tool, the description is comprehensive: it states the purpose, usage context, authentication requirements, and full return structure. Since there is no output schema, the explicit return field list is crucial and well provided.

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

Parameters4/5

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

The input schema has zero parameters (schema coverage 100%), so the baseline is 4. The description adds value by detailing the output structure, which compensates for the lack of an output schema.

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

Purpose5/5

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

The description uses a specific verb 'Get' and identifies the resource as 'seller agent's AdCP capabilities and supported protocols'. It clearly distinguishes itself from sibling tools like get_signals or get_pricing by focusing on capability declaration.

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?

A dedicated 'WHEN TO USE' section lists three concrete use cases: discovering protocols, understanding audience signals/methodology, and getting MCP endpoints. It also notes that authentication is not required, but it does not explicitly mention when not to use or alternatives.

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

get_analyticsAInspect

Get analytics data for the partner account.

WHEN TO USE:

  • Viewing overall performance metrics

  • Analyzing device performance

  • Generating reports on impressions and earnings

  • Comparing performance over time periods

RETURNS:

  • summary: Overall stats (impressions, earnings, active_devices)

  • time_series: Data points over time

  • top_devices: Best performing devices

  • breakdown: Data grouped by requested dimension

EXAMPLE: User: "Show me last week's analytics by device" get_analytics({ start_date: "2026-01-01", end_date: "2026-01-07", group_by: "device" })

User: "Get monthly performance breakdown" get_analytics({ start_date: "2025-12-01", end_date: "2025-12-31", group_by: "day" })

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateNoEnd date in YYYY-MM-DD format (optional, defaults to today)
group_byNoHow to group the analytics data
device_idNoFilter to a specific device (optional)
start_dateNoStart date in YYYY-MM-DD format (optional, defaults to 30 days ago)
Behavior4/5

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

With no annotations provided, the description carries the full burden. It discloses the return structure (summary, time_series, top_devices, breakdown) and includes two concrete examples that illustrate behavior. It does not mention rate limits or auth, but for a read-only analytics tool the return format and examples provide substantial transparency.

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

Conciseness5/5

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

The description is well-structured with clear headers: summary, WHEN TO USE, RETURNS, and EXAMPLES. The opening line is a crisp summary, and every section contributes meaning without unnecessary verbosity. The two examples are illustrative but not redundant.

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

Completeness5/5

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

For a tool with no output schema and four optional parameters, the description is notably complete. It explains the purpose, when to use, what to expect in the response (four categories), and gives two realistic usage examples. It does not explain edge cases like overlapping dates, but such details are not essential for a partner analytics 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 baseline is 3. The description adds value beyond the schema by showing realistic parameter combinations in examples (e.g., start_date/end_date with group_by 'device' and 'day'). It also clarifies that 'breakdown' corresponds to the group_by dimension, reinforcing the schema's enum.

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

Purpose5/5

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

The description opens with 'Get analytics data for the partner account,' which is a clear verb+resource pairing. The 'WHEN TO USE' section enumerates specific use cases (overall performance metrics, device performance, reports on impressions/earnings, comparing over time) that distinguish this general analytics tool from more specialized siblings like get_network_stats or get_roas.

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 'WHEN TO USE' section provides explicit context: viewing performance metrics, analyzing devices, generating reports, comparing time periods. However, it does not explicitly state when NOT to use this tool or name alternatives, so it stops short of a 5.

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

get_attention_metricsAInspect

Get edge AI attention metrics for a campaign (FEIN-powered).

This is what makes DOOH attribution better than digital: Trillboards MEASURES viewability via FEIN edge AI instead of estimating it.

WHEN TO USE:

  • Measuring actual human attention to ads (not just impressions)

  • Comparing attention-adjusted CPM (aCPM) vs standard CPM

  • Getting face count, dwell time, and emotion engagement data

RETURNS:

  • impressions: total, uniqueDevices

  • attention: avgScore (0-1), medianScore, p90Score, avgDwellSeconds, avgFaceCount, qualifiedPct

  • economics: standardCpm, attentionCpm (aCPM), costPerAttentiveReach

  • emotion: avgEngagement (0-1), positiveEmotionPct

aCPM = total_media_cost / (SUM(attention_score * face_count) / 1000)

ParametersJSON Schema
NameRequiredDescriptionDefault
campaign_idYesCampaign identifier
Behavior4/5

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

With no annotations, the description carries the burden of explaining behavior. It discloses output structure, defines key metrics, and even provides the aCPM formula. It implies read-only behavior via 'Get' but does not explicitly state side-effect-free operation or any rate limits, though these are less critical for a data retrieval tool.

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

Conciseness4/5

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

The description uses clear section headers (WHEN TO USE, RETURNS, formula) and is well-organized. The opening includes a slightly promotional sentence about FEIN edge AI, which adds some fluff but is not waste; overall it is efficient and scannable.

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 a single parameter and no output schema, the description is thorough: it explains the return structure with nested fields, defines the units (0-1 scores, seconds), and provides the aCPM formula. This is complete enough for an agent to understand what to expect.

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

Parameters3/5

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

Schema coverage is 100% for the single parameter campaign_id, with a basic description 'Campaign identifier'. The tool description adds no extra semantic detail about the parameter beyond what the schema already provides, so the baseline of 3 applies.

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

Purpose5/5

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

The description clearly states the action ('Get edge AI attention metrics for a campaign') and identifies the unique FEIN-powered aspect. It distinguishes itself from siblings like get_campaign_performance or get_social_attention by specifying the type of attention metrics and the FEIN technology.

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 WHEN TO USE section provides clear contexts such as measuring actual attention, comparing aCPM vs CPM, and getting face/dwell/emotion data. However, it does not explicitly mention when not to use this tool or name alternatives, so it stops short of full exclusions.

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

get_attribution_timeseriesAInspect

Get daily attribution timeseries for a campaign.

WHEN TO USE:

  • Tracking attribution trends over time

  • Identifying which days had the strongest lift

  • Building attribution dashboards with daily granularity

RETURNS: Array of daily data points, each with:

  • date, uniqueDevices, totalExposures, avgFrequency

  • exposedVisitors, controlVisitors, liftPct, incrementalVisits

  • costPerVisit, totalMediaCost, isSignificant

EXAMPLE: get_attribution_timeseries({ campaign_id: "camp_abc123", start_date: "2026-03-01", end_date: "2026-03-10" })

ParametersJSON Schema
NameRequiredDescriptionDefault
end_dateNoEnd date (YYYY-MM-DD). Optional, defaults to today.
start_dateNoStart date (YYYY-MM-DD). Optional, defaults to campaign start.
campaign_idYesCampaign identifier
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It does not mention that this is a read-only operation, potential permissions required, rate limits, or edge cases like missing campaigns. The 'RETURNS' section describes output format but not behavioral traits, leaving a transparency gap.

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

Conciseness5/5

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

The description is well-structured with a clear main sentence, 'WHEN TO USE' bullets, 'RETURNS' field list, and a practical example. It is concise, front-loaded, and every section adds value without unnecessary fluff.

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

Completeness4/5

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

Since there is no output schema, the description compensates by listing all return fields (date, uniqueDevices, liftPct, etc.) and providing an example. It covers the essential context for a daily timeseries tool, though it omits minor details like default date ranges (already in schema) or significance interpretation. Overall, it is adequately complete for this complexity.

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

Parameters3/5

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

Schema description coverage is 100%, so the parameters (campaign_id, start_date, end_date) are already well-documented. The description adds a concrete example showing parameter usage, but it does not add meaning beyond the schema, such as default behaviors or constraints. This meets the baseline but does not exceed it.

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

Purpose5/5

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

The description opens with 'Get daily attribution timeseries for a campaign,' which clearly states the verb (get), resource (attribution timeseries), and scope (daily, for a campaign). This is specific enough to distinguish from sibling tools like get_campaign_attribution or get_multi_touch_attribution, and the 'RETURNS' section reinforces the exact resource.

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

Usage Guidelines4/5

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

The 'WHEN TO USE' section provides clear use cases: tracking attribution trends over time, identifying strongest lift days, and building dashboards with daily granularity. However, it does not explicitly mention when not to use this tool or name alternative tools, so it falls short of the full 'when/when-not/alternatives' criterion.

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

get_audience_forecastAInspect

Predict what the audience will look like at a screen at a specific time.

WHEN TO USE:

  • Planning campaigns for specific time slots

  • Estimating audience composition before buying

  • Comparing audience at different times of day

Uses historical audience data to predict typical audience patterns.

RETURNS:

  • predicted_face_count: Expected number of viewers

  • predicted_attention: Expected attention score

  • typical_income: Most common income level at that time

  • typical_lifestyle: Most common lifestyle segment at that time

  • confidence: Prediction confidence (0-1, based on sample count)

  • sample_count: Number of historical data points used

EXAMPLE: User: "What's the typical audience at this screen on Monday at 3pm?" get_audience_forecast({ screen_id: "507f1f77bcf86cd799439011", hour: 15, day: 1, lookback_days: 30 })

ParametersJSON Schema
NameRequiredDescriptionDefault
dayYesDay of week (0=Sunday, 1=Monday, ..., 6=Saturday)
hourYesHour of day (0-23)
screen_idYesScreen ID to forecast
lookback_daysNoDays of historical data to use (default: 30)
Behavior4/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It explains that the tool uses historical audience data to predict typical patterns, and it discloses details about confidence based on sample count and the meaning of sample_count. This gives the agent useful context about how the prediction works and its reliability.

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

Conciseness4/5

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

The description is well-structured with clear sections (purpose, when to use, returns, example). It is longer than minimal, but every section adds value, including the example that ties parameters to a realistic use case. No unnecessary 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?

Given the lack of an output schema, the description thoroughly explains the return fields (predicted_face_count, predicted_attention, typical_income, typical_lifestyle, confidence, sample_count). Combined with the example and the schema's parameter coverage, the description gives the agent everything needed to invoke the tool correctly and interpret results.

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

Parameters3/5

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

The schema already documents all four parameters with clear descriptions (day, hour, screen_id, lookback_days) and 100% coverage. The description adds no additional parameter meaning beyond a concrete example, which is helpful but not beyond the schema's baseline.

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

Purpose5/5

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

The description clearly states the tool's specific function: 'Predict what the audience will look like at a screen at a specific time.' It uses a precise verb (predict) and resource (audience at a screen/time), and the mention of historical data distinguishes it from related tools like get_live_audience.

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 'WHEN TO USE' section provides clear use cases: planning campaigns, estimating audience composition, and comparing times of day. It gives explicit context for when to use the tool, though it does not mention when not to use it or directly name alternative tools.

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

get_audience_lookalikeAInspect

Find screens with similar audience profiles using pgvector similarity.

Uses 64-dimensional audience vectors with HNSW cosine similarity index to find screens whose audience demographics, attention, and behavioral patterns match a target screen.

WHEN TO USE:

  • Expanding campaign reach to screens with similar audiences

  • Finding new inventory that matches a high-performing screen

  • Building lookalike audience segments for targeting

RETURNS: Array of similar screens ranked by cosine similarity, each with:

  • screen_id, similarity (0-1), metadata (face_count, attention, income, lifestyle), last_seen

EXAMPLE: get_audience_lookalike({ screen_id: "scr_abc123", limit: 10, min_similarity: 0.8 })

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results (default: 20, max: 100)
countryNoFilter by country (optional)
screen_idYesSource screen ID to find lookalikes for
venue_typeNoFilter by venue type (optional)
min_similarityNoMinimum cosine similarity threshold 0-1 (default: 0.7)
Behavior3/5

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

With no annotations, the description carries the burden of behavioral disclosure. It explains the underlying algorithm (pgvector, HNSW cosine similarity) and return format, but it does not disclose edge-case behavior, error handling, or side effects. Since this is a read-only lookup, it is acceptable but not fully transparent.

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

Conciseness5/5

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

The description is well-structured with clear sections for purpose, technical details, usage scenarios, return fields, and an example. Every sentence adds value, and the key functionality is front-loaded in the first line.

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

Completeness4/5

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

The description is quite complete for a read tool with 5 parameters and no output schema. It explains the return structure, similarity semantics, and gives a usage example. It lacks detail on filtering behavior for country/venue_type, but the schema descriptions cover that.

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

Parameters3/5

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

The input schema already covers 100% of parameters with descriptions, so the baseline is 3. The description adds an example that demonstrates a typical invocation, but it does not enrich parameter semantics beyond what the schema provides.

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

Purpose5/5

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

The description clearly states the tool's function: finding screens with similar audience profiles using pgvector similarity. It distinguishes itself from sibling tools like semantic_audience_search by focusing on lookalike audience matching for campaign expansion and targeting.

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?

A dedicated 'WHEN TO USE' section provides clear scenarios (expanding reach, finding similar inventory, building lookalike segments). It does not explicitly mention when not to use or name alternative tools, but the guidance is concrete and actionable.

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

get_billing_statusAInspect

Check current billing status including whether billing is set up, credit balance, Stripe customer ID, and payment method status. Use this to determine if billing setup is needed before making paid API calls.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Behavior4/5

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

With no annotations provided, the description carries the burden of conveying behavior. It clearly indicates a read-only status check by using 'Check' and lists the specific data points returned. It does not mention side effects (none expected) or auth requirements, but for a simple status query the transparency is adequate.

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

Conciseness5/5

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

The description is two sentences, front-loaded with the core function and followed by usage guidance. Every word earns its place; no filler or redundant information.

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

Completeness5/5

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

For a zero-parameter tool with no output schema, the description is adequately complete. It states what the tool does, what information it provides, and when to use it. No critical gaps are apparent for an agent to correctly select and invoke the tool.

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

Parameters4/5

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

The tool has 0 parameters, so the schema provides no parameter info. The description goes beyond the schema by detailing what the tool returns (billing setup, credit balance, Stripe customer ID, payment method status), giving the agent meaningful context about the output despite no input parameters.

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

Purpose5/5

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

The description clearly states the tool's function: 'Check current billing status including whether billing is set up, credit balance, Stripe customer ID, and payment method status.' It uses a specific verb ('Check') and resource ('billing status'), and distinguishes itself from sibling tools like setup_billing and purchase_credits by focusing on querying status rather than modifying it.

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

Usage Guidelines4/5

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

The description provides explicit when-to-use guidance: 'Use this to determine if billing setup is needed before making paid API calls.' It implies the context and purpose, though it does not explicitly name alternatives (e.g., setup_billing). This is clear but falls short of fully explicit alternative specification.

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

get_campaign_attributionAInspect

Get comprehensive attribution summary for a DOOH campaign.

WHEN TO USE:

  • Measuring overall campaign effectiveness (reach, footfall, sales lift)

  • Getting a high-level view of campaign attribution metrics

  • Checking statistical significance of attribution results

RETURNS:

  • reach: uniqueDevices, totalImpressions, avgFrequency

  • footfall: exposedVisitors, controlVisitors, incrementalLiftPct, incrementalVisits

  • cost: totalMediaCost, costPerUniqueReach, costPerIncrementalVisit

  • quality: avgMatchConfidence, statisticalSignificance, isSignificant

  • dataFreshness: latestOutcomeAt, provisionalCount, finalizedCount

Returns null if no attribution data exists for the campaign.

ParametersJSON Schema
NameRequiredDescriptionDefault
campaign_idYesCampaign identifier (UUID or string ID from create_campaign)
Behavior4/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It explains the return structure in detail and explicitly discloses the null case ('Returns null if no attribution data exists for the campaign'), which is a valuable behavioral trait. It also hints at data freshness with provisional and finalized counts, adding transparency. However, it does not explicitly state whether the operation is read-only or safe, though 'get' implies it. This is a minor gap given the otherwise thorough description.

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 well-structured with clear sections: a one-line purpose, 'WHEN TO USE' bullet points, and a structured 'RETURNS' list. It front-loads the purpose and uses concise, scannable formatting. Every section earns its place, providing necessary details (especially return fields) without unnecessary fluff.

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

Completeness5/5

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

Given the lack of an output schema and annotations, the description provides complete context for using the tool. It fully explains the return object's structure (reach, footfall, cost, quality, dataFreshness) and the null-case behavior. It also covers usage scenarios, making the tool self-sufficient for an agent to understand its purpose, invocation, and interpretation of results.

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

Parameters3/5

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

The schema covers the single parameter campaign_id with a clear description ('Campaign identifier (UUID or string ID from create_campaign)'). Since schema coverage is 100%, the baseline is 3. The tool description does not add extra semantics about the parameter beyond what the schema provides, though it does contextualize that this is for a DOOH campaign. Overall, the description adds minimal value over the schema, so a baseline score is appropriate.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Get comprehensive attribution summary for a DOOH campaign.' It uses a specific verb (Get) and resource (attribution summary for a DOOH campaign), which distinguishes it from sibling tools like get_attribution_timeseries (time-series data) and get_creative_attribution (creative-level data). The detailed RETURNS section further reinforces the tool's specific output scope.

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

Usage Guidelines4/5

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

The description provides a clear 'WHEN TO USE' section with three practical scenarios: measuring campaign effectiveness, getting a high-level view, and checking statistical significance. This gives strong contextual guidance for when to invoke the tool. However, it does not explicitly state when NOT to use it or mention alternative tools for specific cases (e.g., get_attribution_timeseries for time-series data), so it lacks exclusions/alternatives.

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

get_campaign_heatmapAInspect

Get geographic exposure heatmap data for a campaign.

Returns lat/lng clusters with exposure counts and device reach, useful for visualizing where ads were shown on a map.

WHEN TO USE:

  • Visualizing campaign geographic coverage

  • Identifying hotspots of ad exposure

  • Analyzing geographic distribution of attributed foot traffic

RETURNS: Array of geographic clusters (max 500), each with:

  • lat, lng (rounded to 3 decimal places)

  • uniqueDevices, totalExposures

  • avgConfidence (match confidence score)

ParametersJSON Schema
NameRequiredDescriptionDefault
campaign_idYesCampaign identifier
Behavior3/5

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

No annotations are present, so the description must carry the full burden. It discloses return format details, including max 500 clusters, lat/lng rounding to 3 decimals, and specific fields like uniqueDevices and avgConfidence. However, it does not explicitly state read-only behavior, permissions, or data freshness, leaving a moderate gap.

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

Conciseness4/5

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

The description is moderately sized but well-structured with clear sections: purpose, when-to-use, and return details. Each section earns its place, though the phrase 'exposure' repeats several times and could be tightened 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?

With only one parameter and no output schema, the description thoroughly covers return fields, limits, and rounding behavior. The use cases add practical context. For a simple data retrieval tool, this is complete and self-sufficient.

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

Parameters3/5

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

The input schema already provides 100% coverage for the single campaign_id parameter with a description ('Campaign identifier'). The tool description adds no additional parameter semantics, so the baseline of 3 applies.

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

Purpose5/5

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

The description opens with 'Get geographic exposure heatmap data for a campaign', using a specific verb and resource that clearly differentiates it from sibling tools like get_campaign_performance or get_analytics. The map visualization context further clarifies intent.

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?

A dedicated 'WHEN TO USE' section provides concrete use cases such as 'Visualizing campaign geographic coverage' and 'Identifying hotspots of ad exposure'. It does not explicitly mention when not to use or name alternatives, but the context is clear enough for a straightforward GET tool.

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

get_campaign_performanceAInspect

Get detailed performance metrics for a campaign.

WHEN TO USE:

  • Monitoring active campaign performance

  • Reviewing completed campaign results

  • Getting per-screen impression breakdowns

RETURNS:

  • campaign_id, name, status, budget, dates

  • performance: impressions, spend_estimate_usd, avg_cpm, unique_screens, avg_latency_ms

  • screen_breakdown: per-screen impressions and CPM

EXAMPLE: User: "How is my NYC retail campaign performing?" get_campaign_performance({ campaign_id: "550e8400-e29b-41d4-a716-446655440000" })

ParametersJSON Schema
NameRequiredDescriptionDefault
campaign_idYesCampaign UUID returned from create_campaign
Behavior4/5

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

No annotations are provided, so the description carries the full burden. It details the return structure (campaign_id, performance metrics, screen_breakdown) and includes an example, which clarifies the data returned. However, it does not explicitly state whether the operation is read-only or discuss side effects, though 'Get' implies read-only.

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

Conciseness5/5

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

The description is highly structured with clear sections (WHEN TO USE, RETURNS, EXAMPLE). Every sentence serves a purpose, and the content is front-loaded with the primary purpose statement.

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 single-parameter tool with no output schema, the description compensates by listing all return fields and providing a realistic example. It covers the main use cases and gives enough context for an agent to invoke the tool correctly. No gaps identified.

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

Parameters3/5

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

The input schema already documents campaign_id as a required Campaign UUID with 100% coverage. The description reinforces this with an example parameter but adds no additional semantic depth beyond what the schema provides, matching the baseline of 3.

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

Purpose5/5

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

The description clearly states 'Get detailed performance metrics for a campaign,' specifying a specific verb and resource. It distinguishes from sibling tools by focusing on campaign performance metrics with per-screen breakdowns, which is unique among the many get_* tools.

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

Usage Guidelines5/5

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

The WHEN TO USE section explicitly lists three use cases: monitoring active campaigns, reviewing completed campaigns, and getting per-screen impression breakdowns. This provides clear guidance on when to select this tool over alternatives.

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

get_content_performanceAInspect

Get performance metrics for a video across the Trillboards DOOH network.

WHEN TO USE:

  • Checking how a specific video performs across screens (plays, attention, audience size)

  • Analyzing which venue types and dayparts a video resonates best in

  • Finding the top-performing screens for a piece of content

  • Comparing content performance over different time windows

RETURNS:

  • videoId, title, totalPlays, uniqueScreens

  • avgAttention (0-1), avgAudienceSize, avgDwellMs

  • venueDistribution: Array of { venue_type, plays }

  • daypartDistribution: Array of { daypart, plays }

  • topScreens: Top 10 screens by play count with attention scores

  • period: { start, end } date range

EXAMPLE: User: "How is video dQw4w9WgXcQ performing on retail screens?" get_content_performance({ video_id: "dQw4w9WgXcQ", venue_type: "retail", days: 30 })

User: "Show me the last 7 days of performance for this video" get_content_performance({ video_id: "abc123xyz", days: 7 })

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoLookback window in days (default: 30, max: 90)
video_idYesYouTube video ID to query performance for
venue_typeNoOptional venue type filter (e.g., "retail", "transit", "bar")
Behavior4/5

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

With no annotations, the description carries the transparency burden and does well by detailing the exact return fields, including venueDistribution, daypartDistribution, and topScreens, plus examples of calls. It does not disclose edge-case behavior or potential errors, but the output structure is thoroughly specified.

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

Conciseness5/5

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

The description is well-structured with clear sections for when to use, return fields, and examples. Every sentence serves a purpose, and the main verb and resource are front-loaded. It is appropriately sized for the tool's complexity.

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

Completeness4/5

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

Given there is no output schema, the description compensates well by listing all return fields and providing two examples. It lacks some edge-case details (e.g., behavior for unknown video IDs) but is largely complete for a read-only analytics tool with three parameters.

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

Parameters3/5

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

Schema coverage is 100% with descriptions for all three parameters, so the baseline is 3. The description's examples illustrate parameter usage (e.g., venue_type: 'retail', days: 30) and add a bit of context, but it does not significantly deepen the semantic understanding beyond the schema.

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

Purpose5/5

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

The description clearly states the tool gets performance metrics for a specific video across the Trillboards DOOH network, listing specific metrics like plays, attention, and audience size. It distinguishes itself from sibling tools by focusing on video-level performance with venue/daypart breakdowns and top screens.

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?

A dedicated 'WHEN TO USE' section lists four concrete scenarios, such as checking video performance across screens and analyzing venue/daypart resonance. It provides clear context for when to use the tool, though it does not explicitly mention when not to use it or name direct alternatives.

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

get_content_recommendationsAInspect

Get best-performing content recommendations for a venue type and optional time context.

WHEN TO USE:

  • Deciding what content to schedule at a specific venue type

  • Finding content that drives the highest audience engagement at a location

  • Optimizing content rotation by daypart (morning, afternoon, evening, overnight)

  • Content programming decisions based on performance data

RETURNS:

  • data: Array of recommended content ranked by performance score

    • videoId, title, contentCategory, durationSeconds

    • totalPlays, uniqueScreens

    • avgAttention (0-1), avgDwellMs

    • performanceScore (composite of attention, replay density, dwell time)

  • meta: { count, venue_type, daypart, limit }

Performance score formula: attention(40%) + replay_density(30%) + dwell_time(30%)

EXAMPLE: User: "What content works best in bars during the evening?" get_content_recommendations({ venue_type: "bar", daypart: "evening", limit: 10 })

User: "Best performing content for transit screens" get_content_recommendations({ venue_type: "transit", limit: 20 })

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum recommendations to return (default: 10, max: 100)
daypartNoOptional daypart filter
venue_typeYesVenue type to get recommendations for (required)
Behavior4/5

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

With no annotations, the description carries the full burden and does a solid job: it details the return structure, lists the performance score formula, and provides examples. It doesn't mention error cases, auth requirements, or edge cases like no matching venue_type, so it's not a 5.

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

Conciseness5/5

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

The description is well-structured with clear sections: overview, when to use, returns, and examples. Every sentence contributes meaningful information, and the examples are compact and useful.

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

Completeness5/5

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

Despite lacking an output schema, the description fully specifies the return fields (data array with content details and metrics, meta object). Combined with examples and the performance formula, it gives the agent everything needed to invoke the tool correctly.

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

Parameters4/5

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

Schema coverage is 100%, so this is already well-documented. The description adds value by explaining daypart as 'time context', giving example calls, and clarifying the limit's role in the output size. This goes beyond the schema's basic descriptions.

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

Purpose5/5

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

The description clearly states it returns best-performing content recommendations filtered by venue type and optional daypart. It uses a specific verb and resource, and the focus on recommendations distinguishes it from sibling tools like get_content_performance or search_content.

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?

A dedicated WHEN TO USE section gives concrete scenarios: content scheduling, engagement optimization, daypart rotation, and programming decisions. However, it doesn't explicitly name alternatives or state when not to use this tool, stopping short of the highest bar.

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

get_creative_attentionAInspect

Get per-creative attention breakdown for a campaign.

WHEN TO USE:

  • A/B testing creative variants by attention score

  • Identifying which creative drives the most engagement

  • Comparing aCPM across creative assets

RETURNS: Array of creatives ranked by attention score, each with:

  • creativeId, totalImpressions, uniqueDevices

  • avgAttentionScore (0-1), avgDwellSeconds, avgFaceCount

  • attentionCpm, avgEmotionEngagement, positiveEmotionPct, attentionQualifiedPct

ParametersJSON Schema
NameRequiredDescriptionDefault
campaign_idYesCampaign identifier
Behavior3/5

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

No annotations are provided, so the description carries the burden. It discloses the return data structure (ranked by attention score, fields like avgAttentionScore) and implies read-only through the verb 'get,' but it doesn't explicitly state safety, permissions, or any side effects. This is adequate but not exceptional.

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 well-structured with clear sections (WHEN TO USE, RETURNS), uses bullet points for readability, and every sentence earns its place. No fluff or redundancy.

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

Completeness4/5

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

For a simple one-parameter tool, the description is complete: it explains the purpose, provides use cases, and details the return fields (acting as a pseudo output schema). It lacks only explicit notes on edge cases or limitations, but it's sufficient for effective invocation.

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

Parameters3/5

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

The input schema includes a single required parameter campaign_id with a description 'Campaign identifier,' giving 100% schema coverage. The tool description does not add any additional parameter-level semantics beyond what the schema already provides, 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 starts with 'Get per-creative attention breakdown for a campaign,' which combines a specific verb (get) with a clear resource (per-creative attention) and scope (for a campaign). This distinguishes it from sibling tools like get_attention_metrics or get_social_attention.

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 WHEN TO USE section explicitly lists three concrete use cases: A/B testing creative variants, identifying engagement drivers, and comparing aCPM. While it doesn't mention exclusions or alternative tools, the context provided is clear and actionable.

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

get_creative_attributionAInspect

Get attribution performance by individual creative variant.

Links creative execution to attribution outcomes: which creative variant drove the most store visits?

WHEN TO USE:

  • Comparing creative A/B/C test performance on attribution outcomes

  • Finding the optimal creative x venue_type x daypart x weather combination

  • Identifying the creative with the highest visit rate

RETURNS: Array of creatives ranked by store visits, each with:

  • creativeId, variant, totalVisits, avgVisitRate

  • attention: avgScore, avgDwell, avgEmotion, dominantEmotion

  • avgLiftPct, avgCostPerVisit

  • bestContext: { venueType, daypart, weather }

  • dateRange: { first, last, daysMeasured }

ParametersJSON Schema
NameRequiredDescriptionDefault
campaign_idYesCampaign identifier
Behavior4/5

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

No annotations are provided, so the description carries the burden of behavioral disclosure. It thoroughly describes the return behavior: an array of creatives ranked by store visits, including nested fields like attention metrics, bestContext, and dateRange. It does not mention error conditions, permissions, or side effects, but as a read-only 'get' operation, the main behavior is well covered.

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

Conciseness5/5

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

The description is well-structured and front-loaded with a one-sentence summary followed by focused sections. Every line adds value: the purpose statement, three concrete use cases, and a detailed return format list. There is no filler or redundancy, making it appropriately concise despite its length.

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

Completeness5/5

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

Given the tool has only one parameter and no output schema, the description compensates completely by detailing the return structure with nested objects (attention, bestContext, dateRange) and ranking semantics. Combined with clear use cases, it gives an agent all necessary context to select and invoke the tool correctly.

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

Parameters3/5

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

The input schema has 100% descriptive coverage for campaign_id ('Campaign identifier'), and the description does not add extra semantic detail for parameters. According to the baseline rule for high schema coverage, a score of 3 is appropriate—the schema already documents the parameter adequately.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Get attribution performance by individual creative variant.' It uses a specific verb ('Get') and resource ('creative variant'), and uniquely distinguishes itself from sibling tools like get_campaign_attribution and get_attribution_timeseries by focusing on per-creative performance and providing a concrete outcome ('which creative variant drove the most store visits?').

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?

A dedicated 'WHEN TO USE' section lists three specific scenarios, such as comparing A/B/C creative tests and finding optimal creative x context combinations. While it does not explicitly name alternatives or exclusions, the use cases are clear and actionable. This is more than implied usage but stops short of explicitly contrasting with sibling tools.

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

get_cross_channel_journeyAInspect

Get cross-channel customer journey data (Sankey flow) for a campaign.

Shows how users flow between channels: DOOH -> mobile -> web -> store.

WHEN TO USE:

  • Visualizing the customer journey across DOOH and digital channels

  • Understanding channel transition patterns

  • Building Sankey diagrams of marketing funnels

RETURNS:

  • flows: Array of { source, target, count } transitions between channels

  • channels: Array of { channel, touchpoints, uniqueDevices } distribution

ParametersJSON Schema
NameRequiredDescriptionDefault
campaign_idYesCampaign identifier
Behavior4/5

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

There are no annotations, so the description carries the full burden of behavioral disclosure. It discloses the return structure (flows and channels arrays) and gives an example of the transition pattern, making the tool's behavior transparent. While it does not explicitly mention side effects or permissions, the 'Get' nature and the detailed return info make the operation clear.

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

Conciseness5/5

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

The description is well-structured with a clear first sentence, an example flow, a dedicated 'WHEN TO USE' section, and a 'RETURNS' section. Every sentence adds value, and the information is front-loaded with the core purpose. It is appropriately concise without being under-specified.

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 low complexity (one parameter, no output schema, no annotations), the description is highly complete. It explains what the tool does, provides usage scenarios, and details the return format, which covers all necessary context for an agent to select and invoke the tool correctly.

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

Parameters3/5

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

The input schema already describes campaign_id as 'Campaign identifier' with full coverage. The description's mention of 'for a campaign' adds minimal semantic value beyond schema, essentially restating it. There is no additional detail on format, defaults, or edge cases, so it does not exceed 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?

The description clearly states a specific action ('Get cross-channel customer journey data') on a specific resource ('for a campaign'), with an illustrative flow (DOOH -> mobile -> web -> store). It also distinguishes itself from sibling tools by mentioning Sankey flow and cross-channel journey, which is unique among the listed get_* 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 'WHEN TO USE' section explicitly lists three scenarios where this tool is appropriate, such as visualizing customer journeys and building Sankey diagrams. However, it does not explicitly state when not to use it or point to alternative sibling tools, so it falls short of a 5.

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

get_dataset_statsAInspect

Get statistics about available causal training data: total tuples, unique creatives, venue diversity, date range.

Queries observation_stream for rows that have both a creative ID and a VAS outcome recorded, giving a picture of how much training data is available for the causal prediction engine.

WHEN TO USE:

  • Checking if enough data exists for reliable causal predictions

  • Understanding the diversity of training data (creatives, venues, time range)

  • Monitoring causal dataset health and growth

  • Planning data collection strategies

RETURNS:

  • data: Dataset statistics

    • total_tuples: number of context-action-outcome records

    • unique_creatives: number of distinct creatives with VAS data

    • unique_venue_types: number of distinct venue types represented

    • date_range: { start, end } of available data

    • observations_per_creative: { min, max, mean, median } distribution

  • metadata: { query_window_days }

  • suggested_next_queries: Follow-up queries

EXAMPLE: User: "How much causal training data do we have?" get_dataset_stats({})

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Behavior4/5

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

With no annotations, the description carries the full burden. It discloses that the tool queries observation_stream and filters for rows with both creative ID and VAS outcome, and it provides a detailed return structure. This goes beyond a simple 'get stats' statement, but it does not mention potential costs, staleness, or access requirements. Still, the provided behavioral context is substantial.

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

Conciseness4/5

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

The description is well-structured with clear sections (overview, when-to-use, returns, example). It is longer than strictly necessary for a zero-parameter tool, but every section adds value: the return spec is critical since no output schema is provided. The example is brief and illustrative.

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 zero parameters, no annotations, and no output schema, the description is highly complete. It specifies the data source, filtering criteria, all return fields with descriptions, usage contexts, and an example. This fully compensates for the absence of an output schema and leaves no ambiguity about the tool's behavior.

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

Parameters4/5

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

The input schema has zero properties and the description confirms no arguments via the example 'get_dataset_stats({})'. With 0 params, baseline is 4; there is nothing more to explain. The description reinforces that the tool requires no parameters.

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

Purpose5/5

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

The description explicitly states 'Get statistics about available causal training data' and lists specific metrics (total tuples, unique creatives, venue diversity, date range). It also explains the internal query against observation_stream, distinguishing it from other get_* tools like get_analytics or get_network_stats. The focus on causal training data makes it unique among siblings.

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

Usage Guidelines4/5

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

A dedicated 'WHEN TO USE' section provides clear conditions for using the tool (checking data sufficiency, diversity, health monitoring, planning). It does not explicitly mention alternatives or when-not-to-use scenarios, but the context is clear and directly tied to causal prediction needs. An explicit exclusion would push it to 5.

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

get_deviceAInspect

Get detailed information about a specific device.

WHEN TO USE:

  • Checking status of a single device

  • Getting device configuration details

  • Debugging device issues

RETURNS:

  • device_id: Your internal device ID

  • trillboards_device_id: Internal Trillboards ID

  • fingerprint: Device fingerprint

  • name: Device name

  • status: online/offline

  • last_seen: Last heartbeat timestamp

  • location: Location details

  • specs: Device specifications

  • stats: Impression and earnings stats

EXAMPLE: User: "Get details for vending machine 001" get_device({ device_id: "vending-001-nyc" })

ParametersJSON Schema
NameRequiredDescriptionDefault
device_idYesYour internal device identifier
Behavior2/5

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

No annotations are provided, so the description carries full responsibility. It does not disclose behavioral traits such as read-only nature, authorization requirements, error behavior for unknown device IDs, or rate limits. The return fields are listed, but operational behavior is not addressed.

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 well-structured with clear sections (WHEN TO USE, RETURNS, EXAMPLE), each serving a purpose. It is appropriately sized for a simple getter tool, with no redundant information and key details 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?

Despite having no output schema, the description enumerates all return fields and provides a concrete example, making it sufficient for a single-parameter read tool. Minor gaps include lack of error handling info and no mention of the obvious sibling list_devices, but overall it is fairly 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% and the schema description ('Your internal device identifier') aligns with the tool's return description. The DESCRIPTION adds a concrete example ('vending-001-nyc') but does not meaningfully extend the semantic meaning beyond what the schema already provides.

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

Purpose5/5

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

The description clearly states 'Get detailed information about a specific device' with a specific verb and resource, and the WHEN TO USE section adds concrete use cases (checking status, configuration, debugging). This distinguishes it from sibling tools like list_devices and get_device_ads.

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

Usage Guidelines4/5

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

Explicit WHEN TO USE list provides clear context for when to invoke this tool. However, it does not mention when not to use it or name alternative tools (e.g., list_devices for multiple devices), so it falls short of a 5.

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

get_device_adsAInspect

Get current ads scheduled for a device (for testing).

WHEN TO USE:

  • Testing device ad delivery

  • Debugging which ads are being shown

  • Verifying ad targeting is working

RETURNS:

  • ads: Array of advertisement objects

  • default_stream: Default content when no ads

  • schedule: Current ad schedule

EXAMPLE: User: "What ads are showing on device P_abc123?" get_device_ads({ fingerprint: "P_abc123" })

ParametersJSON Schema
NameRequiredDescriptionDefault
fingerprintYesDevice fingerprint (e.g., "P_abc123")
Behavior2/5

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

With no annotations, the description carries full burden for behavioral disclosure. It only says "for testing," implying a non-production use, but does not explicitly state it is read-only, mention permission requirements, or note any side effects or limitations. The return values are described, but not the behavior.

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

Conciseness4/5

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

The description is well-structured with clear sections: overview, WHEN TO USE, RETURNS, and an EXAMPLE. Each section adds value without excessive verbosity, though the formatting is a bit longer than strictly necessary.

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 one-parameter tool with no output schema, the description covers purpose, usage scenarios, return fields (ads, default_stream, schedule), and provides an example. It is complete enough for an agent to understand and invoke the tool, though it omits edge-case behavior.

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

Parameters3/5

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

Schema coverage is 100% with a clear description of the fingerprint parameter. The description also includes an example usage that reinforces the parameter. However, it does not add meaning beyond what the schema already provides, 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 clearly states a specific verb+resource: "Get current ads scheduled for a device (for testing)." This distinguishes it from the many sibling get_* tools by explicitly focusing on device ads, and the parenthetical "for testing" adds useful context.

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?

A dedicated "WHEN TO USE" section lists three concrete scenarios: testing device ad delivery, debugging which ads are shown, and verifying ad targeting. This provides clear context, though it does not mention when not to use the tool or suggest alternatives.

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

get_incrementalityAInspect

Get incrementality/lift test results for a campaign.

Uses Bayesian (Beta-Binomial with 10K Monte Carlo samples) and frequentist (chi-square with Yates correction) methods for causal measurement.

WHEN TO USE:

  • Proving causal DOOH advertising effectiveness

  • Getting both Bayesian and frequentist significance measures

  • Seeing treatment vs control group visit rates and lift

RETURNS: Array of experiments, each with:

  • experimentId, type (geo_holdout/ghost_ads/psm), status

  • treatmentDmas, controlDmas

  • latestResult: treatment/control rates, lift%, incrementalVisits, pValue, posteriorProbPositive, expectedUplift, credibleInterval

Returns empty array if no experiments exist for this campaign.

ParametersJSON Schema
NameRequiredDescriptionDefault
campaign_idYesCampaign identifier
Behavior4/5

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

No annotations are provided, so the description carries full weight. It discloses the statistical methods (Bayesian Beta-Binomial with 10K Monte Carlo samples, frequentist chi-square with Yates correction), the structure of the returned array (including latestResult fields), and the empty-array behavior. This goes well beyond a minimal description, though it does not mention side effects or authorization requirements.

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

Conciseness5/5

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

The description is well-structured with clear sections: a one-sentence summary, a brief methodology note, WHEN TO USE, and RETURNS. Every sentence adds value, with no padding or 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?

Despite having no output schema, the description thoroughly covers return values: the array of experiments, types (geo_holdout/ghost_ads/psm), and nested latestResult fields (treatment/control rates, lift%, incrementalVisits, pValue, etc.). It also explains the empty-array case, making it complete for a read tool.

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

Parameters3/5

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

The schema already provides 100% coverage for the single parameter campaign_id with a description. The tool description adds no additional parameter context, so the baseline of 3 applies.

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

Purpose5/5

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

The description states a specific verb+resource: 'Get incrementality/lift test results for a campaign.' This clearly distinguishes it from sibling tools like get_campaign_performance or get_roas, as it focuses on causal measurement and lift testing.

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?

A dedicated 'WHEN TO USE' section lists three explicit scenarios: proving causal DOOH effectiveness, obtaining Bayesian and frequentist significance measures, and seeing treatment vs. control group rates. However, it does not explicitly name alternatives or state when not to use, so it stops short of a 5.

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

get_live_audienceAInspect

Get real-time audience data for a specific screen.

WHEN TO USE:

  • Checking current audience at a screen before buying

  • Monitoring audience during a live campaign

  • Getting detailed audience signals (attention, mood, purchase intent, demographics)

RETURNS real-time data from edge AI sensors (refreshed every 10 seconds):

  • face_count: Number of people currently viewing

  • attention_score: How attentively the audience is watching (0-1)

  • income_level: Estimated income bracket (from Gemini Vision)

  • mood: Current audience mood

  • lifestyle: Primary lifestyle segment

  • purchase_intent: Purchase intent level

  • crowd_density: Estimated venue occupancy

  • ad_receptivity: How receptive the audience is to ads (0-1)

  • emotional_engagement: Emotional engagement score (0-1)

  • group_composition: Solo/couples/families/friends/work groups

  • signals_age_ms: How fresh the data is in milliseconds

EXAMPLE: User: "What's the current audience at screen 507f1f77bcf86cd799439011?" get_live_audience({ screen_id: "507f1f77bcf86cd799439011" })

ParametersJSON Schema
NameRequiredDescriptionDefault
screen_idYesScreen ID to get live audience for
Behavior4/5

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

With no annotations, the description carries full burden. It discloses data freshness (refreshed every 10 seconds), the data source (edge AI sensors), and explains return fields including a staleness metric. It lacks explicit rate limits or error behavior but effectively communicates the real-time nature.

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 well-structured with WHEN TO USE, RETURNS, and EXAMPLE sections. Each part adds value; the main verb is front-loaded. A slight deduction for verbosity in the returns list, though it's necessary given the lack of an output schema.

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

Completeness5/5

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

This is a simple one-parameter tool with no output schema. The description comprehensively covers what the tool does, when to use it, the return fields (with meanings), and an example call. No significant gaps remain.

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

Parameters3/5

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

The schema covers 100% of parameter documentation for screen_id. The description adds a concrete example ID, but no additional semantic detail beyond what the schema already states. 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 opens with 'Get real-time audience data for a specific screen,' a specific verb+resource+scope statement. It clearly distinguishes from sibling tools like get_audience_forecast or get_analytics by emphasizing 'real-time' and 'specific screen.'

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 WHEN TO USE section explicitly lists three concrete use cases: pre-buy checks, live campaign monitoring, and detailed audience signals. It stops short of naming alternatives or exclusions, so it doesn't earn a 5, but the context is clear enough for an agent to decide.

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

get_media_buy_deliveryAInspect

[AdCP Media Buy] Get delivery/performance report for a media buy.

Returns campaign performance with breakdowns by screen, venue, hour, and audience segment.

WHEN TO USE:

  • Monitoring campaign delivery in real-time

  • Getting performance breakdowns for optimization

  • Reporting on campaign results

RETURNS:

  • delivery: impressions, spend, avg_cpm, unique_screens, fill_rate

  • breakdowns: by_screen, by_venue, by_hour (top performers)

EXAMPLE: get_media_buy_delivery({ media_buy_id: "mbuy_abc123" })

ParametersJSON Schema
NameRequiredDescriptionDefault
dimensionsNoReporting dimensions to include
breakdown_byNoDimensions to break down by (legacy, prefer dimensions)
media_buy_idYesMedia buy ID
Behavior3/5

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

With no annotations, the description carries the full burden. It does disclose return fields ('delivery: impressions, spend, avg_cpm, unique_screens, fill_rate') and mentions 'top performers' for breakdowns, which is useful. However, there is an internal inconsistency: the intro lists 'audience segment' as a breakdown, while the RETURNS section omits it. This ambiguity about the actual response structure reduces transparency.

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

Conciseness5/5

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

The description is well-structured with clear headings (WHEN TO USE, RETURNS, EXAMPLE) and no filler. Each section serves a distinct purpose, and the example is a useful, concise illustration. It is appropriately sized for the tool's complexity.

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

Completeness4/5

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

Given no output schema and no annotations, the description provides a solid level of completeness: it explains usage scenarios, lists return fields, and gives an example. However, the breakdown inconsistency and lack of detail about the dimensions parameter leave some gaps, preventing a perfect score.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already defines each parameter. The description adds a concrete example with media_buy_id and mentions breakdown dimensions, but it does not clarify the optional dimensions or the legacy 'breakdown_by' parameter. Thus, it stays at the baseline 3.

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+resource ('Get delivery/performance report for a media buy') and clearly distinguishes this tool from siblings like get_media_buys and get_campaign_performance by focusing on media-buy-level delivery with breakdowns by screen, venue, hour, and audience segment. The '[AdCP Media Buy]' prefix also disambiguates the domain.

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?

A 'WHEN TO USE' section explicitly lists three monitoring/optimization/reporting contexts, providing clear usage guidance. However, it does not mention when to avoid this tool or present alternative tools, which keeps it at 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_media_buysAInspect

[AdCP Media Buy] List media buys with status, budget, flight and optional delivery snapshots.

Status, budget and flight are read from the advertisements + placements spine the buy actually books on — not from a stored display string. A buy that its flight ended, or that the pacing cron completed on goal, reports the truth here even though nothing rewrote it.

WHEN TO USE:

  • Polling the buys you have open on this account

  • Confirming a buy left pending_creatives after sync_creatives

  • Getting a near-real-time delivery snapshot without a full delivery report

RETURNS:

  • media_buys: each with media_buy_id, status, currency, total_budget, confirmed_at, revision and packages[]. status is the AdCP media-buy-status enum; the accepted values are listed on the status_filter parameter below.

  • pagination: cursor-based

EXAMPLE: get_media_buys({ status_filter: ["active", "pending_creatives"], include_snapshot: true }) get_media_buys({ media_buy_ids: ["mbuy_1750000000000_ab12cd34"] })

ParametersJSON Schema
NameRequiredDescriptionDefault
contextNo
paginationNo
media_buy_idsNoSpecific media buy IDs. When omitted, returns a paginated set matching status_filter.
status_filterNoSingle status or array of statuses. Defaults to ['active'] when media_buy_ids is omitted; no implicit filter when ids are given.
include_snapshotNoInclude a delivery snapshot per package (impressions, spend, pacing_index). Read live off placements, so staleness_seconds is 0.
Behavior5/5

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

With no annotations provided, the description carries the full transparency burden. It discloses that status/budget/flight are read live from the advertisements+placements spine rather than a stored display string, and that delivery snapshots have staleness_seconds 0. It also explains that results reflect current truth even if not rewritten.

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 well-structured with a one-sentence purpose, followed by a source-of-truth note, WHEN TO USE, RETURNS, and EXAMPLE sections. Every sentence earns its place, and the format is front-loaded with the core purpose.

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 absence of an output schema, the RETURNS section enumerates the fields (media_buy_id, status, currency, total_budget, confirmed_at, revision, packages) and pagination style. It also provides example calls and cross-references the status_filter enum. This makes the description self-sufficient for an agent to use 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?

The description adds value beyond the schema through examples showing status_filter arrays and media_buy_ids, and notes that status_filter accepted values are listed on the parameter. It also clarifies pagination is cursor-based. However, it does not explain the 'context' parameter, which is also undescribed in the schema, so it doesn't fully compensate for the 60% schema coverage.

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

Purpose5/5

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

The opening sentence clearly states the tool lists media buys with status, budget, flight, and optional delivery snapshots. This specific verb-plus-resource description distinguishes it from sibling tools like get_media_buy_delivery or update_media_buy.

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

Usage Guidelines5/5

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

The 'WHEN TO USE' section explicitly provides three concrete scenarios: polling open buys, confirming a buy left pending_creatives after sync_creatives, and getting near-real-time snapshots without a full delivery report. This gives clear context and implies when not to use it (e.g., when a full delivery report is needed).

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

get_multi_touch_attributionAInspect

Get multi-touch attribution model results for a campaign.

Supported models: time_decay, position_based, attention_weighted.

WHEN TO USE:

  • Understanding how DOOH fits into the full marketing funnel

  • Seeing credit allocation across DOOH, mobile, web, and store channels

  • Quantifying DOOH's contribution to conversions

RETURNS:

  • totalChains: number of multi-touch journeys found

  • avgTouchpoints: average touchpoints per chain

  • channelAttribution: { dooh, mobile, web, store } (each 0-1, sums to 1)

  • conversions: total conversion events

  • totalConversionValue: sum of conversion values (cents)

  • avgConfidence: average match confidence across chains

Returns null if no multi-touch chains exist.

ParametersJSON Schema
NameRequiredDescriptionDefault
campaign_idYesCampaign identifier
Behavior4/5

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

With no annotations, the description carries the burden of behavioral disclosure and does well: it lists return fields in detail, specifies that channelAttribution sums to 1, and handles the null-return edge case. However, it mentions supported models without indicating how a model is selected given only campaign_id in the schema, leaving a minor ambiguity.

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 well-organized with clear headings (WHEN TO USE, RETURNS) and bulleted lists. It is front-loaded with a clear summary sentence and every line provides meaningful information without redundancy.

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

Completeness5/5

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

Given no output schema and no annotations, the description is remarkably complete: it explains what the tool does, when to use it, what the return object contains, and a key edge case (null response). It is more than sufficient for an agent to invoke the tool correctly.

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

Parameters3/5

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

The schema already provides 100% coverage with campaign_id described as 'Campaign identifier'. The description adds no further parameter-level detail, so the baseline of 3 applies.

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

Purpose5/5

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

The description clearly states 'Get multi-touch attribution model results for a campaign' with a specific verb and resource, and lists supported models (time_decay, position_based, attention_weighted) which distinguishes it from sibling attribution tools like get_attribution_timeseries or get_campaign_attribution.

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 'WHEN TO USE' section provides clear context (understanding DOOH fit, credit allocation, quantifying DOOH contribution) but does not mention exclusions or explicitly name alternative tools for different scenarios, so it stops short of a 5.

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

get_network_statsAInspect

Get network-wide statistics across all partner screens.

WHEN TO USE:

  • Getting a high-level overview of network performance

  • Checking how many screens are online

  • Reviewing total impressions and revenue estimates

RETURNS:

  • total_screens, online_screens

  • impressions, total_auctions

  • revenue_estimate_usd, avg_cpm, fill_rate

EXAMPLE: User: "How is my network performing this week?" get_network_stats({ time_range: "7d" })

ParametersJSON Schema
NameRequiredDescriptionDefault
time_rangeNoTime range for stats (default: 7d)
Behavior3/5

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

No annotations are provided, so the description must carry the full burden of behavioral disclosure. It lists the return fields and gives an example, which is helpful, but it does not mention any potential side effects, authentication requirements, rate limits, or data freshness. For a simple read tool, the absence of such caveats is acceptable but not deeply transparent.

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

Conciseness5/5

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

The description is tightly structured with sections (WHEN TO USE, RETURNS, EXAMPLE). Every sentence earns its place, with no unnecessary verbiage. It uses clear headings and a realistic example, making it 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?

Despite having no output schema, the description explicitly lists all return fields, which is sufficient for an agent to understand what to expect. It also provides usage context and an example, covering the tool's simplicity comprehensively.

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

Parameters3/5

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

The input schema already fully describes the only parameter (time_range) with enum values, default, and description (100% coverage). The description adds an example with time_range, but that is marginal value beyond the schema. 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 clearly states the tool's function: 'Get network-wide statistics across all partner screens.' It specifies the verb 'get', the resource 'network stats', and the scope 'across all partner screens,' which distinguishes it from other get_* tools that target campaigns, devices, or analytics. The WHEN TO USE section further reinforces its purpose.

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

Usage Guidelines4/5

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

The 'WHEN TO USE' section provides three explicit use cases: getting a high-level overview, checking online screens, and reviewing impressions/revenue. It gives clear context for when to invoke the tool but does not mention exclusions or alternative tools, so it falls short of a 5.

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

get_partner_infoAInspect

Get information about the authenticated partner account.

WHEN TO USE:

  • Checking current partner status and stats

  • Verifying API key is working

  • Getting partner account details

RETURNS:

  • partner_id: Partner identifier

  • company_name: Registered company name

  • status: Account status (active, suspended, etc.)

  • device_count: Number of registered devices

  • total_impressions: Lifetime impression count

  • earnings: Earnings summary

EXAMPLE: User: "What's my partner account status?" get_partner_info({})

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Behavior4/5

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

With no annotations, the description carries the burden. It discloses return fields and implies a read-only operation by using 'Get information' and referencing the authenticated account. It doesn't explicitly state non-destructiveness, but the nature of the tool and return list make this clear.

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

Conciseness5/5

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

The description is well-structured with a summary, usage scenarios, return fields, and an example. Every section is concise and serves a purpose, 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?

Despite no output schema, the description lists all key return fields explicitly. It covers what the tool does, when to use it, and what it returns. Given the low complexity (0 params, simple read), this is complete.

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

Parameters4/5

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

The tool has 0 parameters, which per rubric gives a baseline of 4. The description correctly shows the tool takes no input, so no additional parameter semantics are needed.

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

Purpose5/5

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

The description explicitly states 'Get information about the authenticated partner account', identifying the specific verb and resource. The 'RETURNS' section further clarifies the scope, distinguishing it from sibling tools like get_billing_status or get_device.

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?

A dedicated 'WHEN TO USE' section lists concrete scenarios such as checking partner status and verifying API key. It provides clear context but does not explicitly mention alternatives or when not to use, so it misses full marks.

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

get_pricingAInspect

Get machine-readable pricing for all Trillboards products. Returns graduated usage-based pricing, free tier thresholds, and committed-use discount tiers. No authentication required — use this to evaluate costs before integrating.

ParametersJSON Schema
NameRequiredDescriptionDefault
productNoOptional: filter to a specific product (data_api, proof_of_play, attribution, data_marketplace, partner_platform, programmatic, fein_edge_ai)
Behavior4/5

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

No annotations are provided, so the description carries full burden. It discloses the no-auth requirement and describes the return format and content (graduated pricing, free tier, discount tiers). This is meaningful behavioral context. It doesn't explicitly state that the operation is read-only, but the 'get' verb implies it, and no side effects are suggested.

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

Conciseness5/5

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

The description is two sentences, front-loaded with the core purpose, and every sentence adds value. The second sentence packs return details, auth requirement, and use case without fluff.

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 tool with one optional parameter and no output schema, the description covers purpose, return contents, auth, and intended use. It could explicitly state the behavior when 'product' is omitted (e.g., returns all products), but the phrase 'all Trillboards products' implies this. Overall, the description is sufficient for an agent to select and invoke the 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%: the single optional 'product' parameter is fully described with an enum of values. The tool description doesn't add any extra parameter semantics beyond the schema, so the baseline of 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool's purpose with a specific verb and resource: 'Get machine-readable pricing for all Trillboards products.' It also enumerates return contents (graduated usage-based pricing, free tier thresholds, committed-use discount tiers), which differentiates it from sibling tools like get_products or get_billing_status.

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

Usage Guidelines4/5

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

The description provides a clear use case: 'use this to evaluate costs before integrating.' It also mentions the authentication requirement (none). However, it doesn't explicitly name alternative tools or state when not to use it, so it falls short of a 5.

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

get_productsAInspect

[AdCP Media Buy] Get available DOOH advertising products and packages.

NO AUTHENTICATION REQUIRED. Discovery is open — read the catalogue first, get a key when you want to transact.

Send a natural-language brief and it is answered from what the screens actually observed: each product's description reports the hours people are really in frame (in the screens' own local time), how long they dwell, the mood / movement / gaze the on-device sensors reported, what the speech layer heard people shopping for — and, explicitly, which of your words we cannot evidence. Products are ordered by that evidence.

WHEN TO USE:

  • Browsing available inventory before creating a campaign

  • Comparing pricing across venue types and locations

  • Understanding what's available in a specific market, at a specific time of day

RETURNS:

  • products: Array of product packages with pricing, reach, and observed audience

  • Each product includes: name, description (free text answering your brief), venue_type, screen_count, pricing_options, and observed — the numbers behind the prose, present only where we measured something

  • brief_interpretation: how we read your brief, so you can see if we read it right

EXAMPLE: User: "commuters who are bored and hungry around lunchtime" get_products({ brief: "commuters who are bored and hungry around lunchtime" })

ParametersJSON Schema
NameRequiredDescriptionDefault
briefNoNatural language campaign brief for AI-driven inventory matching
marketNoMarket/city to get products for
filtersNoStructured filters for wholesale/refine modes
paginationNo
buying_modeNoAdCP buying mode (default: brief)
venue_typesNoFilter by venue types (legacy, prefer filters.venue_types)
audience_profileNoTarget audience characteristics
Behavior5/5

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

No annotations exist, so the description carries the full burden. It discloses that no authentication is required, explains the observed-screen data source, states products are ordered by evidence, and notes that some words may not be evidenced. This is exceptional transparency.

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

Conciseness5/5

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

The description is well-structured with clear sections (WHEN TO USE, RETURNS, EXAMPLE) and front-loaded with the key facts: purpose, no auth, and evidence-based behavior. Despite length, every sentence adds useful information and none feel 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?

Given the absence of an output schema, the RETURNS section thoroughly explains the product structure and the brief_interpretation field. Use cases and behavior are covered well. The main gap is the lack of guidance on optional parameters like pagination and filters, though the schema fills those holes.

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 86%, so the schema already documents most parameters. The description adds substantial meaning to the `brief` parameter with a detailed explanation of how it is used and an example, which goes beyond the schema's one-line description. Other parameters are adequately covered by the schema.

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

Purpose5/5

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

The description opens with 'Get available DOOH advertising products and packages', a specific verb+resource statement. It clearly differentiates this tool from generic inventory tools by describing its evidence-based natural-language matching, making the purpose unmistakable.

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?

A dedicated 'WHEN TO USE' section lists three concrete scenarios: browsing inventory, comparing pricing, and understanding market/daypart availability. This gives clear context, though it does not mention when not to use the tool or name alternative sibling tools like discover_inventory.

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

get_roasAInspect

Get Return on Ad Spend (ROAS) with transaction attribution data.

Closes the ROAS loop: matches purchase events to DOOH exposures with time-decay weighting, and computes attributed revenue and incremental ROAS.

WHEN TO USE:

  • Measuring revenue directly attributable to DOOH advertising

  • Getting ROAS and incremental ROAS (iROAS) figures

  • Seeing sales lift between exposed and control groups

RETURNS:

  • transactions: total, uniquePurchasers, totalRevenueCents, avgBasketCents

  • attribution: attributedTransactions, attributedRevenueCents, totalMediaCostCents, roas, iroas

  • salesLift: exposedPurchasers, controlPurchasers, incrementalTransactions, incrementalRevenueCents, salesLiftPct, posteriorProbPositive

  • timing: avgHoursToPurchase, medianHoursToPurchase

Returns null if no transaction data exists.

ParametersJSON Schema
NameRequiredDescriptionDefault
campaign_idYesCampaign identifier
Behavior4/5

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

With no annotations, the description carries full burden. It discloses key behavioral details: the matching logic (purchase events to exposures with time-decay weighting), the computation of incremental ROAS and sales lift, and the edge case of returning null if no transaction data exists. It does not discuss authentication, rate limits, or explicit read-only guarantees, but given the 'Get' verb and return-focused text, this is sufficient.

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 divided into clear sections: purpose, WHEN TO USE, and RETURNS, with bulletized output groups. It's more detailed than necessary for a one-parameter tool but all sections add value, especially the RETURNS list which substitutes for the missing output schema. The metaphorical opener 'Closes the ROAS loop' adds minimal 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?

The tool has no output schema, so the description compensates by enumerating all returned data groups (transactions, attribution, salesLift, timing) with field names, and explicitly states the null return condition. Combined with the single well-documented parameter and clear usage scenarios, the description is complete enough for an AI to correctly expect the response shape.

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

Parameters3/5

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

The only parameter is campaign_id, which the schema already describes as 'Campaign identifier' with 100% coverage. The description does not add any additional meaning to this parameter, so it holds at the baseline for good schema coverage.

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

Purpose5/5

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

The description opens with a specific verb+resource: 'Get Return on Ad Spend (ROAS)'. It then elaborates with the mechanism (matches purchase events to DOOH exposures with time-decay weighting) and output scope (ROAS, iROAS, sales lift). This clearly distinguishes it from sibling attribution tools, though it doesn't name them explicitly.

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

Usage Guidelines4/5

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

A dedicated 'WHEN TO USE' section lists three concrete scenarios: measuring revenue attributable to DOOH, getting ROAS/iROAS, and sales lift between exposed/control groups. This provides clear context for when to invoke the tool, but it does not mention alternative sibling tools or exclusions.

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

get_signalsAInspect

[AdCP Signals] Get real-time audience signals from DOOH screens.

This is an AdCP (Ad Context Protocol) compliant tool. It returns deterministic audience signals captured by edge AI (vision + audio + speech) on available screens.

WHEN TO USE:

  • Discovering available audience signals before buying inventory

  • Evaluating audience composition at specific venues or locations

  • Building targeting segments based on real-time audience data

Unlike probabilistic data, these signals are DETERMINISTIC — captured by on-device cameras and microphones, analyzed by ML Kit and Gemini Vision.

RETURNS:

  • signals: Array of per-screen signal objects with demographics, venue, behavior, geo

  • metadata: total_screens, matching_screens, screens_with_live_data

EXAMPLE: User: "What audience signals are available at retail locations?" get_signals({ signal_spec: { signal_types: ["demographics", "behavior"], filters: { venue_type: "retail" } } })

ParametersJSON Schema
NameRequiredDescriptionDefault
signal_specNoAdCP signal specification
Behavior4/5

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

With no annotations provided, the description carries the full burden. It discloses that signals are deterministic, captured by on-device cameras/microphones, analyzed by ML Kit and Gemini Vision, and returns the exact structure (signals array, metadata counts). This gives substantial behavioral context beyond basic operation.

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

Conciseness5/5

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

The description is well-structured with clear sections: main purpose, WHEN TO USE, behaviour explanation, RETURNS, and a helpful example. Every section earns its place and the content is front-loaded with the most important information. No wasted words.

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

Completeness4/5

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

Given the one-parameter nested object schema and absence of output schema, the description is complete: it explains use cases, behavior, return structure, and gives an example. It doesn't cover error handling or pagination, but for a query tool of this complexity, it is nearly comprehensive.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description adds value with a concrete example showing how signal_spec.shapes the request (signal_types, filters, venue_type), making the parameter usage clearer than raw schema alone. This justifies a point above baseline.

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

Purpose5/5

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

The description clearly states 'Get real-time audience signals from DOOH screens' with a specific verb and resource. It further distinguishes itself from sibling tools by emphasizing deterministic signals from edge AI and 'Discovering available audience signals before buying inventory,' which positions it uniquely among many get_* 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 'WHEN TO USE' section provides three explicit use cases: discovering signals before buying, evaluating audience composition, and building targeting segments. It contrasts deterministic vs probabilistic data, giving context, though it does not name specific alternative tools for when-not-to-use.

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

get_social_attentionAInspect

Query social attention contagion metrics from the observation stream. Returns windows where attention propagated between viewers (social amplification factor > 1).

Social attention data is produced by the AttentionGraphBuilder running on CTV edge devices, which models viewer attention as a directed graph and detects when one viewer looking at the screen triggers nearby viewers to also look (attention contagion / social amplification).

WHEN TO USE:

  • Finding moments where social proof drove collective engagement

  • Identifying which venues or dayparts exhibit highest attention contagion

  • Understanding cascading attention patterns (cascade depth)

  • Correlating social amplification with ad effectiveness (VAS)

RETURNS:

  • data: Array of observation_stream rows with socialAttention payload

    • payload.socialAttention.socialAmplificationFactor (SAF): ratio of actual-to-expected group attention (>1 = contagion detected)

    • payload.socialAttention.cascadeDepth: max depth of attention propagation chain

    • payload.socialAttention.viralAttentionScore: composite metric combining SAF and cascade depth

    • payload.socialAttention.contagionWindowMs: time window over which cascade occurred

    • payload.socialAttention.triggerViewerIndex: which viewer initiated the cascade

  • metadata: { result_count, time_range, min_saf_filter }

  • suggested_next_queries: Follow-up queries

EXAMPLE: User: "Show me moments where attention went viral in bar venues" get_social_attention({ min_saf: 2.0, venue_type: "bar" })

User: "Find the strongest social amplification events this week" get_social_attention({ min_saf: 3.0, time_range: { start: "2026-03-09T00:00:00Z", end: "2026-03-16T00:00:00Z" } })

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum results to return. Default: 20, max: 200.
min_safNoMinimum social amplification factor threshold. Default: 1.5. Higher values return only stronger contagion events.
screen_idNoFilter by screen MongoDB ID. Optional.
time_rangeNoTime range filter. Defaults to last 24 hours.
venue_typeNoFilter by venue type (e.g., "bar", "restaurant_qsr", "transit"). Optional.
Behavior4/5

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

With no annotations, the description carries full burden. It explains the data source (AttentionGraphBuilder on CTV edge devices), the meaning of key metrics (SAF, cascade depth), and the return payload structure. It does not explicitly mention read-only/safety, but the verb 'Query' and operation semantics imply non-destructive use. It lacks rate-limit or auth details, which would push it to 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?

The description is well-organized into clear sections (purpose, when to use, returns, examples). Each section adds meaningful information without fluff. The examples are concise and illustrative. It is longer than average but earns its length through density and structure.

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

Completeness5/5

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

With no output schema, the description thoroughly details the return payload, including nested socialAttention metrics and metadata. It also covers the data provenance and typical use cases, making it self-contained. The provided examples cover common query patterns. This is a complete description for an agent to use the tool effectively.

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

Parameters4/5

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

Schema covers all 5 parameters with descriptions (100% coverage), so baseline is 3. The description adds value through two representative examples showing how to combine min_saf, venue_type, and time_range, and clarifies that the metadata includes min_saf_filter. It avoids redundant repetition of schema fields.

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

Purpose5/5

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

The description explicitly states the tool 'Query social attention contagion metrics from the observation stream' and specifies the core criterion (SAF > 1). It distinguishes itself from sibling tools like get_attention_metrics and get_social_contagion_summary by focusing on contagion/cascade behavior rather than general attention or aggregate summaries.

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?

A dedicated 'WHEN TO USE' section lists four concrete use cases, clearly indicating appropriate contexts. However, it does not explicitly mention when not to use the tool or name alternative siblings (e.g., get_social_contagion_summary for summary stats), so exclusion guidance is missing.

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

get_social_contagion_summaryAInspect

Aggregate social attention metrics across screens and time periods. Shows which venues and dayparts have the highest social amplification.

Queries observation_stream for social attention data and aggregates by the requested dimension (venue, daypart, or screen), computing average SAF, average cascade depth, average viral attention score, and event count.

WHEN TO USE:

  • Understanding which venues generate the most social amplification

  • Comparing daypart effectiveness for social contagion

  • Identifying top-performing screens for attention cascading

  • Planning campaigns that leverage social proof

RETURNS:

  • data: Array of aggregated rows, sorted by avg SAF descending

    • group_key: the dimension value (venue type, daypart, or screen ID)

    • avg_saf: average social amplification factor

    • avg_cascade_depth: average attention cascade depth

    • avg_viral_attention_score: average viral attention score

    • event_count: number of social attention events in the group

  • metadata: { group_by, time_range, total_events }

  • suggested_next_queries: Follow-up queries

EXAMPLE: User: "Which venues have the highest social amplification this week?" get_social_contagion_summary({ group_by: "venue", time_range: { start: "2026-03-09", end: "2026-03-16" } })

User: "Show me social attention by daypart over the last 7 days" get_social_contagion_summary({ group_by: "daypart" })

ParametersJSON Schema
NameRequiredDescriptionDefault
group_byNoDimension to group by: "venue", "daypart", or "screen". Default: "venue".
time_rangeNoTime range filter. Defaults to last 7 days.
Behavior4/5

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

With no annotations, the description carries the full burden. It discloses that the tool queries observation_stream, aggregates by dimension, computes specific metrics (average SAF, cascade depth, viral attention score), sorts results by avg SAF descending, and returns suggested_next_queries. It also notes default time ranges. This is substantial transparency, though it doesn't discuss error handling or auth requirements.

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

Conciseness5/5

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

The description is well-structured with clear sections: purpose, when to use, returns, and example. It is front-loaded with a concise overview, then provides necessary detail. Every section serves a purpose without irrelevant fluff.

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

Completeness5/5

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

Because there is no output schema, the description thoroughly explains the return structure, including the array of rows with fields like avg_saf and event_count, plus metadata. It also provides two example calls covering different group_by values. This gives the agent everything needed to invoke the tool correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so baseline is 3. The description's examples ('get_social_contagion_summary({ group_by: "venue", time_range: { start: "2026-03-09", end: "2026-03-16" } })') reinforce the parameter usage but don't add meaning beyond what the schema already provides.

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

Purpose5/5

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

The description clearly states the tool's function: 'Aggregate social attention metrics across screens and time periods' and 'Shows which venues and dayparts have the highest social amplification.' This is a specific verb+resource that distinguishes it from sibling tools like get_social_attention, which likely returns raw data rather than aggregates.

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 'WHEN TO USE' section provides clear scenarios such as 'Understanding which venues generate the most social amplification' and 'Comparing daypart effectiveness for social contagion.' However, it doesn't explicitly mention when not to use this tool or name alternatives, so it falls short of a 5.

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

get_task_statusAInspect

[AdCP Protocol] Get the status of a previously issued AdCP task.

Every AdCP task Trillboards serves for an AUTHENTICATED caller is recorded and returned a task_id. Poll that id here to read the task's terminal state and, with include_result: true, its completion payload.

Trillboards answers every AdCP task in-process, so a task is already completed by the time you hold its id — this tool exists so a buyer that polls does not hang, and so an async arm has somewhere to report from when one lands.

TASK SCOPE: tasks are visible only to the account that created them. An id belonging to another account, an id we never issued, or a poll with no credential all answer identically — "Task not found" — so the surface cannot be used to probe which ids exist.

NOT RECORDED: read-only protocol and catalogue calls that AdCP does not model as tasks (get_adcp_capabilities, list_creative_formats, get_media_buys, list_accounts), and any anonymous call, which has no account to scope to.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNo
contextNo
task_idYesUnique identifier of the task to retrieve, as issued in the `task_id` field of the originating task response.
include_resultNoInclude the task's result payload when status is completed. Defaults to false for lightweight status-only polls.
include_historyNoInclude conversation history. Trillboards tasks complete in-process and hold no multi-turn history, so this is accepted and has no effect.
Behavior5/5

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

With no annotations, the description bears full responsibility for behavioral disclosure. It discloses that tasks complete in-process ('already completed by the time you hold its id'), that include_history has no effect, and that responses are intentionally identical for not-found IDs to prevent probing. Security and scope behaviors are thoroughly explained.

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 purpose sentence and uses clear section headers (TASK SCOPE, NOT RECORDED) to organize extra information. It is longer than a typical tool description, but every sentence adds valuable context about behavior and security. The length is justified given the protocol-specific details.

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?

Without an output schema, the description should explain return semantics. It explains the terminal state and completion payload, and the not-found response pattern. However, it does not enumerate possible status values (e.g., completed, failed, pending) or describe the shape of the completion payload. This is a minor gap for a polling tool with a simple return contract.

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 cover task_id, include_result, and include_history, but the description adds meaningful context: it explains the effect of include_result ('with include_result: true, its completion payload') and explicitly states include_history is accepted but has no effect. It does not add anything for the generic account or context parameters, though these are common cross-tool fields. The description compensates for the 60% schema coverage.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Get the status of a previously issued AdCP task.' It further clarifies the polling behavior ('Poll that id here to read the task's terminal state'), making the tool's function unmistakable. It also distinguishes itself from read-only protocol calls listed under NOT RECORDED, though it doesn't explicitly reference the tasks_get/tasks_list siblings.

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

Usage Guidelines5/5

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

The description explicitly states when to use this tool: 'this tool exists so a buyer that polls does not hang, and so an async arm has somewhere to report from when one lands.' It also provides exclusions by naming read-only calls that are NOT RECORDED as tasks, and warns that all not-found cases return identically, guiding safe usage expectations.

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

get_usage_summaryAInspect

Get your current billing period usage summary with per-product breakdown and costs. Shows free tier consumption, paid usage, and total cost.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Behavior4/5

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

With no annotations provided, the description carries the full burden. It discloses the response content (free tier consumption, paid usage, total cost) and scopes to the current billing period. While it doesn't explicitly state read-only behavior or authentication needs, the 'get' verb and lack of side effects make it reasonably transparent.

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

Conciseness5/5

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

The description is two efficient sentences. The first states the primary purpose and scope, the second adds output details. No redundant or extraneous content.

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

Completeness4/5

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

Given the tool has no parameters and no output schema, the description sufficiently outlines the response categories. It doesn't explicitly differentiate from get_billing_status or mention data freshness, but for a simple summary tool it offers enough context for correct selection.

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 the baseline is 4. The description adds meaning by explaining the output categories, which is useful given the empty input schema.

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

Purpose5/5

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

The description clearly states the tool retrieves a billing period usage summary, with explicit mention of per-product breakdown and costs. This distinguishes it from other billing-related tools like get_billing_status, which likely handles broader account status.

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

Usage Guidelines4/5

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

The description provides clear context for use—retrieving current billing period usage details—but does not explicitly exclude alternatives or mention when not to use this tool. This implies usage rather than offering explicit guidance against siblings.

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

get_webhook_deliveriesAInspect

Get delivery history for a webhook.

WHEN TO USE:

  • Debugging failed webhook deliveries

  • Auditing webhook activity

  • Checking delivery success rates

RETURNS:

  • deliveries: Array of delivery records with:

    • delivery_id: Unique delivery ID

    • event: Event type

    • status: success/failed

    • response_code: HTTP response code

    • response_time_ms: Response time

    • attempted_at: Attempt timestamp

    • error: Error message (if failed)

  • total: Total delivery count

  • success_rate: Percentage of successful deliveries

EXAMPLE: User: "Show me failed deliveries for this webhook" get_webhook_deliveries({ webhook_id: "wh_mmmpdbvj_8b7c5a59296d", status: "failed", limit: 20 })

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of deliveries to return (default: 50, max: 100)
statusNoFilter by delivery status
webhook_idYesWebhook ID to get deliveries for (wh_xxx format or legacy ObjectId)
Behavior4/5

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

With no annotations, the description carries the full burden. It discloses the return structure in detail (deliveries array with fields, total, success_rate) and provides an example, which goes beyond schema to explain behavior. It does not mention side effects (likely none) or auth requirements, but for a read-only tool this is adequate.

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

Conciseness5/5

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

The description is well-organized into a one-line summary, WHEN TO USE, RETURNS, and an EXAMPLE. Each section adds value without redundancy and it is appropriately sized for the tool's complexity.

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

Completeness5/5

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

Despite having no output schema or annotations, the description compensates by thoroughly explaining return values, usage context, and providing an example. It covers the essential operational details an agent needs to invoke the tool effectively.

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

Parameters3/5

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

Schema coverage is 100% with descriptions for all three parameters. The description adds an example with realistic values but does not significantly expand on parameter meaning beyond what schema already provides. Therefore the baseline of 3 applies.

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

Purpose5/5

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

The description clearly states 'Get delivery history for a webhook' with a specific verb and resource. This distinguishes it from siblings like list_webhooks and test_webhook, which serve different purposes.

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 'WHEN TO USE' section lists concrete scenarios (debugging failed deliveries, auditing activity, checking success rates), providing clear context. It does not explicitly exclude alternatives or mention when not to use, but the context is sufficient for selection.

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

list_accountsAInspect

[AdCP Accounts] List the accounts this credential can transact on.

This seller's account model is 'explicit': one API key IS one account, so this returns exactly one account — the partner behind the key. Use it to discover your account_id before any account-scoped call, and to confirm the account's status before you buy.

WHEN TO USE:

  • Discovering the account_id to pass to account-scoped tasks

  • Checking your account is 'active' before creating a media buy

  • Introspecting what your key is permitted to do (accounts[].authorization.allowed_tasks)

RETURNS:

  • accounts: AdCP Account objects (account_id, name, status, operator, brand, billing, account_scope) plus an authorization object naming the tasks this key may invoke

  • pagination: has_more is always false — one credential, one account

EXAMPLE: list_accounts({}) list_accounts({ status: "active" })

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoFilter by account status. Omit to return the account in any status.
accountNoExact account filter. Either account_id, or the natural key (brand.domain + operator). Returns empty when it does not match this credential's account — which is how you confirm the key you hold is the one you meant.
contextNo
sandboxNoFilter by sandbox status — matched against the account's real state, not a stub. A sandbox account validates a buy exactly as a live one does (same errors, same codes) but books no placements and marks every response sandbox: true, so it is safe to exercise end to end. Sandbox is our classification, not buyer-settable: ask for a sandbox credential rather than sending sandbox on a live key.
paginationNo
Behavior4/5

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

With no annotations, the description carries the full burden. It discloses the single-account model, that pagination has_more is always false, and that it returns authorization.allowed_tasks. It also signals that the call is safe to use before account-scoped operations, though it does not explicitly state read-only semantics.

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 well-structured with clear sections (WHEN TO USE, RETURNS, EXAMPLE) and front-loads the core statement. Every sentence contributes useful context; no filler or repetition.

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

Completeness4/5

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

The tool is moderately complex (5 params, nested objects, no output schema), and the description adequately covers return shape and edge behavior (has_more false). It is sufficient for an agent to invoke correctly, though it could mention the 'context' parameter's purpose or explicitly state no side effects.

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 60%, and the description adds value through examples (status filter) and the one-account model that explains why results are singular. However, it does not clarify the 'context' parameter or the full behavior of the 'account' nested filter 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 opens with a specific verb and resource: 'List the accounts this credential can transact on.' It further clarifies the one-key-one-account model, making it unmistakably distinct from sibling tools like list_media_buys or sync_accounts. The scope and output are explicitly defined.

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?

A dedicated 'WHEN TO USE' section lists three concrete scenarios, such as discovering account_id and checking active status before creating a media buy. It lacks an explicit 'when not to use' or named alternatives, but the context is clear enough to guide an agent.

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

list_creative_formatsAInspect

[AdCP Media Buy] List the creative formats this network actually accepts.

Every format is DERIVED from live per-screen capability (panel size, min/max spot length, audio) — not a hand-written list. The set published here is exactly the set sync_creatives accepts: if a creative matches a format returned by this tool, it will not be rejected for dimensions, duration or file size.

WHEN TO USE:

  • Before building creative, to size it to the panels you are buying

  • To check whether an existing asset can run on this network

  • To find the panel sizes with the most reach (results are ordered by live screen count)

RETURNS:

  • formats: AdCP Format objects (format_id, name, renders[].dimensions, assets[].requirements)

  • pagination: cursor-based; total_count is the full catalogue size

  • Each format carries ext.trillboards with the live screen count, the share of the network, how many of those screens have audio, and — for video — duration_coverage: how many screens accept a spot of at most 10/15/20/30/60/120/300 seconds. A long ceiling does not mean every screen at that size can play it, and this says so.

EXAMPLE: User: "What sizes and lengths does this network take?" list_creative_formats({ pagination: { max_results: 20 } })

User: "Can I run a 1080x1920 portrait video?" list_creative_formats({ format_ids: [{ agent_url: "https://api.trillboards.com/mcp", id: "dooh_video_1080x1920" }] })

ParametersJSON Schema
NameRequiredDescriptionDefault
contextNo
max_widthNoMaximum render width in pixels (inclusive)
min_widthNoMinimum render width in pixels (inclusive)
format_idsNoReturn only these formats. Each entry is an AdCP structured format reference ({agent_url, id}), never a bare string.
max_heightNoMaximum render height in pixels (inclusive)
min_heightNoMinimum render height in pixels (inclusive)
paginationNoCursor-based pagination
asset_typesNoFilter to formats containing these asset types, e.g. ['video'] or ['image'].
name_searchNoCase-insensitive partial match on the format name
is_responsiveNoFilter for responsive formats. Every DOOH panel is a fixed pixel grid, so true matches nothing here.
publisher_domainNoResolve formats for this publisher. This agent derives formats from its own inventory only, so anything other than 'trillboards.com' returns an empty list with UNSUPPORTED_PUBLISHER_DOMAIN.
Behavior5/5

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

With no annotations, the description carries the transparency burden, and it excels: it explains formats are live-derived rather than hand-written, results are ordered by screen count, pagination is cursor-based, and the ext.trillboards field contains nuanced metrics like duration_coverage. It even cautions that a long duration ceiling does not guarantee every screen can play it—exactly the kind of behavioral nuance needed.

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 long but exceptionally well-structured with clear WHEN TO USE, RETURNS, and EXAMPLE sections. Every segment earns its place—no filler or repetition of schema details—and the example demonstrates real query patterns, making the information easy to scan and apply.

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 11 parameters, no output schema, and complexity around per-screen capabilities, the description is remarkably complete. It details the return shape (format objects with renders and assets), pagination semantics, and the full ext.trillboards metrics, including the reach/audio/duration coverage nuances. The example grounds it in concrete user queries, leaving little ambiguity for an agent.

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

Parameters3/5

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

Schema description coverage is 91%, so the schema already documents nearly all parameters. The description adds some value via the example showing proper format_ids structure ({agent_url, id}) and pagination usage, but it does not substantially augment the parameter meaning beyond what the schema provides, meriting the baseline 3.

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 'List the creative formats this network actually accepts'—a specific verb, resource, and scope. It further distinguishes the tool from siblings by emphasizing that the list is derived from live per-screen capability and exactly matches what sync_creatives accepts, so it is not a generic inventory listing.

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?

A dedicated 'WHEN TO USE' section gives explicit scenarios: sizing creative before building, validating an existing asset, and finding panel sizes with most reach. It references sync_creatives to align acceptance but does not explicitly state when not to use it or compare to alternative tools, so it falls short of full 5.

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

list_creativesAInspect

[AdCP Creative] List the creatives this buyer has on file with us.

OUR LIBRARY IS PER-BUY, AND THIS SAYS SO. AdCP's creative library models concepts, variables, assignments and snapshots; ours does not have those. A creative here is the one asset attached to a media buy by sync_creatives, so this is a projection of YOUR OWN buys — never someone else's assets, and never an invented concept_id to look richer than we are.

WHEN TO USE:

  • To confirm a creative you sent actually landed, and where it is in review

  • To see which media buy a creative is attached to (include_assignments: true)

  • Before cancelling a buy, to check what happens to its creative

RETURNS:

  • creatives[]: creative_id, name, format_id ({agent_url, id}), status, created_date, updated_date. Status is 'pending_review' until the buy is servable, then 'approved' — every creative goes through the same moderation every other creative on this network goes through.

  • query_summary: total_matching + returned

  • pagination: cursor-based, with total_count

EXAMPLE: User: "Did my creative go through?" list_creatives({ filters: { media_buy_ids: ["mbuy_123"] }, include_assignments: true })

ParametersJSON Schema
NameRequiredDescriptionDefault
extNo
sortNo
fieldsNo
accountNo
contextNo
filtersNoNarrow the result set. All fields optional.
paginationNo
include_itemsNo
include_purgedNo
include_pricingNo
include_snapshotNo
include_variablesNo
include_assignmentsNoInclude which media buys each creative is attached to.
webhook_activity_limitNo
include_webhook_activityNo
Behavior5/5

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

With no annotations, the description carries full responsibility for disclosing behavior. It explains the per-buy scoping, the relationship to sync_creatives, the status lifecycle (pending_review to approved after moderation), and explicitly states it never returns others' assets or invented concept_ids. This is rich, honest disclosure beyond a basic list operation.

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

Conciseness3/5

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

The description is organized into clear sections (WHEN TO USE, RETURNS, EXAMPLE) but contains redundant or emotional phrasing like 'OUR LIBRARY IS PER-BUY, AND THIS SAYS SO' and 'to look richer than we are.' It is longer than necessary and not every sentence earns its place, though the structure helps navigation.

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

Completeness4/5

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

Given no annotations, no output schema, and 15 parameters, the description provides substantial context: return field names, cursor-based pagination, status transitions, and a realistic example. It does not document every optional parameter or potential error condition, but for a list operation, it covers the core usage and behavior well.

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

Parameters3/5

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

Schema description coverage is only 13%, so the description must compensate. It adds meaning for include_assignments, status values, and filters.media_buy_ids via the example, but leaves many parameters (include_purged, include_pricing, include_snapshot, webhook_activity_limit, etc.) unexplained. It adds some semantics but not enough for full parameter understanding.

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

Purpose5/5

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

The description clearly states it lists the creatives a buyer has on file, with a specific verb and resource. It differentiates itself from AdCP's more complex library and from sibling tools like sync_creatives and list_creative_formats by clarifying the per-buy, projection-of-own-buys scope.

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

Usage Guidelines4/5

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

A dedicated 'WHEN TO USE' section lists three concrete scenarios: confirming creative landing/review status, seeing attached media buys, and checking implications before cancelling a buy. It does not explicitly name alternative tools or when-not-to-use, so it falls short of a 5, but the guidance is clear and practical.

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

list_devicesAInspect

List all devices registered to the partner account.

WHEN TO USE:

  • Getting an overview of all connected devices

  • Finding devices by status (online/offline)

  • Auditing the device fleet

RETURNS:

  • devices: Array of device objects

  • total: Total device count

  • online_count: Number of online devices

  • offline_count: Number of offline devices

EXAMPLE: User: "Show me all my online devices" list_devices({ status: "online", limit: 50 })

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of devices to return (default: 50, max: 100)
offsetNoPagination offset
statusNoFilter by device status
device_typeNoFilter by device type
Behavior4/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It details the return structure (devices, total, counts) and implies a read-only operation, but it does not mention potential side effects, permissions, or rate limits. Given the read-only nature is self-evident and the return format is disclosed, this is solid but not exhaustive.

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 efficiently structured with distinct sections: purpose, when-to-use, returns, and an example. Every section adds value, and the main purpose is front-loaded in the first sentence. No wasted words.

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

Completeness5/5

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

Despite lacking an output schema and annotations, the description provides a clear return structure, example invocation, and usage scenarios. This compensates well for the missing structured context, making the tool's behavior and expected output fully understandable for an agent.

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

Parameters3/5

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

The schema already describes all four parameters with 100% coverage, so the description adds limited new semantics. It provides an example showing 'status' and 'limit' usage, which slightly enriches understanding, but the schema remains the primary source of parameter meaning. 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 opens with 'List all devices registered to the partner account,' which is a specific verb+resource statement. It clearly distinguishes itself from siblings like get_device (single device) and delete_device by focusing on listing all devices with optional filters.

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 'WHEN TO USE' section explicitly lists three use cases (overview, finding by status, auditing). It provides clear context for when to invoke the tool, though it does not explicitly mention alternatives or when not to use it, so it stops short of a full 5.

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

list_endpointsAInspect

List every registered Trillboards API operation.

WHEN TO USE:

  • First call in an agent session to learn what the API offers.

  • Filter to agent_safe=true to list only side-effect-free endpoints.

  • Narrow to a single surface (data-api, sdk-api, device-api, sensing-api, partner-api-generated, dsp-api-generated).

RETURNS:

  • operations: Array of { surface, method, path, operation_id, summary, description, agent_safe, idempotent, cost_tier, tags, doc_url, example_request }

  • total_operations: Total count.

  • surfaces: Known surface identifiers.

EXAMPLE: Agent: "What read-only endpoints can I call?" list_endpoints({ agent_safe: true })

ParametersJSON Schema
NameRequiredDescriptionDefault
surfaceNoFilter to one surface (e.g. "data-api").
agent_safeNoWhen true, return only endpoints flagged agent-safe.
idempotentNoWhen true, return only endpoints flagged idempotent.
Behavior4/5

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

With no annotations, the description carries the full burden. It discloses the return structure in detail, including operations array, total_operations, and surfaces, and explains filtering behavior. It does not mention potential rate limits or auth, but for a read-only list tool, it provides substantial behavioral context.

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 well-organized into WHEN TO USE, RETURNS, and EXAMPLE sections. Every section contributes essential information: usage context, return fields, and a concrete invocation. It is appropriately sized without fluff.

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

Completeness5/5

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

Given no output schema and no annotations, the description fully compensates by declaring all return fields, explaining the surface concept, and providing a usage example. It is comprehensive enough for an agent to understand what list_endpoints does and how to invoke it.

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 value by explaining the practical meaning of agent_safe ('side-effect-free endpoints') and giving a concrete example with agent_safe: true, going slightly beyond the schema's terse descriptions.

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

Purpose5/5

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

The description immediately states 'List every registered Trillbirds API operation,' using a specific verb and resource. It clearly distinguishes from the sibling tool describe_endpoint by covering all operations rather than just one.

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

Usage Guidelines5/5

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

The 'WHEN TO USE' section explicitly says to use this as a first call in an agent session, to filter with agent_safe, and to narrow by surface. This provides concrete context and contrasts with more specific tools like describe_endpoint, even though it does not name alternatives directly.

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

list_error_codesAInspect

List every error code in the Trillboards API error catalog.

WHEN TO USE:

  • Understanding what error codes the API can return.

  • Building a client-side error handler that covers all cases.

  • Looking up error types, HTTP statuses, and documentation URLs.

RETURNS:

  • object: "list"

  • data: Array of { code, type, http_status, description, doc_url }

  • total: Total number of error codes.

Equivalent to GET /v1/errors but executed in-process (no HTTP round-trip).

EXAMPLE: Agent: "What error codes can the API return?" list_error_codes()

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Behavior4/5

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

With no annotations provided, the description carries full behavioral burden. It discloses that the tool is equivalent to GET /v1/errors but executed in-process (no HTTP round-trip), which is a meaningful behavioral trait. It also specifies the return structure, including the 'list' object, 'data' array, and 'total' count. This adds valuable context beyond what structured fields would convey.

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 well-structured with clear sections: DESCRIPTION, WHEN TO USE, RETURNS, and EXAMPLE. It is appropriately sized for the information provided—every sentence contributes meaning, from the main purpose to the in-process equivalence to the return payload. The example is concise and illustrative without being redundant.

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

Completeness5/5

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

For a zero-parameter, no-output-schema tool, this description is fully complete. It covers the purpose, usage scenarios, return shape, and underlying API equivalence. The explicit 'RETURNS' section compensates for the lack of an output schema by detailing the exact structure of the response.

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 per guidelines the baseline score is 4. The description does not need to compensate for missing schema coverage, as there are no parameters to document. The included example call (list_error_codes()) further confirms the no-argument usage.

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

Purpose5/5

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

The description opens with a specific verb+resource statement: 'List every error code in the Trillbacks API error catalog.' This clearly identifies the tool's purpose and scope. It also distinguishes itself from sibling list_* tools by focusing on the error catalog, making it 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 'WHEN TO USE' section explicitly enumerates three concrete use cases (understanding error codes, building client-side error handlers, looking up error types). This provides clear context for when to invoke the tool, though it does not explicitly mention alternatives or exclusions. Sibling tools like list_endpoints are different enough that the context is sufficient.

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

list_tasksBInspect

[AdCP Protocol] List AdCP tasks belonging to your account, newest first.

Returns query_summary (totals and a status breakdown), tasks, and pagination. Filter by status or task type. Scoped to the calling account — an unauthenticated call returns an empty page rather than another account's tasks.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNo
contextNo
filtersNoNarrow the returned tasks.
paginationNo
Behavior4/5

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

With no annotations provided, the description carries the full burden of transparency. It discloses return fields (query_summary, tasks, pagination), ordering, filtering capability, account scoping, and the specific behavior of unauthenticated calls. This goes beyond typical descriptions, though it omits potential error cases or rate limits.

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

Conciseness5/5

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

The description is concise and well-structured: it opens with the core purpose, then return value, then filtering, then scoping behavior. Every sentence contributes useful information with no wasted words.

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

Completeness3/5

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

For a list tool with no annotations and no output schema, the description provides a reasonable high-level overview including response shape and scoping. However, it is incomplete concerning the account and context parameters, potential filter combinations, and differentiation from similar sibling tools, making it adequate but not comprehensive.

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

Parameters2/5

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

Schema description coverage is low (25% per signal). The description only says 'Filter by status or task type,' which merely echoes schema descriptions for the filters object. It does not explain the account or context parameters, which are complex nested objects lacking descriptions in 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 clearly states the tool's function with a specific verb ('List') and resource ('AdCP tasks'), adding scope ('belonging to your account') and ordering ('newest first'). However, it does not explicitly distinguish itself from sibling tools like tasks_list or tasks_get, which likely serve a similar purpose.

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

Usage Guidelines2/5

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

There is no guidance on when to use this tool versus alternatives such as tasks_list or tasks_get. The description mentions filtering by status or task type and notes an unauthenticated call returns an empty page, but these are operational details rather than usage guidance.

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

list_webhooksAInspect

List all webhook subscriptions for the partner account.

WHEN TO USE:

  • Viewing all configured webhooks

  • Auditing webhook subscriptions

  • Finding a webhook to update or delete

RETURNS:

  • webhooks: Array of webhook objects with:

    • webhook_id: Unique identifier

    • url: Endpoint URL

    • events: Subscribed events

    • enabled: Whether webhook is active

    • created_at: Creation timestamp

    • last_delivery: Last successful delivery time

EXAMPLE: User: "Show me all my webhooks" list_webhooks({})

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Behavior3/5

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

No annotations are provided, so the description carries the full burden. It does not explicitly state that the operation is read-only or side-effect-free, the return format is described in detail. However, it lacks information about pagination, ordering, rate limits, or authentication requirements, which would be valuable for a list operation with no annotation safety hints.

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

Conciseness5/5

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

The description is well-organized with clear sections: summary, when-to-use, returns, and an example. Every sentence serves a purpose, and the key information is front-loaded. It avoids redundancy and is appropriately sized for the tool's simplicity.

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 zero parameters, no annotations, and no output schema, this is a simple tool. The description compensates by detailing the return object fields (webhook_id, url, events, enabled, created_at, last_delivery) and providing a concrete example. It is fully complete for the scope of 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?

The tool has zero parameters and the schema coverage is 100% (vacuously). Per the rubric, 0 params yields a baseline of 4. The description adds no parameter details because none exist, and the example call list_webhooks({}) confirms the empty input.

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 'List all webhook subscriptions for the partner account' clearly states the verb (List), resource (webhook subscriptions), and scope (partner account). It is easily distinguished from sibling tools like create_webhook, delete_webhook, and update_webhook, which perform different actions on the same resource.

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

Usage Guidelines4/5

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

A dedicated 'WHEN TO USE' section lists three concrete use cases: viewing all configured webhooks, auditing subscriptions, and finding a webhook to update or delete. This gives clear context but does not explicitly name alternative tools or provide when-not-to-use guidance, though the suggested workflow implies you would use update/delete tools after finding the webhook.

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

log_eventAInspect

[AdCP Media Buy] Record a conversion or attribution event.

Records conversion events for post-campaign attribution analysis. Events are deduplicated by event_id + event_type combination.

WHEN TO USE:

  • Recording offline conversions (store visits, purchases)

  • Tracking post-view attribution events

  • Logging custom KPI events

EXAMPLE: log_event({ media_buy_id: "mbuy_abc123", event: { event_id: "conv_12345", event_type: "store_visit", value_cents: 5000, screen_id: "507f1f77bcf86cd799439011", metadata: { store: "NYC-001", dwell_minutes: 12 } } })

ParametersJSON Schema
NameRequiredDescriptionDefault
eventYesEvent data
media_buy_idYesMedia buy ID
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It discloses deduplication by event_id + event_type, which is a key behavior. However, it does not mention side effects, permissions, or what happens on duplicate events, leaving some gaps.

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

Conciseness5/5

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

The description is well-structured with a clear introduction, dedup note, WHEN TO USE section, and a concise example. Every section earns its place without unnecessary verbosity.

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 tool involves a nested object with two required parameters, and the description covers purpose, usage triggers, dedup behavior, and provides a complete example. It does not explain return values or error scenarios, but the absence of an output schema makes this acceptable.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The example adds substantial semantic value by showing a realistic nested event object, and the dedup note clarifies the purpose of the event_id/event_type combination.

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

Purpose5/5

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

The description clearly states the tool records a conversion or attribution event, using a specific verb and resource. It distinguishes itself from sibling tools like record_impression by focusing on conversions/attribution events.

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

Usage Guidelines4/5

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

Provides explicit 'WHEN TO USE' guidance with three concrete scenarios, making it clear when this tool is appropriate. Does not explicitly mention alternatives or exclusions, but the scenarios are specific enough.

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

predictive_queryAInspect

Generate predictive insights from observation patterns. Predict whether a venue is likely to see increased foot traffic based on current patterns.

Uses historical observation_stream data to compute trend analysis via linear regression on time-bucketed metrics. Generates predictions with confidence intervals based on the observed trend, variance, and sample size.

WHEN TO USE:

  • Predicting future audience patterns at a venue or screen

  • Forecasting foot traffic trends for campaign planning

  • Understanding whether metrics are trending up, down, or stable

  • Making data-driven decisions about inventory and pricing

RETURNS:

  • prediction: The predicted trend and expected values

    • trend: 'increasing' | 'decreasing' | 'stable'

    • current_avg: Current average metric value

    • predicted_avg: Predicted average over the time horizon

    • change_pct: Expected percentage change

    • confidence_interval: { lower, upper } bounds

  • confidence: Overall prediction confidence (0-1)

  • supporting_data: Recent data points that inform the prediction

    • data_points: Array of { bucket, avg_value, sample_count }

    • total_observations: Total observations analyzed

  • methodology: Description of the prediction approach

  • suggested_next_queries: Follow-up queries to refine the prediction

EXAMPLE: User: "Will this QSR venue see more foot traffic next week?" predictive_query({ question: "Will foot traffic increase at QSR venues?", venue_type: "restaurant_qsr", time_horizon: "7d" })

User: "Predict audience attention trends for this screen" predictive_query({ question: "What will audience attention look like?", screen_id: "507f1f77bcf86cd799439011", time_horizon: "3d" })

ParametersJSON Schema
NameRequiredDescriptionDefault
questionYesNatural language question about the predicted trend or outcome
screen_idNoFilter predictions to a specific screen (mongo ID). Optional.
venue_typeNoFilter predictions to a specific venue type. Optional.
time_horizonNoHow far ahead to predict (e.g., "1d", "3d", "7d", "14d"). Default: "7d", max: "30d"
Behavior4/5

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

With no annotations, the description fully carries transparency. It explains the underlying methodology (linear regression on time-bucketed metrics), describes confidence intervals, supporting data, and return structure, and notes it uses historical observation_stream data. It doesn't mention limitations like minimum data requirements, but for a non-destructive query tool this is sufficient.

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 well-structured with Purpose, WHEN TO USE, RETURNS, and EXAMPLE sections. Every section adds distinct value, and the content is front-loaded with the core purpose. While lengthy, it is appropriately detailed for a predictive tool with no output schema.

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

Completeness5/5

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

Given the tool has no output schema, the RETURNS section thoroughly enumerates the response structure, including nested objects like confidence_interval and supporting_data. The examples cover both venue_type and screen_id filters. This makes the description highly complete for an agent to use 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 adds value by showing two realistic example calls that illustrate how to phrase 'question' and combine optional filters. It also clarifies the 'time_horizon' format in the example even though the schema already documents it.

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

Purpose5/5

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

The description opens with a specific verb 'Generate predictive insights from observation patterns' and explicitly states it predicts whether a venue will see increased foot traffic. The 'WHEN TO USE' section further distinguishes it from sibling prediction tools by focusing on trend forecasting for audience patterns and campaign planning.

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?

A dedicated 'WHEN TO USE' section lists four concrete scenarios, making the intended use clear. However, it does not explicitly name alternative tools or state when not to use this tool, so it stops short of the highest standard.

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

predict_moment_qualityAInspect

Predict the VAS (Viewability Attention Score) a specific creative would achieve at a given moment, based on historical data and causal modeling.

Uses the CausalPredictionService which:

  1. Embeds the moment description to find historically similar moments

  2. If >= 5 similar moments exist with the same creative, uses weighted-average prediction

  3. If insufficient data, falls back to Gemini generative prediction

  4. Always decomposes the prediction into causal factors

WHEN TO USE:

  • Evaluating whether a creative will perform well in a specific context

  • A/B testing creative placement hypotheses before committing budget

  • Understanding which causal factors drive VAS for a creative

  • Comparing expected performance across different moment types

RETURNS:

  • prediction: { predictedVAS (0-1), confidence (0-1), method ('historical'|'model'), sampleSize }

  • causal_factors: { audienceMatch, contextMatch, attentionState, socialPotential } (each 0-1)

  • metadata: { creative_id, moment_description }

  • suggested_next_queries: Follow-up queries

EXAMPLE: User: "How would a coffee ad perform at a transit station during morning rush?" predict_moment_quality({ moment_description: "transit venue, morning commute, 12 viewers, high attention, mostly 25-34 age range", creative_id: "coffee-brand-morning-30s" })

ParametersJSON Schema
NameRequiredDescriptionDefault
creative_idYesThe creative/ad ID to predict performance for.
moment_descriptionYesNatural-language description of the target moment context. Include venue type, time of day, audience size, demographics, attention level, etc.
Behavior4/5

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

With no annotations, the description carries the full burden. It discloses the algorithm steps (embedding, similarity threshold, weighted-average vs. generative fallback, causal decomposition) and return structure. It does not cover rate limits or error behavior, but the core behavioral logic is well explained.

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 well-organized with clear sections (purpose, algorithm, WHEN TO USE, RETURNS, EXAMPLE). Every sentence adds valuable information, and the front-loaded purpose makes it easy to grasp the tool's function quickly.

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

Completeness5/5

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

For a tool with two parameters and no output schema, the description is remarkably complete. It summarizes the return object, provides usage scenarios, explains the fallback logic, and includes a concrete example, giving an AI agent 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.

Parameters4/5

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

The schema already covers 100% of parameters with descriptive text. The description adds value by providing an example that shows exactly what to include in moment_description (venue, time, audience, demographics) and explains how the parameter is used in the prediction process, going beyond the schema.

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

Purpose5/5

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

The description clearly states what the tool does: predicts VAS for a creative in a specific moment using historical data and causal modeling. It specifies the exact resource (creative + moment) and output (VAS score), distinguishing it from sibling tools like get_attention_metrics or recommend_creative.

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 'WHEN TO USE' section provides clear scenarios such as evaluating creative placements, A/B testing, and understanding causal factors. However, it does not explicitly mention alternatives or when not to use this tool, which would be beneficial given the large sibling list.

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

provide_performance_feedbackAInspect

[AdCP Media Buy] Provide optimization signals from buyer agent.

Accepts feedback from buyer agents for floor price adjustment and inventory optimization. Enables closed-loop optimization between buyer and seller agents.

WHEN TO USE:

  • Sending bid response feedback to optimize future pricing

  • Providing conversion data for bid price calibration

  • Adjusting floor prices based on demand signals

EXAMPLE: provide_performance_feedback({ media_buy_id: "mbuy_abc123", feedback: { type: "bid_response", avg_bid_price_cpm: 6.5, fill_rate_percent: 72, preferred_hours: [8, 9, 10, 17, 18], quality_score: 0.85 } })

ParametersJSON Schema
NameRequiredDescriptionDefault
feedbackYesPerformance feedback data
media_buy_idYesMedia buy ID
Behavior3/5

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

No annotations are provided, so the description must disclose behavior. It explains the intended effect (floor price adjustment, inventory optimization, closed-loop optimization) but does not detail side effects, idempotency, request/response behavior, or whether the operation is synchronous.

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 well-structured with a concise intro, a bulleted 'WHEN TO USE' list, and a clear example. Every section earns its place, and the main purpose is front-loaded.

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

Completeness4/5

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

For a tool with two parameters and no output schema, the description covers purpose, use cases, and includes an example. It omits return value or side effect details, but that is not strictly necessary for this type of 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%, so the schema already documents each parameter. The description adds a realistic example with actual values, which helps illustrate usage but does not add significant semantic meaning beyond the schema's field descriptions.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'Provide optimization signals from buyer agent' and 'Accepts feedback from buyer agents for floor price adjustment and inventory optimization.' This distinguishes it from sibling tools like create_media_buy or update_media_buy, which handle media buy management rather than feedback.

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 'WHEN TO USE' section lists concrete scenarios: sending bid response feedback, providing conversion data, and adjusting floor prices. It gives clear context for when to invoke the tool, though it does not explicitly mention when not to use it or alternative tools.

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

purchase_creditsAInspect

Purchase committed-use credits at a discount. Three tiers: tier_500 ($500 → $625 credit, 25% bonus), tier_2000 ($2,000 → $3,100 credit, 55% bonus), tier_5000 ($5,000 → $10,000 credit, 100% bonus). Requires an active payment method.

ParametersJSON Schema
NameRequiredDescriptionDefault
tierYesCredit purchase tier
Behavior4/5

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

With no annotations provided, the description carries the full burden. It discloses pricing, bonus tiers, and the payment method prerequisite. While it doesn't mention immediate charging, reversibility, or result handling, the concrete numbers and requirement give substantial behavioral context beyond a generic 'purchase'.

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 clear, front-loaded sentences. The first states the purpose, the second packs the tier specifics and requirement without waste. Every word adds value and is easy to parse.

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

Completeness4/5

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

For a single-parameter tool with no output schema, the description covers purpose, parameter semantics, and a prerequisite. It does not describe the expected response or follow-up actions, but given the simplicity and the fact that the effect (credits added) is implied, it is sufficiently complete.

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

Parameters5/5

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

The schema only labels the tier parameter as 'Credit purchase tier' and lists enum values. The description enriches this by attaching real-world meaning to each enum (e.g., tier_500 → $500 payment yielding $625 credit), which is essential for correct selection and invocation.

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

Purpose5/5

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

The description clearly states the action ('Purchase committed-use credits') with a specific verb and resource, and differentiates from siblings like setup_billing by focusing on the credit purchase transaction. The tier details further specify exactly what the tool does.

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

Usage Guidelines4/5

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

The description provides clear context for when to use (to buy committed-use credits at a discount) and a key prerequisite ('Requires an active payment method'). However, it does not explicitly contrast with alternatives like setup_billing or get_billing_status, so it misses explicit exclusion guidance.

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

query_changelogAInspect

Query the Trillboards API changelog for recent changes, breaking changes, deprecations, and fixes.

WHEN TO USE:

  • Check what has changed in the API before upgrading an integration.

  • Find breaking changes since a specific date.

  • Discover new features added to a specific API surface.

PARAMETERS:

  • since (YYYY-MM-DD, optional): Only entries dated on or after this date. Unreleased entries are always included.

  • type (string, optional): Filter by change category. Accepts: "breaking" → changed + removed entries "additive" → added entries "deprecation" → deprecated entries "fix" → fixed entries Can be comma-separated: "breaking,deprecation"

RETURNS:

  • object: "list"

  • data: Array of { version, date, type, surface, description }

  • total: Number of matching entries.

EXAMPLE: Agent: "What broke since April 1st?" query_changelog({ since: "2026-04-01", type: "breaking" })

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoFilter by change category: "breaking", "additive", "deprecation", "fix". Comma-separated for multiple.
sinceNoOnly entries dated on or after this date (YYYY-MM-DD). Unreleased entries are always included.
Behavior3/5

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

Without annotations, the description carries the full burden. It discloses the return structure (object with 'list' and 'data' array of objects) and notes that unreleased entries are always included. However, it does not explicitly state that the operation is read-only, address rate limits, or describe ordering/pagination, leaving some behavioral gaps.

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

Conciseness4/5

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

The description is well-structured with clear headings (WHEN TO USE, PARAMETERS, RETURNS, EXAMPLE) and front-loaded with the purpose. It is somewhat longer than necessary due to repeating schema content, but it remains organized and each section adds value, so it earns a 4.

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 only two parameters and no output schema, the description provides rich context: usage scenarios, parameter explanations, return format, and a concrete example. This is complete for the tool's complexity and makes up for the lack of an output schema.

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

Parameters3/5

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

Schema coverage is 100%, and the description's PARAMETERS section essentially reiterates the schema descriptions. The example at the end adds practical usage context but does not introduce new parameter semantics beyond what the schema already documents, 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 clearly states 'Query the Trillboards API changelog for recent changes, breaking changes, deprecations, and fixes,' which precisely identifies the tool's function and resource. It distinguishes from sibling tools like get_analytics or list_error_codes by being specifically about the changelog.

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 'WHEN TO USE' section explicitly provides three concrete scenarios, such as checking changes before upgrading an integration or finding breaking changes since a date. This gives clear context for when to use the tool, though it does not explicitly mention alternatives or exclusions, so a 4 is appropriate.

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

query_observationsAInspect

Query the universal observation stream using natural language or structured filters. Returns multi-modal sensing data (audience, vehicle, environment, commerce) from physical-world observations across the screen network.

WHEN TO USE:

  • Exploring raw observation data from edge AI sensors on screens

  • Filtering observations by venue type, device, time range, or geography

  • Getting audience, vehicle, environment, or commerce observation data

  • Answering natural language questions about what screens are sensing

RETURNS:

  • data: Array of observation objects with device, venue, payload, confidence, model versions

  • metadata: { observation_count, time_range, coverage_pct, model_versions }

  • suggested_next_queries: Contextual follow-up queries

Each observation includes:

  • observation_id, device_id, screen_mongo_id, venue_type

  • observed_at: Timestamp of the observation

  • observation_family: audience | vehicle | environment | commerce

  • payload: JSONB with model outputs (face_count, emotion, vehicle_count, etc.)

  • confidence: Model confidence score (0-1)

  • evidence_grade: Quality grade of the observation

  • model_versions: Which ML models produced this data

EXAMPLE: User: "Show me audience observations at QSR venues in the last hour" query_observations({ query: "audience observations at QSR venues", filters: { observation_family: ["audience"], venue_type: ["restaurant_qsr"], time_range: { start: "2026-03-16T14:00:00Z", end: "2026-03-16T15:00:00Z" } }, limit: 50 })

User: "What are screens sensing right now?" query_observations({ query: "latest observations from all screens", limit: 20 })

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum observations to return (default: 100, max: 1000)
queryYesNatural language query describing what observations to find
filtersNoStructured filters to narrow results
Behavior4/5

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

With no annotations, the description carries the full burden and does well by disclosing the return structure (data array, metadata, suggested_next_queries) and the content of each observation. It implies a read-only query operation but does not explicitly state non-mutating behavior or potential costs, so it earns a 4 rather than 5.

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

Conciseness4/5

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

The description is well-structured with clear sections (WHEN TO USE, RETURNS, EXAMPLE) and uses bullet points for readability. It is relatively long but every section contributes value; it could be trimmed slightly without losing information, so a 4 is appropriate.

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

Completeness5/5

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

Given no output schema, the description thoroughly explains return values including observation fields, metadata, and suggested queries. It also provides concrete examples covering both natural language and structured filter usage, making the tool's behavior understandable in context.

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

Parameters3/5

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

Schema coverage is 100%, so all parameters already have meaningful descriptions. The description adds examples that demonstrate parameter usage but no new semantic detail beyond what the schema provides, aligning with the baseline of 3.

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

Purpose5/5

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

The description clearly states the tool queries the universal observation stream using natural language or structured filters, returning multi-modal sensing data. This distinctively differentiates it from siblings like semantic_search_observations and get_signals by emphasizing the raw observation stream and broad sensor families.

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 'WHEN TO USE' section explicitly lists four scenarios, providing clear guidance on when to invoke this tool. However, it does not explicitly mention when not to use it or name alternatives, just missing the full 'when-not/alternatives' bar.

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

recommend_creativeAInspect

Given a moment description, rank candidate creatives by predicted VAS performance.

Evaluates each creative candidate against the described moment context using historical similarity and causal prediction. Returns a ranked list sorted by predicted VAS score, with confidence levels for each prediction.

WHEN TO USE:

  • Choosing which creative to show at a specific moment/venue

  • Comparing multiple creatives for a campaign across different contexts

  • Optimizing creative rotation for maximum VAS

  • Pre-campaign creative selection based on audience and venue

RETURNS:

  • rankings: Array sorted by predicted VAS (descending)

    • creativeId, predictedVAS (0-1), confidence (0-1), rank (1-N)

  • metadata: { candidate_count, moment_description }

  • suggested_next_queries: Follow-up queries

EXAMPLE: User: "Which of these 3 creatives will perform best at a gym in the evening?" recommend_creative({ moment_description: "gym venue, evening, 6 viewers, high attention, mostly male 18-34", creative_ids: ["fitness-brand-30s", "energy-drink-15s", "tech-gadget-20s"] })

ParametersJSON Schema
NameRequiredDescriptionDefault
creative_idsYesArray of creative/ad IDs to rank. Maximum 20 candidates.
moment_descriptionYesNatural-language description of the target moment context.
Behavior4/5

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

The description discloses the evaluation approach (historical similarity and causal prediction), the output structure (ranked list sorted by predicted VAS with confidence levels), and includes a detailed returns section. It does not mention side effects or limitations, which is acceptable for a read-only prediction tool with no 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 well-structured with sections for overview, when to use, returns, and an example. It front-loads the core purpose, and while longer than a two-sentence description, every section adds necessary 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?

With no output schema, the description fully compensates by detailing the return shape (rankings with creativeId, predictedVAS, confidence, rank; metadata; suggested_next_queries) and providing a concrete example. This gives the agent a complete picture of how to invoke and interpret the tool.

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

Parameters4/5

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

The input schema already provides 100% coverage for both parameters. The description goes further by including a fully worked example that demonstrates the expected format for moment_description (e.g., 'gym venue, evening, 6 viewers') and creative_ids, adding practical meaning beyond the schema's basic field descriptions.

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

Purpose5/5

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

The first sentence 'Given a moment description, rank candidate creatives by predicted VAS performance' clearly states a specific action (rank) and resource (candidate creatives) tied to a prediction goal. It distinguishes from sibling tools like get_content_recommendations by focusing on ranking specific candidates for a given moment context.

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 'WHEN TO USE' section lists four concrete use cases: creative selection, comparing multiple creatives, rotation optimization, and pre-campaign selection. It provides clear context on when the tool is appropriate, though it does not explicitly name alternatives or cases where it should not be used.

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

record_impressionAInspect

Record a single ad impression from a device.

WHEN TO USE:

  • Reporting that an ad was displayed on a device

  • Recording impression with detailed metadata

  • Single impression events (for batch, use batch_impressions)

RETURNS:

  • success: Boolean indicating success

  • impression_id: Unique impression identifier

  • earnings: Earnings credited for this impression

EXAMPLE: User: "Record an impression for ad 507f1f77bcf86cd799439011" record_impression({ fingerprint: "P_abc123", ad_id: "507f1f77bcf86cd799439011", duration_seconds: 15 })

ParametersJSON Schema
NameRequiredDescriptionDefault
ad_idYesAdvertisement ID (MongoDB ObjectId)
metadataNoAdditional impression metadata
timestampNoISO 8601 timestamp when impression occurred (optional, defaults to now)
fingerprintYesDevice fingerprint (e.g., "P_abc123")
duration_secondsNoHow long the ad was displayed (seconds)
Behavior4/5

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

Since no annotations are provided, the description carries the full burden. It discloses the return values (success, impression_id, earnings) and implies a write operation with financial impact ('earnings credited'), giving the agent an accurate model of side effects. It does not cover auth or idempotency, but the core behavior and key consequences are clear.

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

Conciseness5/5

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

The description is well-structured with WHEN TO USE, RETURNS, and EXAMPLE sections that each serve a clear purpose. It is concise, with no redundant content, and the opening sentence immediately states what the tool does.

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

Completeness4/5

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

For a single-impression write tool with no output schema, the description fully covers return values, usage context, and an example, which is sufficient for most agent interactions. It doesn't explain the metadata parameter in depth, but the schema covers it, and the tool's complexity is moderate, so overall it's complete enough.

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

Parameters3/5

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

The input schema already describes all 5 parameters with 100% coverage, so the baseline is 3. The description adds no additional parameter meaning; the example merely uses fingerprint, ad_id, and duration_seconds without explaining them beyond the schema. Thus, it doesn't compensate beyond the schema's descriptions.

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

Purpose5/5

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

The description starts with 'Record a single ad impression from a device', clearly identifying the verb (record), resource (ad impression), and scope (single, from a device). It explicitly differentiates from batch_impressions by saying 'Single impression events (for batch, use batch_impressions)', making it easy to select among siblings.

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

Usage Guidelines5/5

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

A dedicated 'WHEN TO USE' section lists explicit scenarios such as 'Reporting that an ad was displayed on a device' and 'Recording impression with detailed metadata'. It also provides an explicit alternative: 'for batch, use batch_impressions', which is exactly the kind of guidance needed for tool selection.

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

register_deviceAInspect

Register or update a device in the partner's network.

WHEN TO USE:

  • Adding a new screen/kiosk/vending machine to the network

  • Updating device location or configuration

  • Re-registering a device after maintenance

RETURNS:

  • device_id: Your internal device ID (echoed back)

  • trillboards_device_id: Internal Trillboards device ID

  • fingerprint: Device fingerprint (e.g., "P_abc123")

  • embed_url: URL to load in the device's WebView

  • status: Device status

EXAMPLE: User: "Register a vending machine in NYC" register_device({ device_id: "vending-001-nyc", name: "NYC Office Lobby Vending", device_type: "vending_machine", location: { lat: 40.7128, lng: -74.0060, city: "New York", state: "NY", venue_type: "office" } })

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoHuman-readable device name
specsNoDevice specifications
locationNoDevice location information
metadataNoAdditional custom metadata
device_idYesYour internal unique device identifier
device_typeNoType of device
Behavior4/5

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

No annotations are provided, so the description carries the full burden. It discloses the return payload (device_id, trillboards_device_id, fingerprint, embed_url, status) and gives a concrete example. While it doesn't detail side effects or auth requirements, the upsert nature is implied by 'register or 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?

The description is well-organized with clear sections (main purpose, WHEN TO USE, RETURNS, EXAMPLE). Each section earns its place, with no redundant content. It's appropriately sized for the tool's complexity.

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

Completeness4/5

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

Given the tool's nested objects (specs, location) and missing output schema, the description compensates by listing all return fields and showing a complete example. It doesn't cover error handling, but the essential usage context is thorough.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds an example with device_id, name, device_type, and location, demonstrating real-world usage, but the schema already fully explains each parameter. No significant extra semantic info.

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 'Register or update a device in the partner's network', clearly stating the verb (register/update) and resource (device). It distinguishes from siblings like delete_device, get_device, and list_devices by covering both creation and modification scenarios.

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

Usage Guidelines4/5

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

Explicit 'WHEN TO USE' section lists three concrete scenarios: adding a new screen/kiosk/vending machine, updating device info, and re-registering after maintenance. It lacks explicit when-not-to-use or alternatives, but the use cases are clear enough.

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

register_partnerAInspect

Register a new partner organization with Trillboards.

WHEN TO USE:

  • First-time setup for a new partner integration

  • Creating a new partner account to manage devices

RETURNS:

  • partner_id: Unique partner identifier

  • api_key: API key for authenticated requests (store securely!)

  • status: Account status

EXAMPLE: User: "Register my vending machine company" register_partner({ company_name: "Acme Vending Co", email: "tech@acmevending.com", industry: "vending", expected_devices: 50 })

ParametersJSON Schema
NameRequiredDescriptionDefault
emailYesContact email for the partner account
websiteNoCompany website URL (optional)
industryNoIndustry type (e.g., "vending", "retail", "hospitality")
company_nameYesCompany or organization name
contact_nameNoPrimary contact person name (optional)
contact_phoneNoContact phone number (optional)
expected_devicesNoEstimated number of devices to connect
Behavior3/5

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

With no annotations, the description carries the transparency burden. It discloses return values (partner_id, api_key, status) and adds a security note ('store securely!') for the api_key. However, it omits other behavioral aspects like permissions, idempotency, or side effects, so it is only partially transparent.

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

Conciseness5/5

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

The description is well-structured and front-loaded: purpose, when-to-use, returns, and an example. Every section serves a distinct purpose, with no fluff or repetition. The example is concise and illustrative.

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

Completeness4/5

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

For a 7-parameter tool with no annotations and no output schema, the description provides essential context: usage conditions, return fields, and an example. It does not cover edge cases like duplicate registrations or permission requirements, but the provided information is sufficient for basic usage and the schema fills the parameter-level gaps.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The example in the description demonstrates typical usage of some parameters (company_name, email, industry, expected_devices) but does not add new semantic meaning beyond the schema's existing parameter descriptions.

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

Purpose5/5

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

The description clearly states 'Register a new partner organization with Trillboards' with a specific verb and resource. It distinguishes from sibling tools like register_device by focusing on partner organizations and mentions 'manage devices' as a use case, making the purpose unambiguous.

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

Usage Guidelines4/5

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

Provides explicit 'WHEN TO USE' conditions: first-time setup for new partner integration and creating a new partner account. It gives clear context for when to invoke the tool, though it does not explicitly name alternatives or exclusions, which would push it to a 5.

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

search_contentAInspect

Semantic search over content library using natural language queries and 768-D pgvector embeddings.

WHEN TO USE:

  • Finding content by description or theme ("upbeat music videos", "cooking shows")

  • Discovering content similar to a concept or mood

  • Searching the content library without knowing exact titles or IDs

  • Content discovery for programmatic content scheduling

RETURNS:

  • data: Array of matching content with similarity scores

    • videoId, title, contentCategory, description, durationSeconds

    • reviewStatus (approved/pending/rejected)

    • similarity (0-1, cosine similarity against query embedding)

  • meta: { count, query, limit, minSimilarity }

EXAMPLE: User: "Find fitness and workout content" search_content({ query: "fitness workout exercise gym", limit: 10, min_similarity: 0.6 })

User: "Search for calming nature content suitable for medical offices" search_content({ query: "calming nature scenes peaceful landscapes meditation", min_similarity: 0.5 })

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum results to return (default: 20, max: 100)
queryYesNatural language search query (min 3 characters)
min_similarityNoMinimum cosine similarity threshold (default: 0.5, range: 0-1)
Behavior4/5

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

With no annotations, the description carries full responsibility for behavioral disclosure. It details return structure (data array with fields, meta object, similarity score) and provides example queries. While it does not explicitly mention read-only status or side effects, the search semantics and output specifics give adequate transparency for this tool.

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

Conciseness4/5

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

The description is well-organized with clear sections (WHEN TO USE, RETURNS, EXAMPLE) and front-loads the core purpose. It is slightly lengthy due to two example calls, but every section contributes useful information without redundancy.

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

Completeness5/5

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

Given the absence of an output schema, the description compensates thoroughly by specifying the exact return fields and meta structure. It provides usage guidance, parameter examples, and behavioral context. The tool is a straightforward search, so this description leaves no significant gaps for an agent to invoke it correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds meaning by showing examples that combine query, limit, and min_similarity, and by linking similarity to cosine distance in the return section. This reinforces how parameters behave beyond the schema's basic descriptions.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Semantic search over content library using natural language queries and 768-D pgvector embeddings.' This clearly distinguishes it from sibling tools like semantic_audience_search and semantic_search_observations by focusing on the content library. The 'WHEN TO USE' section further reinforces the intended use cases.

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?

A dedicated 'WHEN TO USE' section lists four concrete scenarios, such as finding content by description or discovering similar content without exact IDs. It does not explicitly name alternatives or state when not to use, but the context is clear enough to guide selection among siblings.

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

semantic_search_observationsAInspect

Search observations by semantic similarity. Find moments that match a description like "lunch rush at fast casual restaurants" using vector embeddings.

Uses 768-dimensional Gemini embeddings on observation payloads to find promoted observations matching a natural language query via approximate nearest-neighbour (ANN) cosine similarity search over a Lance IVF_PQ index.

CONSISTENCY: results are APPROXIMATE and EVENTUALLY CONSISTENT.

  • Approximate: retrieval is ANN, not an exhaustive scan (measured recall ~0.96 against exact KNN), so an identical query may omit a borderline match.

  • Eventually consistent: the index is served from a replicated pool whose replicas refresh independently, so for up to 5 minutes after new observations are published, two identical calls may return slightly different result sets. The difference is confined to the VISIBILITY of newly-published observations; the relative ranking of already-visible ones does not change. Do not use this tool where a repeatable, exhaustive result set is required.

TIME BOUND: searches the last 30 days by default. Pass filters.time_range to widen or narrow it; the window actually applied is echoed in metadata.time_range. Observations are retained for 90 days.

WHEN TO USE:

  • Finding observations that match a conceptual description

  • Discovering contextual moments across the screen network

  • Searching for audience situations ("families waiting in line", "professionals on coffee break")

  • Finding commerce patterns ("high purchase intent near checkout")

RETURNS:

  • data: Array of matching observations ranked by semantic similarity, each with:

    • observation_id, device_id, venue_type, observation_family

    • observed_at, payload, confidence, evidence_grade

    • similarity: Cosine similarity score (0-1, higher = more relevant)

  • metadata: { result_count, query_embedding_model, search_scope, time_range }

  • suggested_next_queries: Related semantic queries to explore

EXAMPLE: User: "Find lunch rush moments at fast casual restaurants" semantic_search_observations({ query: "lunch rush at fast casual restaurants with high foot traffic", filters: { venue_type: ["restaurant_qsr"] }, limit: 20 })

User: "Find moments with high emotional engagement" semantic_search_observations({ query: "audience showing strong positive emotional reactions", filters: { observation_family: ["audience"] }, limit: 10 })

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum results to return (default: 20, max: 100)
queryYesNatural language description of the observation moments to search for
filtersNoAdditional structured filters to narrow semantic search
Behavior5/5

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

With no annotations provided, the description carries the full burden and excels. It discloses approximate retrieval (ANN, recall ~0.96), eventual consistency (up to 5 minutes variance for new observations), time bounds (30-day default, 90-day retention), and explains the stability of rankings. This is rich behavioral detail well beyond a simple read-only hint.

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 long but logically organized with clear sections (CONSISTENCY, TIME BOUND, WHEN TO USE, RETURNS, EXAMPLE). It is front-loaded with the core purpose, and every section contributes meaningfully. The length is justified given the tool's complexity and the absence of an output schema.

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

Completeness5/5

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

The tool is complex (semantic search, filters, nested objects, no output schema), and the description covers all necessary aspects: behavior, limitations, time bounds, return schema, and usage examples. It explicitly documents the response fields (data, metadata, suggested_next_queries) and the values within data, making it self-contained for an agent.

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

Parameters4/5

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

The input schema already has 100% coverage of parameter descriptions, so the baseline is 3. The description adds value with realistic examples showing how to phrase queries and filters (e.g., 'lunch rush at fast casual restaurants with high foot traffic'), clarifies default behavior for limit and time_range, and explains the returned similarity scores. This goes beyond the schema but does not cover edge cases like time range format.

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

Purpose4/5

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

The description clearly states the tool's function: 'Search observations by semantic similarity' and provides a concrete example query. The mechanism (vector embeddings, ANN) is specific. It does not explicitly differentiate from sibling tools like find_similar_moments or semantic_audience_search, so it meets 'clear but no sibling differentiation' rather than the full 5.

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

Usage Guidelines5/5

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

The 'WHEN TO USE' section provides explicit scenarios (e.g., 'Finding observations that match a conceptual description'), and the description explicitly states 'Do not use this tool where a repeatable, exhaustive result set is required.' This covers both when and when-not, giving clear usage guidance even without naming alternative tools.

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

setup_billingAInspect

Set up pay-per-use billing with a Stripe payment method. Required after exceeding free tier limits. Pass a Stripe payment method token (pm_xxx) obtained from Stripe.js or Stripe Elements.

ParametersJSON Schema
NameRequiredDescriptionDefault
payment_method_idYesStripe payment method token (pm_xxx) from Stripe.js or Elements
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It mentions the setup nature and the trigger, but does not disclose side effects (e.g., immediate activation of charges, reversibility, or whether it can be called multiple times). The lack of behavioral caveats leaves some ambiguity for a mutating action.

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 purpose, then the trigger, then the parameter instruction. Every sentence earns its place with zero redundancy or fluff.

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

Completeness4/5

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

For a one-parameter tool with no output schema, the description covers the what, when, and how to pass the parameter. It is complete enough for an agent to decide and invoke, though it does not describe the response format or potential errors, which would be useful but not essential for a simple setup call.

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

Parameters3/5

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

The input schema already describes payment_method_id fully, including the token format and source. The description's mention of the token source adds no new information beyond the schema. Since schema coverage is 100%, a baseline score of 3 is appropriate.

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

Purpose5/5

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

The description clearly states the action ('Set up pay-per-use billing') and the specific resource (Stripe payment method), distinguishing it from sibling tools like get_billing_status (read-only) and purchase_credits (prepaid credits). The verb is specific and the scope is immediately clear.

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

Usage Guidelines4/5

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

Provides a concrete usage trigger: 'Required after exceeding free tier limits.' This tells the agent when to invoke the tool, though it does not explicitly mention alternatives or when not to use it. Still, the context is clear enough to differentiate from credit purchases or billing status checks.

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

sync_accountsAInspect

[AdCP Accounts] Establish or confirm the account behind this credential.

IMPORTANT — what this does NOT do: it does not provision a new account. This seller's namespace is one account per API key, so a provisioning-mode entry (brand + operator + billing) is LINKED to the account your key already owns and the response says so in warnings[]. Two different brands on one key resolve to the SAME account_id. Register one agent per brand at https://api.trillboards.com/v1/partner/agent/register if you need per-brand separation.

BILLING IS THE ONE SETTING THAT IS APPLIED. Send billing: 'operator' (we invoice you, buying direct) or 'agent' (you are a buying agent consolidating across the brands you front, and we invoice you for all of them — the marketplace-clearing model). The value is stored on the account, reported back by list_accounts, and reflected in action 'updated'. The set we accept is exactly account.supported_billing from get_adcp_capabilities; 'advertiser' is refused, with the reason, because we hold no billing relationship with a third-party advertiser. One key is one account with one invoiced party, so a request declaring two different billing values applies neither and says so.

Everything else is read-only and reports 'unchanged': payment terms, billing entity and notification subscriptions are not per-account state on this platform, and anything sent that was not applied is named in warnings[] rather than silently swallowed.

WHEN TO USE:

  • The account-setup step at the start of a buying flow

  • Declaring how you want to be invoiced, before create_media_buy

  • Confirming your account_id and status before create_media_buy

RETURNS:

  • accounts: per-entry result with account_id, action ('updated' | 'unchanged' | 'failed'), status, billing, account_scope, and warnings naming anything not applied

EXAMPLE: sync_accounts({ idempotency_key: "8f1c...", accounts: [{ brand: { domain: "acme.example" }, operator: "agency.example", billing: "agent" }] })

ParametersJSON Schema
NameRequiredDescriptionDefault
contextNo
dry_runNoEcho what would happen without applying it. Reported back as dry_run.
accountsYesPer-account entries. Each uses ONE key shape: `account` (settings-update) or the flat brand + operator + billing trio (provisioning).
delete_missingNoNot supported — this seller never deletes an account from a sync.
idempotency_keyYesClient-generated key for safe retries. This operation has no side effects, so a replay returns the same result.
push_notification_configNo
Behavior5/5

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

With no annotations provided, the description fully carries behavioral disclosure: one account per API key, same account_id for multiple brands, billing is the only applied setting, everything else reports 'unchanged', non-applied fields are named in warnings[], and delete_missing is unsupported. It also explicitly describes return action statuses and side effects, leaving no ambiguity about its 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?

Though long, the description is tightly structured with bold section headers, bullet lists, and an example. Every sentence serves a purpose—explaining scope, non-behaviors, billing semantics, returns, or usage. The front-loaded purpose and clear callouts make it 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?

This is a complex tool with no output schema, yet the description fully covers inputs, outputs, edge cases (billing refusal, provisioning-mode links, per-brand caveats), and provides a concrete example. It leaves no critical behavioral gap and is complete for an agent to invoke correctly.

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

Parameters5/5

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

Schema coverage is 67%, but the description adds substantial semantic meaning: the distinction between the flat provisioning trio and the account shape, accepted billing values, the fact that payment_terms/billing_entity/notification_configs are never applied, and the idempotency/replay behavior. This goes well beyond the schema's field descriptions and compensates for any gaps.

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

Purpose5/5

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

The description opens with a specific verb+resource: 'Establish or confirm the account behind this credential.' It clearly distinguishes the tool from provisioning (what it does NOT do) and from related siblings like create_media_buy and list_accounts, making the purpose unambiguous.

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

Usage Guidelines5/5

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

A dedicated 'WHEN TO USE' section lists three concrete scenarios, explicitly ties to dependent tools (create_media_buy, get_adcp_capabilities), and explains when not to use it (not for provisioning, not for per-brand separation). This is exemplary guidance on tool selection.

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

sync_creativesAInspect

[AdCP Media Buy] Validate and sync creative assets for a media buy.

Validates creative assets (resolution, duration, format) against screen specifications. Returns compatibility status for each screen in the campaign.

WHEN TO USE:

  • Submitting creative assets before campaign launch

  • Checking if a creative meets screen requirements

  • Validating VAST tags

EXAMPLE: sync_creatives({ media_buy_id: "mbuy_abc123", creatives: [{ url: "https://cdn.example.com/ad.mp4", type: "video", width: 1920, height: 1080, duration_seconds: 15, file_size_mb: 12 }] })

ParametersJSON Schema
NameRequiredDescriptionDefault
extNo
accountNo
contextNo
dry_runNo
creativesYesCreative assets to validate
assignmentsNo
creative_idsNo
media_buy_idNoMedia buy ID
delete_missingNo
idempotency_keyNo
validation_modeNo
push_notification_configNo
Behavior3/5

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

With no annotations provided, the description carries the full burden. It explains the validation logic and return value, but the 'sync' part is vague—does it upload, update, delete? The schema has delete_missing and idempotency_key, but the description doesn't disclose any side effects, permissions, or failure behavior. This is a significant gap, though the example and validation specifics add some transparency.

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

Conciseness5/5

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

The description is well-structured and efficient: an opener, a brief validation summary, a WHEN TO USE list, and a concrete example. No fluff; every section earns its place.

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

Completeness2/5

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

This is a complex tool with 12 parameters, nested objects, no output schema, and no annotations. The description covers the primary use case and one example, but it fails to explain the 'sync' side effects, the handling of assignments/creative_ids, or the meaning of flags like delete_missing and dry_run. It also doesn't describe what 'screen specifications' are or how they are derived. Overall, the description is insufficient for a fully informed agent without additional context.

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

Parameters2/5

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

Schema coverage is low (17%), so the description must compensate. It provides an example showing key creative fields (url, type, width, height, duration_seconds, file_size_mb) and media_buy_id, but it omits the meaning of critical parameters like assignments, creative_ids, delete_missing, validation_mode, dry_run, and account. This leaves much of the input structure unexplained beyond what the schema barely provides.

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

Purpose5/5

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

The description opens with a specific verb+resource: 'Validate and sync creative assets for a media buy.' It further explains validation criteria (resolution, duration, format) and the return value (compatibility status per screen), clearly distinguishing it from sibling tools like sync_accounts, get_creative_attention, or validate_request.

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 'WHEN TO USE' section lists concrete scenarios: pre-launch submission, checking screen requirements, and validating VAST tags. While alternatives aren't explicitly named, the contexts are clear enough to guide tool selection. Absence of 'when not to use' prevents a 5.

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

tasks_getAInspect

[AdCP Protocol] Get the status of a previously issued AdCP task.

Every AdCP task Trillboards serves for an AUTHENTICATED caller is recorded and returned a task_id. Poll that id here to read the task's terminal state and, with include_result: true, its completion payload.

Trillboards answers every AdCP task in-process, so a task is already completed by the time you hold its id — this tool exists so a buyer that polls does not hang, and so an async arm has somewhere to report from when one lands.

TASK SCOPE: tasks are visible only to the account that created them. An id belonging to another account, an id we never issued, or a poll with no credential all answer identically — "Task not found" — so the surface cannot be used to probe which ids exist.

NOT RECORDED: read-only protocol and catalogue calls that AdCP does not model as tasks (get_adcp_capabilities, list_creative_formats, get_media_buys, list_accounts), and any anonymous call, which has no account to scope to.

LEGACY NAME. Identical to get_task_status; this is the name the AdCP MCP binding emits (agent.protocol === "mcp" ? "tasks_get" : "tasks/get"). Prefer get_task_status in new code.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNo
contextNo
task_idYesUnique identifier of the task to retrieve, as issued in the `task_id` field of the originating task response.
include_resultNoInclude the task's result payload when status is completed. Defaults to false for lightweight status-only polls.
include_historyNoInclude conversation history. Trillboards tasks complete in-process and hold no multi-turn history, so this is accepted and has no effect.
Behavior5/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals that tasks complete in-process, that foreign/unknown/no-credential lookups all return the same 'Task <id> not found' response to prevent probing, and that anonymous calls are not recorded. It also notes the tool is a legacy alias, giving agents a clear understanding of its relationship to get_task_status.

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 well-structured into clear sections: purpose, polling behavior, task scope, not-recorded calls, and legacy name. Each section contributes useful information such as anti-probing behavior and explicit exclusions. It could be tightened slightly, but the length is justified by the protocol-specific nuance.

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

Completeness5/5

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

Given the tool's complexity and lack of an output schema, the description is highly complete. It tells the agent what to expect ('terminal state', 'completion payload'), provides the exact not-found message, explains scope and privacy protections, and identifies which calls are not recorded. This is sufficient for an agent to select and invoke the tool correctly without needing an output schema.

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

Parameters3/5

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

The input schema already describes task_id, include_result, and include_history. The description adds modest context by explaining that include_result=true yields the completion payload and that the task_id comes from the originating task response, but this largely echoes schema descriptions. It does not clarify the account or context parameters beyond implying auth scoping, leaving 2 of 5 parameters underdescribed (60% schema coverage).

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Get the status of a previously issued AdCP task.' It clarifies the polling intent and states the task's lifecycle ('terminal state', 'completion payload'). It also distinguishes itself from the sibling get_task_status by explicitly calling it an identical legacy alias and from list_tasks by focusing on a single task ID.

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

Usage Guidelines4/5

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

The description gives concrete usage context: 'Poll that id here' and explains this tool exists so a polling buyer does not hang and an async arm can report. It explicitly lists call types that are NOT recorded and therefore should not be polled. It also names the preferred alternative 'get_task_status' for new code, though it stops short of a fully crisp when-to-use vs when-not-to-use decision rule.

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

tasks_listAInspect

[AdCP Protocol] List AdCP tasks belonging to your account, newest first.

Returns query_summary (totals and a status breakdown), tasks, and pagination. Filter by status or task type. Scoped to the calling account — an unauthenticated call returns an empty page rather than another account's tasks.

LEGACY NAME. Identical to list_tasks. Prefer list_tasks in new code.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountNo
contextNo
filtersNoNarrow the returned tasks.
paginationNo
Behavior4/5

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

With no annotations, the description carries the burden. It discloses return structure (query_summary, tasks, pagination), ordering (newest first), and the security-scoping behavior (unauthenticated calls return empty page, not other accounts' data). It could add more about auth requirements or error cases, but the key behaviors are well covered.

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

Conciseness5/5

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

The description is compact and front-loaded with the primary function. Every sentence earns its place: the return format, scoping behavior, and legacy notice are all useful. No fluff or repetition.

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

Completeness3/5

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

For a list tool with four parameters and no output schema, the description provides a good high-level view of returns and scoping, but it omits semantics for the `account` and `context` parameters, leaving those ambiguous. It also doesn't describe pagination request behavior in detail. Given the nesting and lack of annotations/output schema, the description is adequate but not fully complete.

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

Parameters2/5

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

Schema description coverage is only 25%, so the description must compensate, but it adds little beyond what property names imply. It mentions 'Filter by status or task type' but does not explain the nested `account` or `context` objects, or how `pagination` request parameters work. The description does not clarify the meaning of the `account` field despite saying 'your account'.

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 starts with a specific verb and resource: 'List AdCP tasks belonging to your account, newest first.' It clearly identifies the scope (own account) and ordering. It also distinguishes from the sibling `list_tasks` by stating it is identical and a legacy name, avoiding ambiguity.

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 guidance is provided: 'LEGACY NAME. Identical to `list_tasks`. Prefer `list_tasks` in new code.' This directly tells the agent when to use this tool versus the alternative. It also mentions filtering by status/task type, which helps select the tool for search use cases, though it doesn't compare to `tasks_get` explicitly.

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

test_webhookAInspect

Send a test event to a webhook endpoint.

WHEN TO USE:

  • Verifying webhook endpoint is working

  • Testing integration during development

  • Debugging webhook delivery issues

RETURNS:

  • success: Boolean indicating delivery success

  • response_code: HTTP response code from endpoint

  • response_time_ms: Response time in milliseconds

  • error: Error message if delivery failed

EXAMPLE: User: "Test my webhook with a device.online event" test_webhook({ webhook_id: "wh_mmmpdbvj_8b7c5a59296d", event: "device.online" })

ParametersJSON Schema
NameRequiredDescriptionDefault
eventNoEvent type to simulate (optional, defaults to device.online)
webhook_idYesWebhook ID to test (wh_xxx format or legacy ObjectId)
Behavior4/5

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

With no annotations, the description carries the full transparency burden. It discloses the action (sending a test event), the return fields (success, response_code, response_time_ms, error), and includes an example. It doesn't mention potential side effects like triggering downstream actions or rate limits, but for a test function the core behavior is well-covered.

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

Conciseness4/5

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

The description is well-structured with purpose, when-to-use, returns, and an example. It front-loads the primary action and uses sections for readability. It is longer than strictly necessary but each section earns its place; the example supports parameter usage.

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?

No output schema is present, so the description appropriately explains return values. It also gives context for when to use the tool, an example call, and covers the parameters. Given the tool's simple nature (2 params, optional event), the description is complete and self-contained.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. Both parameters have descriptions in the schema, and the example provides concrete values but doesn't add meaning beyond the schema. No additional parameter nuance is provided in the description.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Send a test event to a webhook endpoint.' It clearly distinguishes from sibling tools (create_webhook, update_webhook, delete_webhook, get_webhook_deliveries) by focusing on testing/delivery rather than management or retrieval.

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?

A dedicated 'WHEN TO USE' section lists three explicit scenarios: verifying endpoint, testing integration, debugging delivery issues. It offers clear context but does not mention when not to use it or explicitly name alternatives (e.g., use get_webhook_deliveries to inspect past deliveries).

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

update_media_buyAInspect

[AdCP Media Buy] Update an existing media buy (campaign).

Modify budget, targeting, schedule, or status of an existing media buy.

WHEN TO USE:

  • Adjusting campaign budget mid-flight

  • Pausing or resuming a campaign

  • Changing targeting parameters

  • Extending campaign dates

EXAMPLE: update_media_buy({ media_buy_id: "mbuy_abc123", updates: { status: "paused", budget: { daily_usd: 300 } } })

ParametersJSON Schema
NameRequiredDescriptionDefault
extNo
pausedNo
accountNo
contextNo
updatesNoFields to update
canceledNo
end_timeNo
packagesNo
revisionNo
start_timeNo
media_buy_idYesMedia buy ID to update
new_packagesNo
idempotency_keyNo
invoice_recipientNo
reporting_webhookNo
cancellation_reasonNo
push_notification_configNo
Behavior2/5

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

With no annotations provided, the description carries full burden for disclosing behavior. It mentions 'update' and shows an example with partial fields, but it does not explain whether updates are incremental or full replacements, how revision/idempotency_key work, what happens on conflicts, or any error behavior. For a mutation tool, this is a significant transparency gap.

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

Conciseness5/5

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

The description is well-structured: a one-sentence summary, a brief list of modifiable aspects, a WHEN TO USE list, and a concise example. Each part earns its place and the whole is appropriately sized for the tool's complexity. No unnecessary words or repetition.

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

Completeness2/5

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

Given the tool has 17 parameters, nested objects, no output schema, and no annotations, the description is incomplete. It covers purpose and an example but does not describe return values, explain major optional fields, or clarify update semantics. For a complex mutation tool, more context is needed to use it safely and effectively.

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

Parameters2/5

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

Schema description coverage is only 12%, so the description must compensate for the 17-parameter schema. It explains the 'updates' object via the example and mentions budget/targeting/schedule/status, but many other parameters (packages, new_packages, revision, start_time, end_time, etc.) are unexplained. The description only partially clarifies parameter meaning and leaves major fields ambiguous.

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

Purpose5/5

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

The description clearly states 'Update an existing media buy (campaign)' with the specific verb 'update' and resource 'media buy'. It lists modifiable aspects (budget, targeting, schedule, status), and the word 'existing' distinguishes it from create_media_buy. This is a precise, non-tautological purpose statement.

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?

WHEN TO USE section provides concrete scenarios like budget adjustment, pausing/resuming, targeting changes, and date extensions. It gives clear context for when to use the tool, but it does not explicitly mention when not to use it or name alternatives such as create_media_buy. Thus it has clear context without exclusions.

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

update_webhookAInspect

Update an existing webhook subscription.

WHEN TO USE:

  • Changing the webhook endpoint URL

  • Adding or removing subscribed events

  • Enabling or disabling a webhook

  • Updating the webhook description

RETURNS:

  • webhook_id: The updated webhook ID

  • url: Updated endpoint URL

  • events: Updated event subscriptions

  • enabled: Updated enabled status

  • updated_at: Update timestamp

EXAMPLE: User: "Disable the webhook for maintenance" update_webhook({ webhook_id: "wh_mmmpdbvj_8b7c5a59296d", enabled: false })

User: "Add impression events to my webhook" update_webhook({ webhook_id: "wh_mmmpdbvj_8b7c5a59296d", events: ["device.online", "device.offline", "impression.recorded"] })

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Behavior3/5

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

With no annotations, the description carries the full burden. It discloses return fields and shows via examples that partial updates are supported (e.g., only enabled or only events). However, it does not mention error behavior, idempotency, or prerequisites like authentication, leaving meaningful gaps for a write operation.

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

Conciseness4/5

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

The description is well-organized into WHEN TO USE, RETURNS, and EXAMPLE sections, making it scannable. The examples are useful but somewhat verbose; every sentence earns its place, though it could be tightened.

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

Completeness3/5

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

The tool is a partial-update operation, and the description covers the main behaviors and return values. However, the empty input schema creates a significant gap that the description only partially fills. It also lacks details on error cases and validation, so it is not fully complete for a real-world agent.

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

Parameters4/5

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

The input schema has zero properties, so the description is the only source of parameter meaning. The examples clearly show webhook_id being used as an identifier and other fields as optional updates, adding value beyond the empty schema. However, it does not enumerate all possible fields (e.g., description) or state which are required, so a perfect score is not warranted.

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

Purpose5/5

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

The description opens with 'Update an existing webhook subscription,' a specific verb+resource statement that clearly differentiates from siblings like create_webhook, delete_webhook, and list_webhooks. The WHEN TO USE section further narrows the purpose with four concrete use cases.

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 'WHEN TO USE' section provides explicit, concrete scenarios (changing URL, events, enabled status, description) that are actionable. However, it does not explicitly state when not to use the tool or mention alternatives, so it falls short of a 5.

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

validate_requestAInspect

Validate a proposed request payload against the registered Zod schema for an operation, returning the exact canonical error envelope the HTTP surface would emit.

WHEN TO USE:

  • Before calling a write endpoint, to catch payload bugs locally.

  • Debugging 400 validation_error responses.

RETURNS:

  • valid: true when the payload would pass Zod validation.

  • When invalid, the canonical { error: { type, code, message, param, doc_url, details[] } } envelope is included under error.

EXAMPLE: validate_request({ path: "/v1/data/query", method: "POST", payload: { dataset: "inference_outcomes", limit: 9999 } })

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesOperation path (OpenAPI template form).
methodYes
payloadNoShape is operation-dependent. GET → { query?, params? }. POST → body + optional { query?, params? }.
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses the return shape (valid flag and error envelope fields), the local validation nature ('before calling a write endpoint'), and shows an example. It stops short of explicitly stating it makes no network request, but the 'before calling' phrasing and example imply a safe, non-mutating operation.

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

Conciseness4/5

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

The description is well-structured with clear sections (purpose, when to use, returns, example) and front-loads the core purpose. It is somewhat longer than strictly necessary, but each section adds value, and the example is directly useful. No redundancy or fluff.

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 3-parameter tool with no output schema, the description provides a thorough overview: purpose, usage scenarios, return format (including the error envelope structure), and a concrete example. Minor gaps exist (e.g., not explicitly stating that payload is optional for GET), but the schema fills in some of this, and the description is otherwise complete enough for an agent 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?

Schema description coverage is 67% (path and payload have descriptions, method does not). The description adds an example showing how to pass path, method, and payload, which clarifies usage, but it does not systematically document the 'method' parameter or explain that payload is optional (as the schema does). This is adequate but not exceptional.

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

Purpose5/5

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

The description clearly states a specific verb ('validate') and resource ('proposed request payload against the registered Zod schema'), and distinguishes the tool from siblings by emphasizing its role in validating payloads and returning the canonical error envelope. This is unique among the listed sibling tools, many of which are data-fetching or mutation operations.

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

Usage Guidelines4/5

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

The 'WHEN TO USE' section provides two concrete scenarios (before calling write endpoints, debugging 400 responses) that clarify appropriate contexts. It does not mention alternatives or when not to use, but the context is clear enough for an agent to recognize this as a validation tool rather than a general-purpose helper.

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

verify_proof_of_playAInspect

Verify cryptographic proof of ad delivery or get campaign proofs.

Requires either campaign_id or proof_payload (at least one must be provided).

Two modes:

  1. Verify a proof: pass proof_payload with signature fields to verify

  2. Get proofs: pass campaign_id to get Ed25519-signed proofs for a campaign

Uses Ed25519 signatures (v2) that can be independently verified by third parties using the Trillboards public key.

WHEN TO USE:

  • Verifying that ads were actually delivered to screens

  • Exporting cryptographically signed proof records for auditors

  • Getting proof-of-play data for campaign transparency reports

RETURNS (verify mode):

  • valid: boolean, reason: string if invalid, version: 'v1' or 'v2'

RETURNS (get proofs mode):

  • campaignId, totalImpressions, proofsReturned

  • proofs: Array of signed impression proofs

  • pagination: { limit, hasMore, nextCursor }

  • signatureVersion, publicKeyUrl

EXAMPLE (verify): verify_proof_of_play({ proof_payload: { signature: "ed25519=abc123...", timestamp: "2026-03-10T15:30:00Z", adId: "ad_123", impressionId: "imp_456", screenId: "scr_789", deviceId: "dev_012" } })

EXAMPLE (get proofs): verify_proof_of_play({ campaign_id: "camp_abc123", start_date: "2026-03-01", end_date: "2026-03-10" })

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax proofs to return (default: 1000, used with campaign_id)
cursorNoPagination cursor from previous response (used with campaign_id)
end_dateNoEnd date for proof query (YYYY-MM-DD, used with campaign_id)
start_dateNoStart date for proof query (YYYY-MM-DD, used with campaign_id)
campaign_idNoCampaign ID to get proofs for (mutually exclusive with proof_payload)
proof_payloadNoProof data to verify (mutually exclusive with campaign_id). Must include: signature, timestamp, adId, impressionId, screenId, deviceId
Behavior5/5

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

No annotations are provided, but the description compensates by explaining cryptographic details (Ed25519 v2), third-party verifiability, expected return structures for both modes, and pagination behavior. It also documents the version distinction (v1/v2) and public key URL, offering deep insight beyond the schema.

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

Conciseness5/5

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

The description is well-structured with clear headings, bullet lists, and two concrete examples. Though lengthy, every section contributes necessary information for correct invocation, and the organization makes it easy to scan. No redundant language or filler.

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

Completeness5/5

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

For a tool with six parameters, nested objects, two distinct modes, and no output schema, the description is exceptionally complete. It covers required inputs, return values, pagination, signature versions, and provides examples for both operation modes, ensuring the agent can invoke it correctly without additional context.

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

Parameters5/5

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

Despite 100% schema description coverage, the description adds considerable value by clarifying mode-specific parameter usage, explaining that proof_payload requires specific fields, and providing full JSON examples for both modes. It also explains pagination parameters and their context, going far beyond the bare schema.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Verify cryptographic proof of ad delivery or get campaign proofs.' It clearly distinguishes two modes (verify vs. get proofs) and uses unambiguous terminology, making its purpose unmistakable and distinct from other tools.

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

Usage Guidelines5/5

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

The description includes a dedicated 'WHEN TO USE' section listing concrete use cases, and explicitly states the mutual exclusivity of campaign_id and proof_payload. It also clarifies which mode applies based on input, providing strong guidance for tool selection.

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

Discussions

No comments yet. Be the first to start the discussion!

Related MCP Servers

  • A
    license
    -
    quality
    B
    maintenance
    Agentic commerce infrastructure for AI agents. MCP-native product discovery, contextual ad matching, and purchase facilitation with European privacy compliance (nDSG/GDPR).
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    x402 Ads lets AI agents buy and verify ad placements with per-request USDC payments. Agents can discover inventory, submit campaign context, receive structured placement options, and pay through x402 without API keys or accounts. Built for autonomous promotion, attribution, and pay-per-action agent commerce.
    7
    227
    MIT
  • F
    license
    -
    quality
    C
    maintenance
    Enables AI agents to drive real customer visits to physical stores for $24.99 per verified visitor, with tools for pricing, industry listings, and knowledge base queries.
  • F
    license
    -
    quality
    B
    maintenance
    Enables querying ad campaign performance and setup across Meta, TikTok, and Google Ads using natural language through AI agents.

View all MCP Servers

Try in Browser

Your Connectors

Sign in to create a connector for this server.

Resources