Server Details
DOOH advertising via AI agents. 5,000+ screens with edge AI audience intelligence.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
- Repository
- trillboards/dooh-agent-example
- GitHub Stars
- 0
See and control every tool call
Available Tools
69 toolsactivate_signalInspect
[AdCP Signals] Activate an audience signal for DSP targeting.
Generates IAB Audience Taxonomy 1.1 segment parameters that DSPs can use in bid requests. Returns an activation_key token for referencing this signal activation.
WHEN TO USE:
Converting audience signals into actionable targeting parameters
Generating IAB segment IDs for programmatic bid 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 high-income professional targeting on my retail screens" activate_signal({ signal_type: "audience", parameters: { income: "high", lifestyle: "professional" }, screen_ids: ["507f1f77bcf86cd799439011"] })
| Name | Required | Description | Default |
|---|---|---|---|
| parameters | Yes | ||
| screen_ids | No | ||
| signal_type | Yes | ||
| destinations | No |
anomaly_detectInspect
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 })
| Name | Required | Description | Default |
|---|---|---|---|
| metric | Yes | ||
| screen_id | No | ||
| venue_type | No | ||
| lookback_hours | No | ||
| threshold_sigma | No |
batch_impressionsInspect
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 } ] })
| Name | Required | Description | Default |
|---|---|---|---|
| impressions | Yes |
configure_sensingInspect
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 })
| Name | Required | Description | Default |
|---|---|---|---|
| intent | Yes | ||
| screen_id | Yes | ||
| auto_deploy | No |
create_campaignInspect
Create a new advertising campaign targeting DOOH screens.
WHEN TO USE:
Setting up a new ad campaign on Trillboards 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" })
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| end_date | No | ||
| targeting | No | ||
| budget_cpm | No | ||
| screen_ids | No | ||
| start_date | No | ||
| venue_types | No | ||
| creative_url | No | ||
| creative_type | No | ||
| daily_budget_usd | No | ||
| total_budget_usd | No | ||
| creative_duration | No |
create_experimentInspect
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 })
| Name | Required | Description | Default |
|---|---|---|---|
| target_mde | No | ||
| campaign_id | Yes | ||
| holdout_pct | No | ||
| control_dmas | No | ||
| target_alpha | No | ||
| target_power | No | ||
| treatment_dmas | No | ||
| experiment_type | Yes |
create_media_buyInspect
[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" })
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| brand | No | ||
| buy_spec | No | ||
| creative | No | ||
| end_time | No | ||
| packages | No | ||
| buyer_ref | No | ||
| start_time | No |
create_webhookInspect
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" })
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| events | Yes | ||
| secret | No | ||
| description | No |
cross_signal_correlateInspect
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" } })
| Name | Required | Description | Default |
|---|---|---|---|
| filters | No | ||
| signal_a | Yes | ||
| signal_b | Yes |
delete_deviceInspect
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" })
| Name | Required | Description | Default |
|---|---|---|---|
| device_id | Yes |
delete_webhookInspect
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" })
| Name | Required | Description | Default |
|---|---|---|---|
| webhook_id | Yes |
device_heartbeatInspect
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 })
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | ||
| fingerprint | Yes | ||
| current_ad_id | No | ||
| error_message | No | ||
| uptime_seconds | No |
discover_inventoryInspect
Discover available DOOH screens in the Trillboards 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 })
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| location | No | ||
| venue_types | No | ||
| audience_profile | No |
export_cohortInspect
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" })
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes | ||
| destination | Yes |
export_datasetInspect
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" } })
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | ||
| dataset | Yes | ||
| filters | Yes |
find_similar_momentsInspect
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 pgvector cosine similarity.
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" })
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| venue_type | No | ||
| min_similarity | No |
get_adcp_capabilitiesInspect
[AdCP] Get Trillboards AdCP capabilities and supported protocols.
Returns the full capability declaration for Trillboards as an AdCP DOOH seller agent. This tool does NOT require authentication.
WHEN TO USE:
Discovering what protocols Trillboards 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
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
get_analyticsInspect
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" })
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | No | ||
| group_by | No | ||
| device_id | No | ||
| start_date | No |
get_attention_metricsInspect
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)
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes |
get_attribution_timeseriesInspect
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" })
| Name | Required | Description | Default |
|---|---|---|---|
| end_date | No | ||
| start_date | No | ||
| campaign_id | Yes |
get_audience_forecastInspect
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 })
| Name | Required | Description | Default |
|---|---|---|---|
| day | Yes | ||
| hour | Yes | ||
| screen_id | Yes | ||
| lookback_days | No |
get_audience_lookalikeInspect
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 })
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| country | No | ||
| screen_id | Yes | ||
| venue_type | No | ||
| min_similarity | No |
get_billing_statusInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
get_campaign_attributionInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes |
get_campaign_heatmapInspect
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)
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes |
get_campaign_performanceInspect
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" })
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes |
get_content_performanceInspect
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 })
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| video_id | Yes | ||
| venue_type | No |
get_content_recommendationsInspect
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 })
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| daypart | No | ||
| venue_type | Yes |
get_creative_attentionInspect
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
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes |
get_creative_attributionInspect
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 }
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes |
get_cross_channel_journeyInspect
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
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes |
get_dataset_statsInspect
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({})
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
get_deviceInspect
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" })
| Name | Required | Description | Default |
|---|---|---|---|
| device_id | Yes |
get_device_adsInspect
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" })
| Name | Required | Description | Default |
|---|---|---|---|
| fingerprint | Yes |
get_incrementalityInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes |
get_live_audienceInspect
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" })
| Name | Required | Description | Default |
|---|---|---|---|
| screen_id | Yes |
get_media_buy_deliveryInspect
[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" })
| Name | Required | Description | Default |
|---|---|---|---|
| dimensions | No | ||
| breakdown_by | No | ||
| media_buy_id | Yes |
get_multi_touch_attributionInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes |
get_network_statsInspect
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" })
| Name | Required | Description | Default |
|---|---|---|---|
| time_range | No |
get_partner_infoInspect
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({})
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
get_pricingInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| product | No |
get_productsInspect
[AdCP Media Buy] Get available DOOH advertising products and packages.
Returns DOOH screen packages organized by venue type, location, and audience profile, with real-time pricing based on current demand and audience quality.
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
RETURNS:
products: Array of product packages with pricing, reach, and audience data
Each product includes: name, venue_type, screen_count, pricing, avg_audience
EXAMPLE: User: "What DOOH products are available in NYC?" get_products({ market: "New York", venue_types: ["retail", "transit"] })
| Name | Required | Description | Default |
|---|---|---|---|
| brief | No | ||
| market | No | ||
| filters | No | ||
| buying_mode | No | ||
| venue_types | No | ||
| audience_profile | No |
get_roasInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| campaign_id | Yes |
get_signalsInspect
[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 Trillboards 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, Trillboards 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" } } })
| Name | Required | Description | Default |
|---|---|---|---|
| signal_spec | No |
get_social_attentionInspect
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" } })
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| min_saf | No | ||
| screen_id | No | ||
| time_range | No | ||
| venue_type | No |
get_social_contagion_summaryInspect
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" })
| Name | Required | Description | Default |
|---|---|---|---|
| group_by | No | ||
| time_range | No |
get_usage_summaryInspect
Get your current billing period usage summary with per-product breakdown and costs. Shows free tier consumption, paid usage, and total cost.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
get_webhook_deliveriesInspect
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 })
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| status | No | ||
| webhook_id | Yes |
list_devicesInspect
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 })
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| status | No | ||
| device_type | No |
list_webhooksInspect
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({})
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
log_eventInspect
[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 } } })
| Name | Required | Description | Default |
|---|---|---|---|
| event | Yes | ||
| media_buy_id | Yes |
predictive_queryInspect
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" })
| Name | Required | Description | Default |
|---|---|---|---|
| question | Yes | ||
| screen_id | No | ||
| venue_type | No | ||
| time_horizon | No |
predict_moment_qualityInspect
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:
Embeds the moment description to find historically similar moments
If >= 5 similar moments exist with the same creative, uses weighted-average prediction
If insufficient data, falls back to Gemini generative prediction
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" })
| Name | Required | Description | Default |
|---|---|---|---|
| creative_id | Yes | ||
| moment_description | Yes |
provide_performance_feedbackInspect
[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 } })
| Name | Required | Description | Default |
|---|---|---|---|
| feedback | Yes | ||
| media_buy_id | Yes |
purchase_creditsInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tier | Yes |
query_observationsInspect
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 })
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| filters | No |
recommend_creativeInspect
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"] })
| Name | Required | Description | Default |
|---|---|---|---|
| creative_ids | Yes | ||
| moment_description | Yes |
record_impressionInspect
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 })
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | ||
| metadata | No | ||
| timestamp | No | ||
| fingerprint | Yes | ||
| duration_seconds | No |
register_deviceInspect
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" } })
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| specs | No | ||
| location | No | ||
| metadata | No | ||
| device_id | Yes | ||
| device_type | No |
register_partnerInspect
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 })
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | |||
| website | No | ||
| industry | No | ||
| company_name | Yes | ||
| contact_name | No | ||
| contact_phone | No | ||
| expected_devices | No |
search_contentInspect
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 })
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| min_similarity | No |
semantic_audience_searchInspect
Search screens by natural language scene description using pgvector.
Uses 768-dimensional Gemini embeddings on scene descriptions from FEIN edge AI to find screens matching a natural language query.
WHEN TO USE:
Finding screens by audience context ("families eating lunch in a food court")
Contextual ad placement based on real-time scene understanding
Discovering inventory matching a specific audience scenario
RETURNS: Array of matching screens ranked by semantic similarity, each with:
screen_id, mongo_screen_id, scene_description, contextual_relevance, similarity, created_at
EXAMPLE: semantic_audience_search({ query: "young professionals in a coffee shop looking at phones", limit: 10 })
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| since | No | ||
| min_similarity | No |
semantic_search_observationsInspect
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 pgvector cosine similarity search.
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 }
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 })
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| filters | No |
setup_billingInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| payment_method_id | Yes |
sync_creativesInspect
[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 }] })
| Name | Required | Description | Default |
|---|---|---|---|
| creatives | Yes | ||
| media_buy_id | Yes |
test_webhookInspect
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" })
| Name | Required | Description | Default |
|---|---|---|---|
| event | No | ||
| webhook_id | Yes |
update_media_buyInspect
[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 } } })
| Name | Required | Description | Default |
|---|---|---|---|
| updates | Yes | ||
| media_buy_id | Yes |
update_webhookInspect
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"] })
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
verify_proof_of_playInspect
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:
Verify a proof: pass proof_payload with signature fields to verify
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" })
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| end_date | No | ||
| start_date | No | ||
| campaign_id | No | ||
| proof_payload | No |
Verify Ownership
Claim this connector by publishing a /.well-known/glama.json file on your server's domain with the following structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"maintainers": [
{
"email": "your-email@example.com"
}
]
}The email address must match the email associated with your Glama account. Once verified, the connector will appear as claimed by you.
Sign in to verify ownershipControl your server's listing on Glama, including description and metadata
Receive usage reports showing how your server is being used
Get monitoring and health status updates for your server
The connector status is unhealthy when Glama is unable to successfully connect to the server. This can happen for several reasons:
The server is experiencing an outage
The URL of the server is wrong
Credentials required to access the server are missing or invalid
If you are the owner of this MCP connector and would like to make modifications to the listing, including providing test credentials for accessing the server, please contact support@glama.ai.
Discussions
No comments yet. Be the first to start the discussion!
Your Connectors
Sign in to create a connector for this server.