Complete example of a DOOH advertising agent using Trillboards MCP and REST APIs for digital signage inventory discovery, audience analytics, and billing management
Five tools with clear verb-noun naming (get_*, discover_*) and basic descriptions. All tools have input schemas with type definitions. However, parameter descriptions are minimal or absent, output schemas are undocumented, and error handling guidance is missing. Descriptions average ~60 chars (below the 194-char baseline for A+ tools). No tool annotations (readOnlyHint, idempotentHint). Tools are READ_ONLY but this is not formally declared in the schema. Parameter constraints (enums, ranges) are absent. Output structure is inferred from code examples but not formally documented in tool definitions.
Discover available DOOH inventory (screens) with optional limit parameter
Check billing status and credit balance for the authenticated partner
Check live audience data for a specific screen including face count and attention score
Discover pricing for Trillboards products (no auth required)
Get usage summary for the current billing period including total cost
Parameter descriptions missing or trivial. 'product' in get_pricing has description 'Product identifier (e.g., data_api)' but no constraint on valid values. 'limit' in discover_inventory lacks range (min/max). 'screen_id' in get_live_audience lacks format guidance. LLMs cannot infer valid inputs without explicit constraints.
Output schemas undocumented. Code examples show JSON responses (pricing.details.tiers, inventory.screens, audience.audience.face_count, billing.credit_balance_cents) but tool definitions do not declare return types or field structures. LLMs cannot plan downstream calls or extract data reliably.
No tool annotations. All five tools are READ_ONLY (no side effects, safe to retry) but lack readOnlyHint in schema. Agents cannot distinguish safe tools from destructive ones without explicit hints.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
Error handling lacks recovery guidance. Code shows try-catch for get_live_audience ('Could not fetch audience: {err.message}') but tool definition does not document error cases, retryability, or next steps. LLMs receive raw error messages with no actionable guidance.
Pagination not declared. discover_inventory accepts 'limit' but tool definition does not document total count, next_cursor, or offset. Large result sets could blow context window without explicit pagination guidance.