{"serverId":"mcp-registry/io.github.snehdhruv/trillboards-dooh","tools":[{"name":"create_campaign","fixed":{"name":"create_campaign","description":"Create a new advertising campaign targeting DOOH screens.\n\nWHEN TO USE:\n- Setting up a new ad campaign on available screens\n- Targeting specific venues, locations, or audience profiles\n- Allocating budget for programmatic DOOH buys\n\nRETURNS:\n- campaign_id: Unique campaign identifier (UUID)\n- name, status, budget, screen_count, dates\n\nCampaign starts in \"draft\" status. Use update_campaign to set status to \"active\".\n\nEXAMPLE:\nUser: \"Create a campaign targeting retail screens in NYC at $5 CPM\"\ncrea","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["name"],"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"description":"Campaign name"},"end_date":{"type":"string","description":"Campaign end date (ISO 8601)"},"targeting":{"type":"object","properties":{"geo":{"type":"object","properties":{"lat":{"type":"number","maximum":90,"minimum":-90},"lng":{"type":"number","maximum":180,"minimum":-180},"city":{"type":"string","maxLength":100},"state":{"type":"string","maxLength":100},"country":{"type":"string","maxLength":100},"radius_km":{"type":"number","maximum":500,"exclusiveMinimum":0}},"additionalProperties":false},"schedule":{"type":"object","properties":{"days":{"type":"array","items":{"type":"integer","maximum":6,"minimum":0},"description":"0=Sun..6=Sat"},"hours":{"type":"array","items":{"type":"integer","maximum":23,"minimum":0},"description":"0-23"}},"additionalProperties":false},"audience_profile":{"type":"object","properties":{"income":{"type":"string"},"lifestyle":{"type":"string"},"min_attention":{"type":"number","maximum":1,"minimum":0}},"additionalProperties":false}},"description":"Additional targeting criteria","additionalProperties":false},"budget_cpm":{"type":"number","maximum":1000,"description":"Bid CPM in USD (default: 4.0)","exclusiveMinimum":0},"screen_ids":{"type":"array","items":{"type":"string","maxLength":50,"minLength":1},"maxItems":500,"description":"Specific screen IDs to target (optional, overrides venue/geo targeting)"},"start_date":{"type":"string","description":"Campaign start date (ISO 8601)"},"venue_types":{"type":"array","items":{"type":"string","maxLength":50},"maxItems":20,"description":"Venue types to target: transit, retail, outdoor, office, etc."},"creative_url":{"type":"string","format":"uri","description":"URL to video/image creative asset"},"creative_type":{"enum":["video","image","vast"],"type":"string","description":"Creative format"},"daily_budget_usd":{"type":"number","maximum":100000,"minimum":0,"description":"Daily budget cap in USD"},"total_budget_usd":{"type":"number","maximum":10000000,"minimum":0,"description":"Total campaign budget in USD"},"creative_duration":{"type":"integer","maximum":120,"minimum":1,"description":"Duration in seconds (default: 15)"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":806,"tokensAfter":806},{"name":"create_experiment","fixed":{"name":"create_experiment","description":"Create an incrementality experiment for a campaign.\n\nSets up a geo-holdout, ghost ads, or propensity score matching experiment\nto causally measure DOOH advertising lift.\n\nWHEN TO USE:\n- Setting up a new A/B test before or during a campaign\n- Defining treatment and control DMAs for geo-holdout tests\n- Configuring experiment parameters (holdout %, MDE, power)\n\nRETURNS:\nThe created experiment object with experiment_id, status, and all parameters.\n\nEXAMPLE:\ncreate_experiment({\n  campaign_id: \"camp_a","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["campaign_id","experiment_type"],"properties":{"target_mde":{"type":"number","maximum":1,"minimum":0.01,"description":"Minimum detectable effect (relative, e.g. 0.10 = 10% lift). Default: 0.10"},"campaign_id":{"type":"string","maxLength":128,"minLength":1,"description":"Campaign identifier"},"holdout_pct":{"type":"number","maximum":0.5,"minimum":0.05,"description":"Fraction of devices to hold out (0.05-0.50). Default: 0.10"},"control_dmas":{"type":"array","items":{"type":"string","maxLength":20},"maxItems":200,"description":"DMA codes for control group (no ads)"},"target_alpha":{"type":"number","maximum":0.1,"minimum":0.001,"description":"Significance level (0.05 or 0.01). Default: 0.05"},"target_power":{"type":"number","maximum":0.99,"minimum":0.5,"description":"Statistical power (0.80 or 0.90). Default: 0.80"},"treatment_dmas":{"type":"array","items":{"type":"string","maxLength":20},"maxItems":200,"description":"DMA codes for treatment group (get ads)"},"experiment_type":{"enum":["geo_holdout","ghost_ads","psm"],"type":"string","description":"Experiment type: geo_holdout (matched DMAs), ghost_ads (PSA control), psm (propensity score matching)"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":515,"tokensAfter":515},{"name":"create_media_buy","fixed":{"name":"create_media_buy","description":"[AdCP Media Buy] Create a media buy (campaign) from an AdCP buy specification.\n\nCreates a campaign that targets DOOH screens based on the provided specification.\nReturns a media_buy_id for tracking and a creative_deadline for asset submission.\n\nWHEN TO USE:\n- Executing a programmatic DOOH buy via an AI agent\n- Creating campaigns from DSP trading desk agents\n- Automated media buying workflows\n\nRETURNS:\n- media_buy_id: Unique identifier for this media buy\n- campaign_id: Internal campaign identifie","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"name":{"type":"string","maxLength":200,"minLength":1,"description":"Media buy name"},"brand":{"type":"object","properties":{"name":{"type":"string"},"domain":{"type":"string"}},"description":"Brand reference","additionalProperties":true},"context":{"type":"object","additionalProperties":{}},"buy_spec":{"type":"object","properties":{"geo":{"type":"object","properties":{"lat":{"type":"number"},"lng":{"type":"number"},"city":{"type":"string"},"state":{"type":"string"},"country":{"type":"string"},"radius_km":{"type":"number"}},"additionalProperties":false},"budget":{"type":"object","properties":{"bid_cpm":{"type":"number"},"daily_usd":{"type":"number"},"total_usd":{"type":"number"}},"additionalProperties":false},"schedule":{"type":"object","properties":{"days":{"type":"array","items":{"type":"number"}},"hours":{"type":"array","items":{"type":"number"}},"end_date":{"type":"string"},"start_date":{"type":"string"}},"additionalProperties":false},"screen_ids":{"type":"array","items":{"type":"string"}},"venue_types":{"type":"array","items":{"type":"string"}},"audience_profile":{"type":"object","additionalProperties":{}}},"description":"Buy specification (legacy)","additionalProperties":false},"creative":{"type":"object","properties":{"url":{"type":"string"},"type":{"enum":["video","image","vast"],"type":"string"},"duration_seconds":{"type":"number"}},"additionalProperties":false},"end_time":{"type":"string","description":"ISO 8601 end time"},"packages":{"type":"array","items":{"type":"object","properties":{"budget":{"anyOf":[{"type":"number","minimum":0},{"type":"object","properties":{"amount":{"type":"number"},"currency":{"type":"string"}},"additionalProperties":true}]},"bid_price":{"type":"number","minimum":0},"product_id":{"type":"string"},"impressions":{"type":"number","minimum":0},"pricing_option_id":{"type":"string"},"targeting_overlay":{"type":"object","additionalProperties":{}}},"additionalProperties":true},"description":"AdCP product packages to buy"},"buyer_ref":{"type":"string","maxLength":200,"description":"External reference ID from the buyer/agency"},"start_time":{"type":"string","description":"ISO 8601 start time"},"total_budget":{"type":"object","properties":{"amount":{"type":"number"},"currency":{"type":"string"}},"additionalProperties":true},"idempotency_key":{"type":"string","maxLength":200}},"additionalProperties":true},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":841,"tokensAfter":841},{"name":"create_webhook","fixed":{"name":"create_webhook","description":"Create a new webhook subscription for real-time events.\n\nWHEN TO USE:\n- Setting up real-time notifications for device events\n- Integrating with external systems\n- Monitoring ad playback and impressions\n\nAVAILABLE EVENTS:\n- device.online: When a device comes online\n- device.offline: When a device goes offline\n- impression.recorded: When an impression is logged\n- campaign.allocated: When a campaign is allocated to a device\n- payout.processed: When a payout is processed\n- programmatic.ad_started: W","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["url","events"],"properties":{"url":{"type":"string","format":"uri","description":"HTTPS endpoint URL to receive webhook events"},"events":{"type":"array","items":{"enum":["device.online","device.offline","impression.recorded","campaign.allocated","payout.processed","programmatic.ad_started","programmatic.ad_ended","programmatic.no_fill","programmatic.error","sensing.threshold_crossed","audience.spike","audience.venue_busy","audience.purchase_intent","audience.demographics_update","venue.traffic_summary","screen_group.created","screen_group.updated","screen_group.deleted","screen_group.member.added","screen_group.member.removed","screen_group.content_policy.updated","screen_group.sensing_config.updated","fleet_command.completed","fleet_command.failed"],"type":"string"},"maxItems":10,"minItems":1,"description":"Events to subscribe to"},"secret":{"type":"string","maxLength":100,"description":"HMAC signing secret for verifying webhook authenticity (optional but recommended)"},"description":{"type":"string","maxLength":500,"description":"Human-readable description for this webhook"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":494,"tokensAfter":494},{"name":"delete_device","fixed":{"name":"delete_device","description":"Soft-delete a device from the partner account.\n\nWHEN TO USE:\n- Removing a device that's been decommissioned\n- Cleaning up test devices\n- Removing a device that's been relocated to another partner\n\nRETURNS:\n- success: Boolean indicating success\n- device_id: The deleted device ID\n- message: Confirmation message\n\nEXAMPLE:\nUser: \"Remove the old lobby kiosk\"\ndelete_device({\n  device_id: \"lobby-kiosk-old\"\n})","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["device_id"],"properties":{"device_id":{"type":"string","maxLength":100,"minLength":1,"description":"Your internal device identifier to delete"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":205,"tokensAfter":205},{"name":"delete_webhook","fixed":{"name":"delete_webhook","description":"Delete a webhook subscription.\n\nWHEN TO USE:\n- Removing a webhook that's no longer needed\n- Cleaning up old integrations\n- Removing test webhooks\n\nRETURNS:\n- success: Boolean indicating success\n- webhook_id: The deleted webhook ID\n- message: Confirmation message\n\nEXAMPLE:\nUser: \"Delete the old webhook\"\ndelete_webhook({\n  webhook_id: \"wh_mmmpdbvj_8b7c5a59296d\"\n})","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["webhook_id"],"properties":{"webhook_id":{"type":"string","pattern":"^(wh_[a-z0-9]+_[a-f0-9]+|[a-f0-9]{24})$","description":"Webhook ID to delete (wh_xxx format or legacy ObjectId)"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: true, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":205,"tokensAfter":205},{"name":"describe_endpoint","fixed":{"name":"describe_endpoint","description":"Describe a single API operation including its parameters,\nresponse shape, and error codes.\n\nWHEN TO USE:\n- Inspecting an endpoint's full contract before calling it.\n- Discovering which error codes an endpoint can return and how to recover.\n\nRETURNS:\n- operation: Full discovery record for the endpoint.\n- parameters: Raw OpenAPI parameter definitions.\n- request_body: Body schema (when applicable).\n- responses: Map of status code → description/schema.\n- linked_error_codes: Error catalog entries the","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["path","method"],"properties":{"path":{"type":"string","maxLength":256,"minLength":1,"description":"The operation path (OpenAPI template form, e.g. \"/v1/data/screens/{screenId}/audience\")."},"method":{"type":"string","maxLength":16,"minLength":1,"description":"HTTP method (case-insensitive)."}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":273,"tokensAfter":273},{"name":"export_cohort","fixed":{"name":"export_cohort","description":"Export exposed audience cohort to a DSP for retargeting.\n\nPushes MAID hashes from the campaign's exposed cohort to the specified DSP\n(The Trade Desk, DV360, or Meta). Creates or reuses a DSP segment.\n\nWHEN TO USE:\n- Activating DOOH-exposed audiences for retargeting on digital channels\n- Pushing cohorts to TTD, DV360, or Meta Custom Audiences\n- Measuring cross-channel retargeting lift\n\nRETURNS:\n- status: 'synced', 'no_cohort', 'credentials_missing', or 'empty_cohort'\n- destination: the DSP name\n-","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["campaign_id","destination"],"properties":{"campaign_id":{"type":"string","maxLength":128,"minLength":1,"description":"Campaign identifier"},"destination":{"enum":["ttd","dv360","meta","cadent","mediaocean"],"type":"string","description":"DSP destination: ttd (The Trade Desk), dv360 (Google DV360), meta (Meta/Facebook), cadent, mediaocean"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":285,"tokensAfter":285},{"name":"export_dataset","fixed":{"name":"export_dataset","description":"Export observation data as a structured dataset. Supports filtering by time, geography, venue type, and observation family.\n\nQueries the relevant table based on the selected dataset type, applies\nfilters, and returns every matching row as structured data, a page at a time:\nup to 10,000 observation rows or 1,000 cross-signal insights per call, newest\nfirst. When more rows match, metadata.truncated is true and\nmetadata.next_cursor reads the next page: call again with the same dataset and\nfilters a","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["dataset","filters"],"properties":{"cursor":{"type":"string","maxLength":2000,"description":"The previous page's metadata.next_cursor, to read the next page (same dataset and filters)."},"dataset":{"enum":["observations","audience","vehicle","cross_signal"],"type":"string","description":"Type of dataset to export"},"filters":{"type":"object","properties":{"geo":{"type":"string","maxLength":12,"description":"Filter by geohash-6 prefix"},"time_range":{"type":"object","properties":{"end":{"type":"string","description":"End date/time (ISO 8601 or YYYY-MM-DD)"},"start":{"type":"string","description":"Start date/time (ISO 8601 or YYYY-MM-DD)"}},"description":"Time range filter (required for observations/audience/vehicle)","additionalProperties":false},"venue_type":{"type":"array","items":{"type":"string","maxLength":50},"maxItems":20,"description":"Filter by venue types"},"observation_family":{"type":"array","items":{"type":"string","maxLength":50},"maxItems":10,"description":"Filter by observation families (for observations dataset)"}},"description":"Filters to apply to the export","additionalProperties":false}},"additionalProperties":true},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":500,"tokensAfter":500},{"name":"find_similar_moments","fixed":{"name":"find_similar_moments","description":"Find historically similar audience moments across the screen network using embedding similarity search. Input a natural-language description of the target moment.\n\nMoment embeddings are 768-D vectors generated from multi-modal observation data\n(visual, audio, environmental, social) via the MomentEmbeddingService. This tool\nembeds your query text and finds the closest real-world moments via approximate\nnearest-neighbour (ANN) cosine similarity over a Lance IVF_PQ index.\n\nCONSISTENCY: results are ","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["query"],"properties":{"limit":{"type":"integer","maximum":200,"minimum":1,"description":"Maximum results to return. Default: 10, max: 200."},"query":{"type":"string","maxLength":1000,"minLength":1,"description":"Natural-language description of the target moment. Be descriptive about venue, time, audience, behavior, and conditions."},"venue_type":{"type":"string","maxLength":100,"description":"Filter results to a specific venue type. Optional."},"min_similarity":{"type":"number","maximum":1,"minimum":0,"description":"Minimum cosine similarity threshold (0-1). Default: 0.7. Lower values return more but less relevant results."}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":366,"tokensAfter":366},{"name":"get_adcp_capabilities","fixed":{"name":"get_adcp_capabilities","description":"[AdCP] Get the seller agent's AdCP capabilities and supported protocols.\n\nReturns the full capability declaration for this AdCP DOOH seller agent.\nThis tool does NOT require authentication.\n\nWHEN TO USE:\n- Discovering what protocols the seller agent supports (Signals, Media Buy)\n- Understanding available audience signals and data methodology\n- Getting MCP endpoint and discovery URLs\n\nRETURNS:\n- supported_protocols: ['signals', 'media_buy']\n- inventory: DOOH format details, network size\n- audienc","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{},"additionalProperties":true},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":192,"tokensAfter":192},{"name":"get_analytics","fixed":{"name":"get_analytics","description":"Get analytics data for the partner account.\n\nWHEN TO USE:\n- Viewing overall performance metrics\n- Analyzing device performance\n- Generating reports on impressions and earnings\n- Comparing performance over time periods\n\nRETURNS:\n- summary: Overall stats (impressions, earnings, active_devices)\n- time_series: Data points over time\n- top_devices: Best performing devices\n- breakdown: Data grouped by requested dimension\n\nEXAMPLE:\nUser: \"Show me last week's analytics by device\"\nget_analytics({\n  start_","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"end_date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"End date in YYYY-MM-DD format (optional, defaults to today)"},"group_by":{"enum":["day","week","month","device"],"type":"string","description":"How to group the analytics data"},"device_id":{"type":"string","maxLength":100,"description":"Filter to a specific device (optional)"},"start_date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Start date in YYYY-MM-DD format (optional, defaults to 30 days ago)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":332,"tokensAfter":332},{"name":"get_attention_metrics","fixed":{"name":"get_attention_metrics","description":"Get edge AI attention metrics for a campaign (FEIN-powered).\n\nThis is what makes DOOH attribution better than digital: Trillboards MEASURES\nviewability via FEIN edge AI instead of estimating it.\n\nWHEN TO USE:\n- Measuring actual human attention to ads (not just impressions)\n- Comparing attention-adjusted CPM (aCPM) vs standard CPM\n- Getting face count, dwell time, and emotion engagement data\n\nRETURNS:\n- impressions: total, uniqueDevices\n- attention: avgScore (0-1), medianScore, p90Score, avgDwell","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["campaign_id"],"properties":{"campaign_id":{"type":"string","maxLength":128,"minLength":1,"description":"Campaign identifier"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":227,"tokensAfter":227},{"name":"get_attribution_timeseries","fixed":{"name":"get_attribution_timeseries","description":"Get daily attribution timeseries for a campaign.\n\nWHEN TO USE:\n- Tracking attribution trends over time\n- Identifying which days had the strongest lift\n- Building attribution dashboards with daily granularity\n\nRETURNS:\nArray of daily data points, each with:\n- date, uniqueDevices, totalExposures, avgFrequency\n- exposedVisitors, controlVisitors, liftPct, incrementalVisits\n- costPerVisit, totalMediaCost, isSignificant\n\nEXAMPLE:\nget_attribution_timeseries({\n  campaign_id: \"camp_abc123\",\n  start_date:","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["campaign_id"],"properties":{"end_date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"End date (YYYY-MM-DD). Optional, defaults to today."},"start_date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Start date (YYYY-MM-DD). Optional, defaults to campaign start."},"campaign_id":{"type":"string","maxLength":128,"minLength":1,"description":"Campaign identifier"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":307,"tokensAfter":307},{"name":"get_audience_forecast","fixed":{"name":"get_audience_forecast","description":"Predict what the audience will look like at a screen at a specific time.\n\nWHEN TO USE:\n- Planning campaigns for specific time slots\n- Estimating audience composition before buying\n- Comparing audience at different times of day\n\nUses historical audience data to predict typical audience patterns.\n\nRETURNS:\n- predicted_face_count: Expected number of viewers\n- predicted_attention: Expected attention score\n- typical_income: Most common income level at that time\n- typical_lifestyle: Most common lifest","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["screen_id","hour","day"],"properties":{"day":{"type":"integer","maximum":6,"minimum":0,"description":"Day of week (0=Sunday, 1=Monday, ..., 6=Saturday)"},"hour":{"type":"integer","maximum":23,"minimum":0,"description":"Hour of day (0-23)"},"screen_id":{"type":"string","maxLength":50,"minLength":1,"description":"Screen ID to forecast"},"lookback_days":{"type":"integer","maximum":365,"minimum":1,"description":"Days of historical data to use (default: 30)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":319,"tokensAfter":319},{"name":"get_audience_lookalike","fixed":{"name":"get_audience_lookalike","description":"Find screens with similar audience profiles using pgvector similarity.\n\nUses 64-dimensional audience vectors with HNSW cosine similarity index\nto find screens whose audience demographics, attention, and behavioral\npatterns match a target screen.\n\nWHEN TO USE:\n- Expanding campaign reach to screens with similar audiences\n- Finding new inventory that matches a high-performing screen\n- Building lookalike audience segments for targeting\n\nRETURNS:\nArray of similar screens ranked by cosine similarity, ","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["screen_id"],"properties":{"limit":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum number of results (default: 20, max: 100)"},"country":{"type":"string","maxLength":100,"description":"Filter by country (optional)"},"screen_id":{"type":"string","maxLength":128,"minLength":1,"description":"Source screen ID to find lookalikes for"},"venue_type":{"type":"string","maxLength":100,"description":"Filter by venue type (optional)"},"min_similarity":{"type":"number","maximum":1,"minimum":0,"description":"Minimum cosine similarity threshold 0-1 (default: 0.7)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":352,"tokensAfter":352},{"name":"get_billing_status","fixed":{"name":"get_billing_status","description":"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.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":107,"tokensAfter":107},{"name":"get_campaign_attribution","fixed":{"name":"get_campaign_attribution","description":"Get comprehensive attribution summary for a DOOH campaign.\n\nWHEN TO USE:\n- Measuring overall campaign effectiveness (reach, footfall, sales lift)\n- Getting a high-level view of campaign attribution metrics\n- Checking statistical significance of attribution results\n\nRETURNS:\n- reach: uniqueDevices, totalImpressions, avgFrequency\n- footfall: exposedVisitors, controlVisitors, incrementalLiftPct, incrementalVisits\n- cost: totalMediaCost, costPerUniqueReach, costPerIncrementalVisit\n- quality: avgMatc","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["campaign_id"],"properties":{"campaign_id":{"type":"string","maxLength":128,"minLength":1,"description":"Campaign identifier (UUID or string ID from create_campaign)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":239,"tokensAfter":239},{"name":"get_campaign_heatmap","fixed":{"name":"get_campaign_heatmap","description":"Get geographic exposure heatmap data for a campaign.\n\nReturns lat/lng clusters with exposure counts and device reach,\nuseful for visualizing where ads were shown on a map.\n\nWHEN TO USE:\n- Visualizing campaign geographic coverage\n- Identifying hotspots of ad exposure\n- Analyzing geographic distribution of attributed foot traffic\n\nRETURNS:\nArray of geographic clusters (max 500), each with:\n- lat, lng (rounded to 3 decimal places)\n- uniqueDevices, totalExposures\n- avgConfidence (match confidence sc","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["campaign_id"],"properties":{"campaign_id":{"type":"string","maxLength":128,"minLength":1,"description":"Campaign identifier"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":227,"tokensAfter":227},{"name":"get_campaign_performance","fixed":{"name":"get_campaign_performance","description":"Get detailed performance metrics for a campaign.\n\nWHEN TO USE:\n- Monitoring active campaign performance\n- Reviewing completed campaign results\n- Getting per-screen impression breakdowns\n\nRETURNS:\n- campaign_id, name, status, budget, dates\n- performance: impressions, spend_estimate_usd, avg_cpm, unique_screens, avg_latency_ms\n- screen_breakdown: per-screen impressions and CPM\n\nEXAMPLE:\nUser: \"How is my NYC retail campaign performing?\"\nget_campaign_performance({ campaign_id: \"550e8400-e29b-41d4-a7","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["campaign_id"],"properties":{"campaign_id":{"type":"string","maxLength":100,"minLength":1,"description":"Campaign UUID returned from create_campaign"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":235,"tokensAfter":235},{"name":"get_content_performance","fixed":{"name":"get_content_performance","description":"Get performance metrics for a video across the Trillboards DOOH network.\n\nWHEN TO USE:\n- Checking how a specific video performs across screens (plays, attention, audience size)\n- Analyzing which venue types and dayparts a video resonates best in\n- Finding the top-performing screens for a piece of content\n- Comparing content performance over different time windows\n\nRETURNS:\n- videoId, title, totalPlays, uniqueScreens\n- avgAttention (0-1), avgAudienceSize, avgDwellMs\n- venueDistribution: Array of ","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["video_id"],"properties":{"days":{"type":"integer","maximum":90,"minimum":1,"description":"Lookback window in days (default: 30, max: 90)"},"video_id":{"type":"string","maxLength":200,"minLength":1,"description":"YouTube video ID to query performance for"},"venue_type":{"type":"string","maxLength":100,"description":"Optional venue type filter (e.g., \"retail\", \"transit\", \"bar\")"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":299,"tokensAfter":299},{"name":"get_content_recommendations","fixed":{"name":"get_content_recommendations","description":"Get best-performing content recommendations for a venue type and optional time context.\n\nWHEN TO USE:\n- Deciding what content to schedule at a specific venue type\n- Finding content that drives the highest audience engagement at a location\n- Optimizing content rotation by daypart (morning, afternoon, evening, overnight)\n- Content programming decisions based on performance data\n\nRETURNS:\n- data: Array of recommended content ranked by performance score\n  - videoId, title, contentCategory, durationS","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["venue_type"],"properties":{"limit":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum recommendations to return (default: 10, max: 100)"},"daypart":{"enum":["morning","afternoon","evening","overnight"],"type":"string","description":"Optional daypart filter"},"venue_type":{"type":"string","maxLength":100,"minLength":1,"description":"Venue type to get recommendations for (required)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":304,"tokensAfter":304},{"name":"get_creative_attention","fixed":{"name":"get_creative_attention","description":"Get per-creative attention breakdown for a campaign.\n\nWHEN TO USE:\n- A/B testing creative variants by attention score\n- Identifying which creative drives the most engagement\n- Comparing aCPM across creative assets\n\nRETURNS:\nArray of creatives ranked by attention score, each with:\n- creativeId, totalImpressions, uniqueDevices\n- avgAttentionScore (0-1), avgDwellSeconds, avgFaceCount\n- attentionCpm, avgEmotionEngagement, positiveEmotionPct, attentionQualifiedPct","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["campaign_id"],"properties":{"campaign_id":{"type":"string","maxLength":128,"minLength":1,"description":"Campaign identifier"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":216,"tokensAfter":216},{"name":"get_creative_attribution","fixed":{"name":"get_creative_attribution","description":"Get attribution performance by individual creative variant.\n\nLinks creative execution to attribution outcomes: which creative variant\ndrove the most store visits?\n\nWHEN TO USE:\n- Comparing creative A/B/C test performance on attribution outcomes\n- Finding the optimal creative x venue_type x daypart x weather combination\n- Identifying the creative with the highest visit rate\n\nRETURNS:\nArray of creatives ranked by store visits, each with:\n- creativeId, variant, totalVisits, avgVisitRate\n- attention","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["campaign_id"],"properties":{"campaign_id":{"type":"string","maxLength":128,"minLength":1,"description":"Campaign identifier"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":228,"tokensAfter":228},{"name":"get_cross_channel_journey","fixed":{"name":"get_cross_channel_journey","description":"Get cross-channel customer journey data (Sankey flow) for a campaign.\n\nShows how users flow between channels: DOOH -> mobile -> web -> store.\n\nWHEN TO USE:\n- Visualizing the customer journey across DOOH and digital channels\n- Understanding channel transition patterns\n- Building Sankey diagrams of marketing funnels\n\nRETURNS:\n- flows: Array of { source, target, count } transitions between channels\n- channels: Array of { channel, touchpoints, uniqueDevices } distribution","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["campaign_id"],"properties":{"campaign_id":{"type":"string","maxLength":128,"minLength":1,"description":"Campaign identifier"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":220,"tokensAfter":220},{"name":"get_dataset_stats","fixed":{"name":"get_dataset_stats","description":"Get statistics about available causal training data: total tuples, unique creatives, venue diversity, date range.\n\nQueries observation_stream for rows that have both a creative ID and a VAS\noutcome recorded, giving a picture of how much training data is available\nfor the causal prediction engine.\n\nWHEN TO USE:\n- Checking if enough data exists for reliable causal predictions\n- Understanding the diversity of training data (creatives, venues, time range)\n- Monitoring causal dataset health and growt","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":190,"tokensAfter":190},{"name":"get_device","fixed":{"name":"get_device","description":"Get detailed information about a specific device.\n\nWHEN TO USE:\n- Checking status of a single device\n- Getting device configuration details\n- Debugging device issues\n\nRETURNS:\n- device_id: Your internal device ID\n- trillboards_device_id: Internal Trillboards ID\n- fingerprint: Device fingerprint\n- name: Device name\n- status: online/offline\n- last_seen: Last heartbeat timestamp\n- location: Location details\n- specs: Device specifications\n- stats: Impression and earnings stats\n\nEXAMPLE:\nUser: \"Get d","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["device_id"],"properties":{"device_id":{"type":"string","maxLength":100,"minLength":1,"description":"Your internal device identifier"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":228,"tokensAfter":228},{"name":"get_device_ads","fixed":{"name":"get_device_ads","description":"Get current ads scheduled for a device (for testing).\n\nWHEN TO USE:\n- Testing device ad delivery\n- Debugging which ads are being shown\n- Verifying ad targeting is working\n\nRETURNS:\n- ads: Array of advertisement objects\n- default_stream: Default content when no ads\n- schedule: Current ad schedule\n\nEXAMPLE:\nUser: \"What ads are showing on device P_abc123?\"\nget_device_ads({\n  fingerprint: \"P_abc123\"\n})","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["fingerprint"],"properties":{"fingerprint":{"type":"string","maxLength":100,"minLength":1,"description":"Device fingerprint (e.g., \"P_abc123\")"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":205,"tokensAfter":205},{"name":"get_incrementality","fixed":{"name":"get_incrementality","description":"Get incrementality/lift test results for a campaign.\n\nUses Bayesian (Beta-Binomial with 10K Monte Carlo samples) and frequentist\n(chi-square with Yates correction) methods for causal measurement.\n\nWHEN TO USE:\n- Proving causal DOOH advertising effectiveness\n- Getting both Bayesian and frequentist significance measures\n- Seeing treatment vs control group visit rates and lift\n\nRETURNS:\nArray of experiments, each with:\n- experimentId, type (geo_holdout/ghost_ads/psm), status\n- treatmentDmas, contro","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["campaign_id"],"properties":{"campaign_id":{"type":"string","maxLength":128,"minLength":1,"description":"Campaign identifier"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":226,"tokensAfter":226},{"name":"get_live_audience","fixed":{"name":"get_live_audience","description":"Get real-time audience data for a specific screen.\n\nWHEN TO USE:\n- Checking current audience at a screen before buying\n- Monitoring audience during a live campaign\n- Getting detailed audience signals (attention, mood, purchase intent, demographics)\n\nRETURNS real-time data from edge AI sensors (refreshed every 10 seconds):\n- face_count: Number of people currently viewing\n- attention_score: How attentively the audience is watching (0-1)\n- income_level: Estimated income bracket (from Gemini Vision)","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["screen_id"],"properties":{"screen_id":{"type":"string","maxLength":50,"minLength":1,"description":"Screen ID to get live audience for"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":228,"tokensAfter":228},{"name":"get_media_buy_delivery","fixed":{"name":"get_media_buy_delivery","description":"[AdCP Media Buy] Get delivery/performance report for a media buy.\n\nReturns campaign performance with breakdowns by screen, venue, hour, and audience segment.\n\nWHEN TO USE:\n- Monitoring campaign delivery in real-time\n- Getting performance breakdowns for optimization\n- Reporting on campaign results\n\nRETURNS:\n- delivery: impressions, spend, avg_cpm, unique_screens, fill_rate\n- breakdowns: by_screen, by_venue, by_hour (top performers)\n\nEXAMPLE:\nget_media_buy_delivery({ media_buy_id: \"mbuy_abc123\" })","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["media_buy_id"],"properties":{"dimensions":{"type":"array","items":{"enum":["screen","venue","hour","audience_segment","creative","day"],"type":"string"},"description":"Reporting dimensions to include. Only \"screen\" is supported; anything else is returned in dimensions_unsupported rather than silently dropped."},"breakdown_by":{"type":"array","items":{"enum":["screen","venue","hour","audience_segment"],"type":"string"},"description":"Dimensions to break down by (legacy, prefer dimensions). Same single supported value."},"media_buy_id":{"type":"string","maxLength":100,"minLength":1,"description":"Media buy ID"}},"additionalProperties":true},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":365,"tokensAfter":365},{"name":"get_media_buys","fixed":{"name":"get_media_buys","description":"[AdCP Media Buy] List media buys with status, budget, flight and optional delivery snapshots.\n\nStatus, budget and flight are read from the advertisements + placements spine the buy\nactually books on — not from a stored display string. A buy that its flight ended, or\nthat the pacing cron completed on goal, reports the truth here even though nothing\nrewrote it.\n\nWHEN TO USE:\n- Polling the buys you have open on this account\n- Confirming a buy left pending_creatives after sync_creatives\n- Getting a ","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"context":{"type":"object","additionalProperties":{}},"pagination":{"type":"object","properties":{"cursor":{"type":"string","maxLength":500,"description":"Opaque cursor from a previous response"},"max_results":{"type":"integer","maximum":100,"minimum":1,"description":"Page size (1-100, default 50)"}},"additionalProperties":false},"media_buy_ids":{"type":"array","items":{"type":"string","maxLength":100,"minLength":1},"maxItems":100,"minItems":1,"description":"Specific media buy IDs. When omitted, returns a paginated set matching status_filter."},"status_filter":{"anyOf":[{"enum":["pending_creatives","pending_start","active","paused","completed","rejected","canceled"],"type":"string"},{"type":"array","items":{"$ref":"#/properties/status_filter/anyOf/0"},"minItems":1}],"description":"Single status or array of statuses. Defaults to ['active'] when media_buy_ids is omitted; no implicit filter when ids are given."},"include_snapshot":{"type":"boolean","description":"Include a delivery snapshot per package (impressions, spend, pacing_index). Read live off placements, so staleness_seconds is 0."}},"additionalProperties":true},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":496,"tokensAfter":496},{"name":"get_multi_touch_attribution","fixed":{"name":"get_multi_touch_attribution","description":"Get multi-touch attribution model results for a campaign.\n\nSupported models: time_decay, position_based, attention_weighted.\n\nWHEN TO USE:\n- Understanding how DOOH fits into the full marketing funnel\n- Seeing credit allocation across DOOH, mobile, web, and store channels\n- Quantifying DOOH's contribution to conversions\n\nRETURNS:\n- totalChains: number of multi-touch journeys found\n- avgTouchpoints: average touchpoints per chain\n- channelAttribution: { dooh, mobile, web, store } (each 0-1, sums to","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["campaign_id"],"properties":{"campaign_id":{"type":"string","maxLength":128,"minLength":1,"description":"Campaign identifier"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":228,"tokensAfter":228},{"name":"get_network_stats","fixed":{"name":"get_network_stats","description":"Get network-wide statistics across all partner screens.\n\nWHEN TO USE:\n- Getting a high-level overview of network performance\n- Checking how many screens are online\n- Reviewing total impressions and revenue estimates\n\nRETURNS:\n- total_screens, online_screens\n- impressions, total_auctions\n- revenue_estimate_usd, avg_cpm, fill_rate\n\nEXAMPLE:\nUser: \"How is my network performing this week?\"\nget_network_stats({ time_range: \"7d\" })","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"time_range":{"enum":["today","7d","30d"],"type":"string","description":"Time range for stats (default: 7d)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":203,"tokensAfter":203},{"name":"get_partner_info","fixed":{"name":"get_partner_info","description":"Get information about the authenticated partner account.\n\nWHEN TO USE:\n- Checking current partner status and stats\n- Verifying API key is working\n- Getting partner account details\n\nRETURNS:\n- partner_id: Partner identifier\n- company_name: Registered company name\n- status: Account status (active, suspended, etc.)\n- device_count: Number of registered devices\n- total_impressions: Lifetime impression count\n- earnings: Earnings summary\n\nEXAMPLE:\nUser: \"What's my partner account status?\"\nget_partner_i","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":193,"tokensAfter":193},{"name":"get_pricing","fixed":{"name":"get_pricing","description":"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.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"product":{"enum":["data_api","proof_of_play","attribution","data_marketplace","partner_platform","programmatic","fein_edge_ai"],"type":"string","description":"Optional: filter to a specific product (data_api, proof_of_play, attribution, data_marketplace, partner_platform, programmatic, fein_edge_ai)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":195,"tokensAfter":195},{"name":"get_products","fixed":{"name":"get_products","description":"[AdCP Media Buy] Get available DOOH advertising products and packages.\n\nNO AUTHENTICATION REQUIRED. Discovery is open — read the catalogue first, get a\nkey when you want to transact.\n\nSend a natural-language `brief` and it is answered from what the screens\nactually observed: each product's `description` reports the hours people are\nreally in frame (in the screens' own local time), how long they dwell, the mood\n/ movement / gaze the on-device sensors reported, what the speech layer heard\npeople s","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"brief":{"type":"string","description":"Natural language campaign brief for AI-driven inventory matching"},"market":{"type":"string","maxLength":100,"description":"Market/city to get products for"},"filters":{"type":"object","properties":{"channels":{"type":"array","items":{"type":"string"}},"countries":{"type":"array","items":{"type":"string"}},"venue_types":{"type":"array","items":{"type":"string","maxLength":50},"maxItems":20},"budget_range":{"type":"object","properties":{"max":{"type":"number"},"min":{"type":"number"},"currency":{"type":"string"}},"additionalProperties":false},"format_types":{"type":"array","items":{"type":"string"}},"delivery_type":{"type":"string"}},"description":"Structured filters for wholesale/refine modes","additionalProperties":true},"pagination":{"type":"object","properties":{"cursor":{"type":"string","maxLength":500},"max_results":{"type":"integer","maximum":100,"minimum":1}},"additionalProperties":false},"buying_mode":{"enum":["brief","wholesale","refine"],"type":"string","description":"AdCP buying mode (default: brief)"},"venue_types":{"type":"array","items":{"type":"string","maxLength":50},"maxItems":20,"description":"Filter by venue types (legacy, prefer filters.venue_types)"},"audience_profile":{"type":"object","properties":{"income":{"type":"string"},"lifestyle":{"type":"string"},"min_attention":{"type":"number","maximum":1,"minimum":0}},"description":"Target audience characteristics","additionalProperties":false}},"additionalProperties":true},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":598,"tokensAfter":598},{"name":"get_roas","fixed":{"name":"get_roas","description":"Get Return on Ad Spend (ROAS) with transaction attribution data.\n\nCloses the ROAS loop: matches purchase events to DOOH exposures with\ntime-decay weighting, and computes attributed revenue and incremental ROAS.\n\nWHEN TO USE:\n- Measuring revenue directly attributable to DOOH advertising\n- Getting ROAS and incremental ROAS (iROAS) figures\n- Seeing sales lift between exposed and control groups\n\nRETURNS:\n- transactions: total, uniquePurchasers, totalRevenueCents, avgBasketCents\n- attribution: attrib","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["campaign_id"],"properties":{"campaign_id":{"type":"string","maxLength":128,"minLength":1,"description":"Campaign identifier"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":223,"tokensAfter":223},{"name":"get_signals","fixed":{"name":"get_signals","description":"[AdCP Signals] Get real-time audience signals from DOOH screens.\n\nThis is an AdCP (Ad Context Protocol) compliant tool. It returns deterministic audience\nsignals captured by edge AI (vision + audio + speech) on available screens.\n\nWHEN TO USE:\n- Discovering available audience signals before buying inventory\n- Evaluating audience composition at specific venues or locations\n- Building targeting segments based on real-time audience data\n\nUnlike probabilistic data, these signals are DETERMINISTIC — ","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"pagination":{"type":"object","properties":{"cursor":{"type":"string","maxLength":200},"max_results":{"type":"integer","maximum":100,"minimum":1}},"additionalProperties":false},"signal_spec":{"anyOf":[{"type":"string","maxLength":2000},{"type":"object","properties":{"filters":{"type":"object","properties":{"city":{"type":"string","maxLength":100},"state":{"type":"string","maxLength":100},"income":{"type":"string"},"lifestyle":{"type":"string"},"venue_type":{"type":"string","maxLength":50}},"additionalProperties":false},"signal_types":{"type":"array","items":{"enum":["demographics","venue","geo","behavior"],"type":"string"}}},"additionalProperties":false}],"description":"Natural language description of the desired signals (AdCP form), or a structured Trillboards signal specification."}},"additionalProperties":true},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":409,"tokensAfter":409},{"name":"get_social_attention","fixed":{"name":"get_social_attention","description":"Query measured social attention events within your authorized screen and venue scope. Filter by minimum social amplification factor and time range; results are sorted by social amplification factor descending.\n\nWHEN TO USE:\n- Finding moments where social proof drove collective engagement\n- Identifying which venues or dayparts exhibit highest attention contagion\n- Understanding cascading attention patterns (cascade depth)\n- Correlating social amplification with ad effectiveness (VAS)\n\nRETURNS:\n- ","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"limit":{"type":"integer","maximum":200,"minimum":1,"description":"Maximum results to return. Default: 20, max: 200."},"min_saf":{"type":"number","maximum":100,"minimum":0,"description":"Minimum social amplification factor threshold. Default: 1.5. Higher values return only stronger contagion events."},"screen_id":{"type":"string","maxLength":100,"description":"Filter by screen MongoDB ID. Optional."},"time_range":{"type":"object","properties":{"end":{"type":"string","description":"End time (ISO 8601)"},"start":{"type":"string","description":"Start time (ISO 8601)"}},"description":"Time range filter. Defaults to last 24 hours.","additionalProperties":false},"venue_type":{"type":"string","maxLength":100,"description":"Filter by venue type (e.g., \"bar\", \"restaurant_qsr\", \"transit\"). Optional."}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":415,"tokensAfter":415},{"name":"get_social_contagion_summary","fixed":{"name":"get_social_contagion_summary","description":"Aggregate social attention metrics across screens and time periods. Shows which venues and dayparts have the highest social amplification.\n\nSummarizes measured social attention events within your authorized scope by the\nrequested dimension (venue, daypart, or screen), computing average SAF,\naverage cascade depth, average viral attention score, and event count.\n\nWHEN TO USE:\n- Understanding which venues generate the most social amplification\n- Comparing daypart effectiveness for social contagion\n","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"group_by":{"enum":["venue","daypart","screen"],"type":"string","description":"Dimension to group by: \"venue\", \"daypart\", or \"screen\". Default: \"venue\"."},"time_range":{"type":"object","properties":{"end":{"type":"string","description":"End time (ISO 8601)"},"start":{"type":"string","description":"Start time (ISO 8601)"}},"description":"Time range filter. Defaults to last 7 days.","additionalProperties":false}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":310,"tokensAfter":310},{"name":"get_task_status","fixed":{"name":"get_task_status","description":"[AdCP Protocol] Get the status of a previously issued AdCP task.\n\nEvery AdCP task Trillboards serves for an AUTHENTICATED caller is recorded and\nreturned a `task_id`. Poll that id here to read the task's terminal state and,\nwith `include_result: true`, its completion payload.\n\nTrillboards answers every AdCP task in-process, so a task is already\n`completed` by the time you hold its id — this tool exists so a buyer that\npolls does not hang, and so an async arm has somewhere to report from when one","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["task_id"],"properties":{"account":{"type":"object","properties":{"brand":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","maxLength":253},"brand_id":{"type":"string","maxLength":200}},"additionalProperties":false},"sandbox":{"type":"boolean"},"operator":{"type":"string","maxLength":253},"account_id":{"type":"string","maxLength":200}},"additionalProperties":false},"context":{"type":"object","additionalProperties":{}},"task_id":{"type":"string","maxLength":200,"minLength":1,"description":"Unique identifier of the task to retrieve, as issued in the `task_id` field of the originating task response."},"include_result":{"type":"boolean","description":"Include the task's result payload when status is completed. Defaults to false for lightweight status-only polls."},"include_history":{"type":"boolean","description":"Include conversation history. Trillboards tasks complete in-process and hold no multi-turn history, so this is accepted and has no effect."}},"additionalProperties":true},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":464,"tokensAfter":464},{"name":"get_usage_summary","fixed":{"name":"get_usage_summary","description":"Get your current billing period usage summary with per-product breakdown and costs. Shows free tier consumption, paid usage, and total cost.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":88,"tokensAfter":88},{"name":"get_webhook_deliveries","fixed":{"name":"get_webhook_deliveries","description":"Get delivery history for a webhook.\n\nWHEN TO USE:\n- Debugging failed webhook deliveries\n- Auditing webhook activity\n- Checking delivery success rates\n\nRETURNS:\n- deliveries: Array of delivery records with:\n  - delivery_id: Unique delivery ID\n  - event: Event type\n  - status: success/failed\n  - response_code: HTTP response code\n  - response_time_ms: Response time\n  - attempted_at: Attempt timestamp\n  - error: Error message (if failed)\n- total: Total delivery count\n- success_rate: Percentage of su","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["webhook_id"],"properties":{"limit":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum number of deliveries to return (default: 50, max: 100)"},"status":{"enum":["all","success","failed"],"type":"string","description":"Filter by delivery status"},"webhook_id":{"type":"string","pattern":"^(wh_[a-z0-9]+_[a-f0-9]+|[a-f0-9]{24})$","description":"Webhook ID to get deliveries for (wh_xxx format or legacy ObjectId)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":312,"tokensAfter":312},{"name":"list_accounts","fixed":{"name":"list_accounts","description":"[AdCP Accounts] List the accounts this credential can transact on.\n\nThis seller's account model is 'explicit': one API key IS one account, so this returns\nexactly one account — the partner behind the key. Use it to discover your account_id\nbefore any account-scoped call, and to confirm the account's status before you buy.\n\nWHEN TO USE:\n- Discovering the account_id to pass to account-scoped tasks\n- Checking your account is 'active' before creating a media buy\n- Introspecting what your key is perm","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"status":{"enum":["active","pending_approval","rejected","payment_required","suspended","closed"],"type":"string","description":"Filter by account status. Omit to return the account in any status."},"account":{"type":"object","properties":{"brand":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","maxLength":253},"brand_id":{"type":"string","maxLength":200}},"additionalProperties":false},"sandbox":{"type":"boolean"},"operator":{"type":"string","maxLength":253},"account_id":{"type":"string","maxLength":200}},"description":"Exact 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.","additionalProperties":false},"context":{"type":"object","additionalProperties":{}},"sandbox":{"type":"boolean","description":"Filter 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."},"pagination":{"type":"object","properties":{"cursor":{"type":"string","maxLength":500},"max_results":{"type":"integer","maximum":100,"minimum":1}},"additionalProperties":false}},"additionalProperties":true},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":598,"tokensAfter":598},{"name":"list_creative_formats","fixed":{"name":"list_creative_formats","description":"[AdCP Media Buy] List the creative formats this network actually accepts.\n\nEvery format is DERIVED from live per-screen capability (panel size, min/max spot\nlength, audio) — not a hand-written list. The set published here is exactly the set\nsync_creatives accepts: if a creative matches a format returned by this tool, it will\nnot be rejected for dimensions, duration or file size.\n\nWHEN TO USE:\n- Before building creative, to size it to the panels you are buying\n- To check whether an existing asset","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"context":{"type":"object","additionalProperties":{}},"max_width":{"type":"number","description":"Maximum render width in pixels (inclusive)"},"min_width":{"type":"number","description":"Minimum render width in pixels (inclusive)"},"format_ids":{"type":"array","items":{"type":"object","required":["agent_url","id"],"properties":{"id":{"type":"string","maxLength":200},"width":{"type":"number"},"height":{"type":"number"},"agent_url":{"type":"string","maxLength":500},"duration_ms":{"type":"number"}},"additionalProperties":false},"minItems":1,"description":"Return only these formats. Each entry is an AdCP structured format reference ({agent_url, id}), never a bare string."},"max_height":{"type":"number","description":"Maximum render height in pixels (inclusive)"},"min_height":{"type":"number","description":"Minimum render height in pixels (inclusive)"},"pagination":{"type":"object","properties":{"cursor":{"type":"string","maxLength":500,"description":"Opaque cursor from a previous response"},"max_results":{"type":"integer","maximum":100,"minimum":1,"description":"Page size (1-100, default 50)"}},"description":"Cursor-based pagination","additionalProperties":false},"asset_types":{"type":"array","items":{"type":"string","maxLength":50},"minItems":1,"description":"Filter to formats containing these asset types, e.g. ['video'] or ['image']."},"name_search":{"type":"string","maxLength":200,"description":"Case-insensitive partial match on the format name"},"is_responsive":{"type":"boolean","description":"Filter for responsive formats. Every DOOH panel is a fixed pixel grid, so true matches nothing here."},"publisher_domain":{"type":"string","maxLength":253,"description":"Resolve 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."}},"additionalProperties":true},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":713,"tokensAfter":713},{"name":"list_creatives","fixed":{"name":"list_creatives","description":"[AdCP Creative] List the creatives this buyer has on file with us.\n\nOUR LIBRARY IS PER-BUY, AND THIS SAYS SO. AdCP's creative library models concepts,\nvariables, assignments and snapshots; ours does not have those. A creative here is\nthe one asset attached to a media buy by sync_creatives, so this is a projection of\nYOUR OWN buys — never someone else's assets, and never an invented concept_id to\nlook richer than we are.\n\nWHEN TO USE:\n- To confirm a creative you sent actually landed, and where it","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"ext":{"type":"object","additionalProperties":{}},"sort":{"type":"object","additionalProperties":{}},"fields":{"type":"array","items":{"type":"string","maxLength":100},"maxItems":100},"account":{"type":"object","properties":{"brand":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","maxLength":253},"brand_id":{"type":"string","maxLength":200}},"additionalProperties":false},"sandbox":{"type":"boolean"},"operator":{"type":"string","maxLength":253},"account_id":{"type":"string","maxLength":200}},"additionalProperties":false},"context":{"type":"object","additionalProperties":{}},"filters":{"type":"object","properties":{"tags":{"type":"array","items":{"type":"string","maxLength":100},"maxItems":50},"status":{"anyOf":[{"enum":["processing","pending_review","approved","rejected","archived"],"type":"string"},{"type":"array","items":{"enum":["processing","pending_review","approved","rejected","archived"],"type":"string"},"minItems":1}],"description":"AdCP creative-status: processing | pending_review | approved | rejected | archived"},"format_ids":{"type":"array","maxItems":200},"creative_ids":{"type":"array","items":{"type":"string","maxLength":100,"minLength":1},"maxItems":200},"media_buy_ids":{"type":"array","items":{"type":"string","maxLength":100,"minLength":1},"maxItems":200}},"description":"Narrow the result set. All fields optional.","additionalProperties":false},"pagination":{"type":"object","properties":{"cursor":{"type":"string","maxLength":500},"max_results":{"type":"integer","maximum":100,"minimum":1}},"additionalProperties":false},"include_items":{"type":"boolean"},"include_purged":{"type":"boolean"},"include_pricing":{"type":"boolean"},"include_snapshot":{"type":"boolean"},"include_variables":{"type":"boolean"},"include_assignments":{"type":"boolean","description":"Include which media buys each creative is attached to."},"webhook_activity_limit":{"type":"integer","maximum":1000,"minimum":0},"include_webhook_activity":{"type":"boolean"}},"additionalProperties":true},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":745,"tokensAfter":745},{"name":"list_devices","fixed":{"name":"list_devices","description":"List all devices registered to the partner account.\n\nWHEN TO USE:\n- Getting an overview of all connected devices\n- Finding devices by status (online/offline)\n- Auditing the device fleet\n\nRETURNS:\n- devices: Array of device objects\n- total: Total device count\n- online_count: Number of online devices\n- offline_count: Number of offline devices\n\nEXAMPLE:\nUser: \"Show me all my online devices\"\nlist_devices({\n  status: \"online\",\n  limit: 50\n})","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"limit":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum number of devices to return (default: 50, max: 100)"},"offset":{"type":"integer","minimum":0,"description":"Pagination offset"},"status":{"enum":["all","online","offline"],"type":"string","description":"Filter by device status"},"device_type":{"enum":["vending_machine","kiosk","tablet","display","digital_signage","other"],"type":"string","description":"Filter by device type"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":302,"tokensAfter":302},{"name":"list_endpoints","fixed":{"name":"list_endpoints","description":"List every registered Trillboards API operation.\n\nWHEN TO USE:\n- First call in an agent session to learn what the API offers.\n- Filter to agent_safe=true to list only side-effect-free endpoints.\n- Narrow to a single surface (data-api, sdk-api, device-api, sensing-api,\n  partner-api-generated, dsp-api-generated).\n\nRETURNS:\n- operations: Array of { surface, method, path, operation_id, summary,\n  description, agent_safe, idempotent, cost_tier, tags, doc_url,\n  example_request }\n- total_operations: ","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"surface":{"type":"string","maxLength":64,"description":"Filter to one surface (e.g. \"data-api\")."},"agent_safe":{"type":"boolean","description":"When true, return only endpoints flagged agent-safe."},"idempotent":{"type":"boolean","description":"When true, return only endpoints flagged idempotent."}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":274,"tokensAfter":274},{"name":"list_error_codes","fixed":{"name":"list_error_codes","description":"List every error code in the Trillboards API error catalog.\n\nWHEN TO USE:\n- Understanding what error codes the API can return.\n- Building a client-side error handler that covers all cases.\n- Looking up error types, HTTP statuses, and documentation URLs.\n\nRETURNS:\n- object: \"list\"\n- data: Array of { code, type, http_status, description, doc_url }\n- total: Total number of error codes.\n\nEquivalent to GET /v1/errors but executed in-process (no HTTP round-trip).\n\nEXAMPLE:\nAgent: \"What error codes can","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":192,"tokensAfter":192},{"name":"list_tasks","fixed":{"name":"list_tasks","description":"[AdCP Protocol] List AdCP tasks belonging to your account, newest first.\n\nReturns `query_summary` (totals and a status breakdown), `tasks`, and\n`pagination`. Filter by status or task type. Scoped to the calling account —\nan unauthenticated call returns an empty page rather than another account's\ntasks.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"account":{"type":"object","properties":{"brand":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","maxLength":253},"brand_id":{"type":"string","maxLength":200}},"additionalProperties":false},"sandbox":{"type":"boolean"},"operator":{"type":"string","maxLength":253},"account_id":{"type":"string","maxLength":200}},"additionalProperties":false},"context":{"type":"object","additionalProperties":{}},"filters":{"type":"object","properties":{"status":{"enum":["submitted","working","input-required","completed","canceled","failed","rejected","auth-required","unknown"],"type":"string","description":"Single task status to match"},"statuses":{"type":"array","items":{"enum":["submitted","working","input-required","completed","canceled","failed","rejected","auth-required","unknown"],"type":"string"},"description":"Task statuses to match (enums/task-status.json)"},"task_type":{"enum":["create_media_buy","update_media_buy","media_buy_delivery","sync_creatives","build_creative","activate_signal","get_products","get_signals","create_property_list","update_property_list","get_property_list","list_property_lists","delete_property_list","sync_accounts","get_account_financials","get_creative_delivery","sync_event_sources","sync_audiences","sync_catalogs","log_event","get_brand_identity","search_brands","get_rights","acquire_rights"],"type":"string","description":"Single task type to match"},"task_types":{"type":"array","items":{"enum":["create_media_buy","update_media_buy","media_buy_delivery","sync_creatives","build_creative","activate_signal","get_products","get_signals","create_property_list","update_property_list","get_property_list","list_property_lists","delete_property_list","sync_accounts","get_account_financials","get_creative_delivery","sync_event_sources","sync_audiences","sync_catalogs","log_event","get_brand_identity","search_brands","get_rights","acquire_rights"],"type":"string"},"description":"Task types to match (enums/task-type.json)"}},"description":"Narrow the returned tasks.","additionalProperties":false},"pagination":{"type":"object","properties":{"limit":{"type":"integer","maximum":100,"minimum":1,"description":"Page size (max 100, default 50)"},"offset":{"type":"integer","minimum":0,"description":"Rows to skip"}},"additionalProperties":false}},"additionalProperties":true},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":774,"tokensAfter":774},{"name":"list_webhooks","fixed":{"name":"list_webhooks","description":"List all webhook subscriptions for the partner account.\n\nWHEN TO USE:\n- Viewing all configured webhooks\n- Auditing webhook subscriptions\n- Finding a webhook to update or delete\n\nRETURNS:\n- webhooks: Array of webhook objects with:\n  - webhook_id: Unique identifier\n  - url: Endpoint URL\n  - events: Subscribed events\n  - enabled: Whether webhook is active\n  - created_at: Creation timestamp\n  - last_delivery: Last successful delivery time\n\nEXAMPLE:\nUser: \"Show me all my webhooks\"\nlist_webhooks({})","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":192,"tokensAfter":192},{"name":"predictive_query","fixed":{"name":"predictive_query","description":"Generate predictive insights from observation patterns. Predict whether a venue is likely to see increased foot traffic based on current patterns.\n\nUses historical observation_stream data to compute trend analysis via\nlinear regression on time-bucketed metrics. Generates predictions with\nconfidence intervals based on the observed trend, variance, and sample size.\n\nWHEN TO USE:\n- Predicting future audience patterns at a venue or screen\n- Forecasting foot traffic trends for campaign planning\n- Und","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["question"],"properties":{"question":{"type":"string","maxLength":500,"minLength":1,"description":"Natural language question about the predicted trend or outcome"},"screen_id":{"type":"string","maxLength":100,"description":"Filter predictions to a specific screen (mongo ID). Optional."},"venue_type":{"type":"string","maxLength":100,"description":"Filter predictions to a specific venue type. Optional."},"time_horizon":{"type":"string","pattern":"^\\d+d$","description":"How far ahead to predict (e.g., \"1d\", \"3d\", \"7d\", \"14d\"). Default: \"7d\", max: \"30d\""}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":348,"tokensAfter":348},{"name":"query_changelog","fixed":{"name":"query_changelog","description":"Query the Trillboards API changelog for recent changes,\nbreaking changes, deprecations, and fixes.\n\nWHEN TO USE:\n- Check what has changed in the API before upgrading an integration.\n- Find breaking changes since a specific date.\n- Discover new features added to a specific API surface.\n\nPARAMETERS:\n- since (YYYY-MM-DD, optional): Only entries dated on or after this date.\n  Unreleased entries are always included.\n- type (string, optional): Filter by change category. Accepts:\n    \"breaking\"    → ch","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"type":{"type":"string","maxLength":100,"description":"Filter by change category: \"breaking\", \"additive\", \"deprecation\", \"fix\". Comma-separated for multiple."},"since":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Only entries dated on or after this date (YYYY-MM-DD). Unreleased entries are always included."}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":285,"tokensAfter":285},{"name":"query_observations","fixed":{"name":"query_observations","description":"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.\n\nWHEN TO USE:\n- Exploring raw observation data from edge AI sensors on screens\n- Filtering observations by venue type, device, time range, or geography\n- Getting audience, vehicle, environment, or commerce observation data\n- Answering natural language questions about what screen","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["query"],"properties":{"limit":{"type":"integer","maximum":1000,"minimum":1,"description":"Maximum observations to return (default: 100, max: 1000)"},"query":{"type":"string","maxLength":500,"minLength":1,"description":"Natural language query describing what observations to find"},"filters":{"type":"object","properties":{"geohash":{"type":"string","maxLength":12,"description":"Filter by geohash-6 prefix for geographic area"},"device_id":{"type":"string","maxLength":100,"description":"Filter to a specific device ID"},"screen_id":{"type":"string","maxLength":100,"description":"Filter to a specific screen (mongo ID)"},"time_range":{"type":"object","properties":{"end":{"type":"string","description":"End time (ISO 8601)"},"start":{"type":"string","description":"Start time (ISO 8601)"}},"description":"Time range filter","additionalProperties":false},"venue_type":{"type":"array","items":{"type":"string","maxLength":50},"maxItems":20,"description":"Filter by venue type: retail, transit, office, restaurant_qsr, entertainment, healthcare, outdoor, etc."},"observation_family":{"type":"array","items":{"type":"string","maxLength":50},"maxItems":10,"description":"Filter by observation family: audience, vehicle, environment, commerce"}},"description":"Structured filters to narrow results","additionalProperties":false}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":557,"tokensAfter":557},{"name":"search_content","fixed":{"name":"search_content","description":"Semantic search over content library using natural language queries and 768-D pgvector embeddings.\n\nWHEN TO USE:\n- Finding content by description or theme (\"upbeat music videos\", \"cooking shows\")\n- Discovering content similar to a concept or mood\n- Searching the content library without knowing exact titles or IDs\n- Content discovery for programmatic content scheduling\n\nRETURNS:\n- data: Array of matching content with similarity scores\n  - videoId, title, contentCategory, description, durationSeco","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["query"],"properties":{"limit":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum results to return (default: 20, max: 100)"},"query":{"type":"string","maxLength":500,"minLength":3,"description":"Natural language search query (min 3 characters)"},"min_similarity":{"type":"number","maximum":1,"minimum":0,"description":"Minimum cosine similarity threshold (default: 0.5, range: 0-1)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":301,"tokensAfter":301},{"name":"semantic_audience_search","fixed":{"name":"semantic_audience_search","description":"Search screens by natural language scene description using pgvector.\n\nUses 768-dimensional Gemini embeddings on scene descriptions from FEIN edge AI\nto find screens matching a natural language query.\n\nWHEN TO USE:\n- Finding screens by audience context (\"families eating lunch in a food court\")\n- Contextual ad placement based on real-time scene understanding\n- Discovering inventory matching a specific audience scenario\n\nRETURNS:\nArray of matching screens ranked by semantic similarity, each with:\n-","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["query"],"properties":{"limit":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum number of results (default: 20, max: 100)"},"query":{"type":"string","maxLength":500,"minLength":1,"description":"Natural language description of the audience/scene to search for"},"since":{"type":"string","pattern":"^\\d+[hd]$","description":"Time window for scene data (e.g., \"1h\", \"24h\", \"7d\"). Default: \"24h\""},"min_similarity":{"type":"number","maximum":1,"minimum":0,"description":"Minimum semantic similarity threshold 0-1 (default: 0.5)"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":346,"tokensAfter":346},{"name":"semantic_search_observations","fixed":{"name":"semantic_search_observations","description":"Search observations by semantic similarity. Find moments that match a description like \"lunch rush at fast casual restaurants\" using vector embeddings.\n\nUses 768-dimensional Gemini embeddings on observation payloads to find\npromoted observations matching a natural language query via approximate\nnearest-neighbour (ANN) cosine similarity search over a Lance IVF_PQ index.\n\nCONSISTENCY: results are APPROXIMATE and EVENTUALLY CONSISTENT.\n- Approximate: retrieval is ANN, not an exhaustive scan (measur","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["query"],"properties":{"limit":{"type":"integer","maximum":100,"minimum":1,"description":"Maximum results to return (default: 20, max: 100)"},"query":{"type":"string","maxLength":500,"minLength":1,"description":"Natural language description of the observation moments to search for"},"filters":{"type":"object","properties":{"time_range":{"type":"object","properties":{"end":{"type":"string","description":"End time (ISO 8601). Default: now"},"start":{"type":"string","description":"Start time (ISO 8601). Default: end - 30 days"}},"description":"Time range filter. Omitted ends default to the last 30 days (end = now, start = end - 30d) — the search is always time-bounded.","additionalProperties":false},"venue_type":{"type":"array","items":{"type":"string","maxLength":50},"maxItems":20,"description":"Filter by venue type"},"observation_family":{"type":"array","items":{"type":"string","maxLength":50},"maxItems":10,"description":"Filter by observation family: audience, vehicle, environment, commerce"}},"description":"Additional structured filters to narrow semantic search","additionalProperties":false}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":501,"tokensAfter":501},{"name":"setup_billing","fixed":{"name":"setup_billing","description":"Set up pay-per-use billing with a Stripe payment method. A stored card grants no API credit; fund usage with credits or explicitly authorized API postpay allowance. Pass a Stripe payment method token (pm_xxx) obtained from Stripe.js or Stripe Elements.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["payment_method_id"],"properties":{"payment_method_id":{"type":"string","maxLength":200,"minLength":1,"description":"Stripe payment method token (pm_xxx) from Stripe.js or Elements"}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":168,"tokensAfter":168},{"name":"tasks_get","fixed":{"name":"tasks_get","description":"[AdCP Protocol] Get the status of a previously issued AdCP task.\n\nEvery AdCP task Trillboards serves for an AUTHENTICATED caller is recorded and\nreturned a `task_id`. Poll that id here to read the task's terminal state and,\nwith `include_result: true`, its completion payload.\n\nTrillboards answers every AdCP task in-process, so a task is already\n`completed` by the time you hold its id — this tool exists so a buyer that\npolls does not hang, and so an async arm has somewhere to report from when one","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["task_id"],"properties":{"account":{"type":"object","properties":{"brand":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","maxLength":253},"brand_id":{"type":"string","maxLength":200}},"additionalProperties":false},"sandbox":{"type":"boolean"},"operator":{"type":"string","maxLength":253},"account_id":{"type":"string","maxLength":200}},"additionalProperties":false},"context":{"type":"object","additionalProperties":{}},"task_id":{"type":"string","maxLength":200,"minLength":1,"description":"Unique identifier of the task to retrieve, as issued in the `task_id` field of the originating task response."},"include_result":{"type":"boolean","description":"Include the task's result payload when status is completed. Defaults to false for lightweight status-only polls."},"include_history":{"type":"boolean","description":"Include conversation history. Trillboards tasks complete in-process and hold no multi-turn history, so this is accepted and has no effect."}},"additionalProperties":true},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":462,"tokensAfter":462},{"name":"tasks_list","fixed":{"name":"tasks_list","description":"[AdCP Protocol] List AdCP tasks belonging to your account, newest first.\n\nReturns `query_summary` (totals and a status breakdown), `tasks`, and\n`pagination`. Filter by status or task type. Scoped to the calling account —\nan unauthenticated call returns an empty page rather than another account's\ntasks.\n\nLEGACY NAME. Identical to `list_tasks`. Prefer `list_tasks` in new code.","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"account":{"type":"object","properties":{"brand":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","maxLength":253},"brand_id":{"type":"string","maxLength":200}},"additionalProperties":false},"sandbox":{"type":"boolean"},"operator":{"type":"string","maxLength":253},"account_id":{"type":"string","maxLength":200}},"additionalProperties":false},"context":{"type":"object","additionalProperties":{}},"filters":{"type":"object","properties":{"status":{"enum":["submitted","working","input-required","completed","canceled","failed","rejected","auth-required","unknown"],"type":"string","description":"Single task status to match"},"statuses":{"type":"array","items":{"enum":["submitted","working","input-required","completed","canceled","failed","rejected","auth-required","unknown"],"type":"string"},"description":"Task statuses to match (enums/task-status.json)"},"task_type":{"enum":["create_media_buy","update_media_buy","media_buy_delivery","sync_creatives","build_creative","activate_signal","get_products","get_signals","create_property_list","update_property_list","get_property_list","list_property_lists","delete_property_list","sync_accounts","get_account_financials","get_creative_delivery","sync_event_sources","sync_audiences","sync_catalogs","log_event","get_brand_identity","search_brands","get_rights","acquire_rights"],"type":"string","description":"Single task type to match"},"task_types":{"type":"array","items":{"enum":["create_media_buy","update_media_buy","media_buy_delivery","sync_creatives","build_creative","activate_signal","get_products","get_signals","create_property_list","update_property_list","get_property_list","list_property_lists","delete_property_list","sync_accounts","get_account_financials","get_creative_delivery","sync_event_sources","sync_audiences","sync_catalogs","log_event","get_brand_identity","search_brands","get_rights","acquire_rights"],"type":"string"},"description":"Task types to match (enums/task-type.json)"}},"description":"Narrow the returned tasks.","additionalProperties":false},"pagination":{"type":"object","properties":{"limit":{"type":"integer","maximum":100,"minimum":1,"description":"Page size (max 100, default 50)"},"offset":{"type":"integer","minimum":0,"description":"Rows to skip"}},"additionalProperties":false}},"additionalProperties":true},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":795,"tokensAfter":795},{"name":"update_media_buy","fixed":{"name":"update_media_buy","description":"[AdCP Media Buy] Update an existing media buy (campaign).\n\nModify budget, targeting, schedule, or status of an existing media buy.\n\nWHEN TO USE:\n- Adjusting campaign budget mid-flight\n- Pausing or resuming a campaign\n- Changing targeting parameters\n- Extending campaign dates\n\nEXAMPLE:\nupdate_media_buy({\n  media_buy_id: \"mbuy_abc123\",\n  updates: { status: \"paused\", budget: { daily_usd: 300 } }\n})","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["media_buy_id"],"properties":{"ext":{"type":"object","additionalProperties":{}},"paused":{"type":"boolean"},"account":{"type":"object","additionalProperties":{}},"context":{"type":"object","additionalProperties":{}},"updates":{"type":"object","properties":{"name":{"type":"string"},"budget":{"type":"object","properties":{"bid_cpm":{"type":"number"},"daily_usd":{"type":"number"},"total_usd":{"type":"number"}},"additionalProperties":false},"status":{"enum":["active","paused","cancelled"],"type":"string"},"end_date":{"type":"string"},"targeting":{"type":"object","additionalProperties":{}},"screen_ids":{"type":"array","items":{"type":"string"}},"start_date":{"type":"string"}},"description":"Fields to update","additionalProperties":false},"canceled":{"type":"boolean"},"end_time":{"type":"string"},"packages":{"type":"array","items":{"type":"object","required":["package_id"],"properties":{"package_id":{"type":"string","maxLength":100,"minLength":1},"targeting_overlay":{"anyOf":[{"type":"object","additionalProperties":{}},{"type":"null"}]},"creative_assignments":{"type":"array","items":{"type":"object","required":["creative_id"],"properties":{"creative_id":{"type":"string","maxLength":200,"minLength":1}},"additionalProperties":true},"maxItems":100}},"additionalProperties":true}},"revision":{"type":"integer"},"start_time":{"anyOf":[{"type":"string"},{"type":"string","const":"asap"}]},"media_buy_id":{"type":"string","maxLength":100,"minLength":1,"description":"Media buy ID to update"},"new_packages":{"type":"array","items":{"type":"object","additionalProperties":{}}},"idempotency_key":{"type":"string","maxLength":200},"invoice_recipient":{"type":"object","additionalProperties":{}},"reporting_webhook":{"type":"object","additionalProperties":{}},"cancellation_reason":{"type":"string","maxLength":500},"push_notification_config":{"type":"object","additionalProperties":{}}},"additionalProperties":true},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":688,"tokensAfter":688},{"name":"update_webhook","fixed":{"name":"update_webhook","description":"Update an existing webhook subscription.\n\nWHEN TO USE:\n- Changing the webhook endpoint URL\n- Adding or removing subscribed events\n- Enabling or disabling a webhook\n- Updating the webhook description\n\nRETURNS:\n- webhook_id: The updated webhook ID\n- url: Updated endpoint URL\n- events: Updated event subscriptions\n- enabled: Updated enabled status\n- updated_at: Update timestamp\n\nEXAMPLE:\nUser: \"Disable the webhook for maintenance\"\nupdate_webhook({\n  webhook_id: \"wh_mmmpdbvj_8b7c5a59296d\",\n  enabled:","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":171,"tokensAfter":171},{"name":"validate_request","fixed":{"name":"validate_request","description":"Validate a proposed request payload against the registered\nZod schema for an operation, returning the exact canonical error envelope\nthe HTTP surface would emit.\n\nWHEN TO USE:\n- Before calling a write endpoint, to catch payload bugs locally.\n- Debugging 400 validation_error responses.\n\nRETURNS:\n- valid: true when the payload would pass Zod validation.\n- When invalid, the canonical { error: { type, code, message, param,\n  doc_url, details[] } } envelope is included under `error`.\n\nEXAMPLE:\nvalida","inputSchema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["path","method"],"properties":{"path":{"type":"string","maxLength":256,"minLength":1,"description":"Operation path (OpenAPI template form)."},"method":{"type":"string","maxLength":16,"minLength":1},"payload":{"description":"Shape is operation-dependent. GET → { query?, params? }. POST → body + optional { query?, params? }.","type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"schema","detail":"Added \"type\":\"string\" to untyped parameters: payload. Change to number/boolean/array where that's what you accept.","verify":true},{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":281,"tokensAfter":286}],"toolsChanged":64,"tokensSaved":0,"todo":[{"tool":"activate_signal","params":["signal_agent_segment_id"]},{"tool":"create_media_buy","params":["context","creative","total_budget","idempotency_key"]},{"tool":"get_media_buys","params":["context","pagination"]},{"tool":"get_products","params":["pagination"]},{"tool":"get_signals","params":["pagination"]},{"tool":"get_task_status","params":["account","context"]},{"tool":"list_accounts","params":["context","pagination"]},{"tool":"list_creative_formats","params":["context"]},{"tool":"list_creatives","params":["ext","sort","fields","account","context","pagination","include_items","include_purged","include_pricing","include_snapshot","include_variables","webhook_activity_limit","include_webhook_activity"]},{"tool":"list_tasks","params":["account","context","pagination"]},{"tool":"sync_accounts","params":["context","push_notification_config"]},{"tool":"sync_creatives","params":["ext","account","context","dry_run","assignments","creative_ids","delete_missing","idempotency_key","validation_mode","push_notification_config"]},{"tool":"tasks_get","params":["account","context"]},{"tool":"tasks_list","params":["account","context","pagination"]},{"tool":"update_media_buy","params":["ext","paused","account","context","canceled","end_time","packages","revision","start_time","new_packages","idempotency_key","invoice_recipient","reporting_webhook","cancellation_reason","push_notification_config"]},{"tool":"validate_request","params":["method"]}],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}