Skip to main content
Glama

Server Details

Manage digital signage screens: health, content, casts, emergency messages, proof of play.

Ownership verified
Status
Healthy
Uptime
94.3% over 23 days
OAuth
Works in Glama
Last Tested
Transport
Streamable HTTP · MCP 2025-06-18
URL
ChatGPT
–
Claude
Brix

TDQS

A4.8/5.0

Scored across 15 tools

Disambiguation5/5

Every tool has a distinct resource+action target, and the descriptions explicitly cross-reference near-neighbors (get_items vs list_items vs get_screen_status vs get_fleet_report; set_screen_content vs start_takeover vs capture_screenshot vs control_screens) with 'When NOT to use' routing. An agent can reliably pick the right tool, including the tricky read-vs-diagnose-vs-report split.

Naming Consistency5/5

All 15 names follow a strict snake_case verb_noun pattern (list_items, get_items, create_items, update_items, delete_items, restore_items, set_screen_content, start_takeover, end_takeover, get_fleet_report, get_screen_status, capture_screenshot, control_screens, refresh_data, review_approval). The generic item tools share a consistent suffix family, making the CRUD set predictable.

Tool Count5/5

Fifteen tools sit in the sweet spot, and each earns its place: a 6-tool item CRUD/restore family, 4 screen/content-viewing tools, 3 casting tools, plus reports and approvals. Nothing feels redundant or missing at the count level.

Completeness4/5

The surface covers full lifecycle for items (create/list/get/update/delete/restore), screen diagnostics, content assignment, takeovers, approvals, and fleet reporting, so core workflows have no dead ends. Remaining gaps (people/role administration, API keys, billing, feed sign-in) are deliberately console-only and documented as such, which is a minor rather than blocking limitation.

Available Tools

15 tools
capture_screenshotTake a screenshot of a screenAInspect

Take a new screenshot of one screen and return it as an image; nothing on the screen changes.

When to use:

  • Checking what a screen shows, e.g. after set_screen_content or control_screens.

When NOT to use:

  • Learning why: use get_screen_status. Polling in a loop.

What to know:

  • Waits up to about 5 seconds; a slow or offline screen returns its last frame with fresh:false. A frame over 2 MB returns latestFrameUrl only. Needs screen.edit (it sends a device command).

Parameters:

  • screenId: one scr_… id from list_items kind screens; for several screens, call once each. An id outside this connection's reach reads as not found and nothing is sent.

NameRequiredDescriptionDefault
screenIdYesScreen id.

Output Schema

NameRequiredDescription
freshNotrue when the frame was taken after this call.
latestFrameAtNoISO 8601 time the returned frame was taken.
latestFrameUrlNoLink to the frame.
latestScreenshotIdNoId of the stored frame.

TDQS

A5/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=false, openWorldHint=true, idempotentHint=false, and destructiveHint=false. The description adds substantial context beyond annotations: the ~5 second wait, the fresh:false fallback for slow/offline screens, the 2 MB threshold that returns latestFrameUrl only, the screen.edit permission requirement, and the fact that it sends a device command. This reconciles the non-read-only annotation with the statement that screen content does not change.

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

Conciseness5/5

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

The description is front-loaded with the core action, then organized into clear 'When to use', 'When NOT to use', 'What to know', and 'Parameters' sections. Every sentence adds distinct operational value with no repetition or filler.

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

Completeness5/5

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

An output schema exists, so the description need not explain return values in detail, but it still covers the important edge cases (timeout, fresh flag, size limit, permission, id sourcing). For a screenshot tool with annotations and an output schema, this is complete enough for an agent to invoke correctly.

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

Parameters5/5

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

Schema coverage is 100% and the schema only says 'Screen id.', but the description adds the expected scr_… format, the source (list_items kind screens), guidance to call once per screen for multiple screens, and the error behavior for an id outside the connection's reach. This significantly exceeds the baseline for a fully documented single parameter.

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

Purpose5/5

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

The description states a specific verb and resource ('Take a new screenshot of one screen and return it as an image') and distinguishes itself from siblings by naming set_screen_content and control_screens as setup tools and get_screen_status as the diagnostic alternative. An agent can tell exactly what this tool does and when it is the right choice.

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

Usage Guidelines5/5

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

It gives explicit 'When to use' and 'When NOT to use' sections, names the alternative for learning why (get_screen_status), and warns against polling in a loop. This is as clear as usage guidance gets.

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

control_screensRestart, reload or power screensA
Destructive
Inspect

Send a device action to one or many screens.

When to use:

  • A change has not appeared, a screen is frozen, an old or broken file keeps playing, or the TV must go on or off.

When NOT to use:

  • Changing content: use set_screen_content. New data from a feed or web page: use refresh_data.

What to know:

  • Devices act within seconds; offline ones act when they come back. Check the result with capture_screenshot. Needs screen.edit.

Parameters:

  • action: refresh (reload content, no restart; try first), reboot (restart; about a minute blank), clear_cache (delete stored files so they download again; media shows late meanwhile), tv_on or tv_off (HDMI-CEC TVs only; the player keeps running).

  • screenId and screenIds: give either or both; they combine into one set, each screen gets the action once, and screens out of reach are skipped.

  • Example: {action:"refresh", screenIds:["scr_7", "scr_8"]}.

NameRequiredDescriptionDefault
actionYesDevice action.
screenIdNoScreen id.
screenIdsNoScreen ids.

Output Schema

NameRequiredDescription
queuedNoHow many screens the action was sent to.
skippedNoScreens skipped as out of reach.
commandIdsNoIds of the queued commands.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations declare destructive=true and non-idempotent, and the description adds non-obvious behavior beyond them: devices act within seconds but offline ones queue until they return, reboot blanks the display for ~a minute, clear_cache delays media but re-downloads files, tv_on/tv_off only work on HDMI-CEC TVs while the player keeps running, and screen.edit permission is required. It also points to capture_screenshot for verification.

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

Conciseness4/5

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

The layered structure (purpose, when/when-not, what to know, parameters, example) is front-loaded and skimmable, and nearly every line carries operational value. It is on the long side for a three-parameter tool, with some redundancy between the 'what to know' and 'parameters' sections, but nothing is wasted boilerplate.

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

Completeness5/5

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

With an output schema present, the description need not document return values, and it instead covers the things that matter for a destructive, non-idempotent action tool: permission requirement, timing expectations, per-action side effects, and how to confirm the outcome. Nothing an agent needs in order to call this correctly is missing.

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

Parameters5/5

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

Although schema coverage is 100% and the schema descriptions are bare ('Device action.', 'Screen id.'), the description supplies the real semantics: per-enum consequences and ordering advice (try refresh first), and the crucial combination rule that screenId and screenIds merge into one set, each screen is acted on once, and unreachable screens are silently skipped. It even gives a worked example.

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

Purpose5/5

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

The description opens with a specific verb+resource ('Send a device action to one or many screens') and immediately differentiates itself from siblings by naming set_screen_content for content changes and refresh_data for feed/web updates. An agent can route to this tool without opening any schema.

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

Usage Guidelines5/5

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

It provides an explicit 'When to use' block with concrete symptoms (change not appeared, frozen screen, stale file, TV power) and an explicit 'When NOT to use' block that names the correct alternatives for content and data cases. This is the strongest form of routing guidance.

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

create_itemsCreate itemsAInspect

Create new items of one kind.

When to use:

  • Adding anything new, uploading files (media_files for bytes you hold, media_from_urls for public links), pairing a device by its code or inviting a person.

When NOT to use:

  • Changing an existing item: use update_items.

  • Showing it on screens: create it, then use set_screen_content or start_takeover.

What to know:

  • playlists, schedules, locations and creatives are all-or-nothing: one bad row rejects the call and names it (a location whose externalId exists is skipped, so imports re-run safely). Other kinds are created one by one; each reports ok or its error and the rest continue.

  • New content at a location under review starts as a draft. Needs the kind's create permission there.

  • Tools never take sign-in values: a data_sources or apps item holding one, or a feed that cannot work without one, is refused and nothing is created. A person connects those in the Brix console; the feed is then used by its id.

  • Repeat for each row: one design and one data source play as a slideshow, one slide per row of the sheet. Set dataSourceId and repeat {over:"rows", secondsPerRow:12}; seconds run from 3 to 3600, default 12. A workspace without this feature refuses it with 403 feature_disabled and saves nothing, so tell the person instead of retrying.

  • Row tags follow the slide: {{row.column}} in a text box's text, row.column in a field box's field, {{row.photo}} as an image box's url or the backgroundUrl. {{rows.0.column}} stays on the sheet's first row on every slide.

  • The column name in a row tag is the sheet's header in lower case with accents removed, every other character changed to _, repeats collapsed and none at the ends: Date de début is row.date_de_debut, Région (€) is row.region. A missing column or an empty cell reads blank.

  • A picture cell must be a plain https address; anything else leaves that box empty on that slide.

  • At most 200 rows and 3 MB of slides play, and each slide is a whole copy of the design, so a large design fits fewer rows. Afterwards read it with get_items: repeatStatus gives rowCount, rowsThatFit, limitedBy, columns, missingColumns and warnings. Tell the person when rowsThatFit is below rowCount.

  • It reaches screens like any design: set_screen_content or start_takeover with contentKind creative, a schedule block or a layout zone. A playlist item has its own switch: appendItems with refKind creative may answer 403 feature_disabled, and then set_screen_content still works.

Parameters:

  • Pass exactly one array; its name is the kind and two arrays is an error.

  • Ids inside items (refId, contentId, nodeId, screenId, appKey, connector) must already exist; get them from list_items.

  • Example: {playlists:[{name:"Lobby loop", items:[{refKind:"media", refId:"med_logo", durationSec:10}]}]}.

NameRequiredDescriptionDefault
appsNoApp instances (weather, clock, menu board, …), max 50. Find valid appKey values with list_items kind app_types.
peopleNoInvite people, max 10. Each gets an email invitation; inviting someone already here adds the missing locations. Roles that manage people, roles, API keys, settings or billing are refused: a person gives those in the Brix console.
layoutsNoMulti-zone layouts, max 50. A new layout starts with one full-screen zone; set zones with update_items (read a layout with get_items to copy its zone shape).
screensNoPair new devices, max 20. Each device shows a 6-digit pairing code on its screen; the code pairs it into this workspace.
creativesNoCreatives to create, max 100 per call.
locationsNoLocations (org-tree nodes) to create, max 1000 per call. List a parent before its children.
playlistsNoPlaylists to create, max 500 per call.
schedulesNoSchedules to create, max 200 per call.
web_linksNoLive web pages or dashboards for the media library, max 50. Set crop, scroll and refresh after with update_items kind media.
media_filesNoFiles whose bytes you hold (an image you made, a file the person pasted), uploaded straight into the media library, 6 MB each.
celebrationsNoCelebration entries to import, max 100 per call.
data_sourcesNoData feeds that need no sign-in, max 20: a CSV URL, a Google Sheet published to anyone with the link, an iCal feed, a public transit stop, or a public JSON URL. A feed that needs a sign-in or key (POS, Stripe, Shopify, HubSpot, a private sheet) is connected by a person in the Brix console and refused here; use it by its id from list_items kind data_sources. list_items kind connectors shows each type's setup.
media_foldersNoMedia library folders, max 50.
screen_groupsNoScreen groups, max 50. A group is a flat label across locations; it grants no permissions.
media_from_urlsNoFiles (image, video, PDF, audio) copied from public URLs into the media library, max 20 per call and 500 MB each. Copies land at the workspace root, so a connection limited to one location is refused.
device_test_runsNoDevice Lab test runs, max 10. Each queues at once; read results with get_items kind device_test_runs. Suites content, soak, chaos and full change what the screen plays while they run; chaos and full run only on internal or test-tagged screens.
emergency_templatesNoPre-armed emergency takeovers (Lockdown, Fire drill, …), max 50. Fire one with start_takeover emergencyTemplateId.

Output Schema

NameRequiredDescription
kindNoThe kind created.
failedNoOne-by-one kinds: how many failed.
createdNoBulk kinds: the new records with their ids.
resultsNoOne row per id or item, in the order given.
succeededNoOne-by-one kinds: how many were created.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare write/idempotency/openWorld flags; the description adds much more: which kinds are all-or-nothing (one bad row rejects the call and names it) versus created one-by-one with per-row ok/error, that a location whose externalId exists is skipped so re-runs are safe, that content at a location under review starts as a draft, that sign-in values are refused before anything is created, and a specific 403 failure mode for the repeat feature that should not be retried.

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

Conciseness4/5

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

Front-loaded with when-to-use / when-not before any mechanics, and the bullets are dense rather than padded. Some material duplicates the repeat schema block (secondsPerRow range, 403 feature_disabled) and the row-tag column-slug rules are long, but they encode real behavior the schema only gestures at.

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

Completeness5/5

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

For an 18-kind write tool with 17 optional array parameters this covers what an agent needs: mutual exclusion of arrays, id prerequisites, partial-failure semantics, permission requirements, and the size limits (200 rows / 3 MB of slides). Return values are covered by an output schema, and the description still points to get_items repeatStatus fields for post-creation verification.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds a constraint the schema cannot express: pass exactly one array whose name is the kind, and two arrays is an error. It also adds the cross-cutting rule that ids inside items must already exist and come from list_items, plus a worked playlist example. It does not re-explain most per-kind fields, which the schema already covers.

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

Purpose5/5

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

Opens with a specific verb and resource ("Create new items of one kind") and immediately scopes it against the sibling that handles the opposite case (update_items) and the ones that handle display (set_screen_content, start_takeover). An agent can route correctly without opening the schema.

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

Usage Guidelines5/5

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

Explicit when-to-use block enumerates the concrete cases (uploading bytes via media_files, public links via media_from_urls, pairing a device, inviting a person) and a when-NOT-to-use block names the alternatives to use instead. Nothing is left to inference.

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

delete_itemsDelete itemsA
DestructiveIdempotent
Inspect

Delete items of one kind into the 30-day recycle bin.

When to use:

  • The person has confirmed what should go (show it with list_items or get_items first).

When NOT to use:

  • Taking a screen out of a group: use update_items removeScreenIds.

  • Stopping a takeover: use end_takeover.

What to know:

  • restore_items undoes a delete within 30 days. A deleted playlist or schedule stops on every screen playing it; a deleted screen's device returns to pairing; a deleted location hands its content to its parent.

  • Refused: the root, a location with child locations, items shared to another workspace. Each id reports ok or its error. Needs the kind's delete permission.

Parameters:

  • kind and ids: every id must be of that kind.

  • permanent: true erases for good instead (recycle-bin kinds only). The first call deletes nothing and returns wouldErase and a confirmCode.

  • confirmCode: only with permanent:true; send the code from the first call, after the person says yes, with the same kind and ids. It lasts 10 minutes and fits only those ids; without permanent it is an error.

  • Example: {kind:"playlists", ids:["pl_8f2c"]}.

NameRequiredDescriptionDefault
idsYesItem ids.
kindYesKind of the ids.
permanentNoErase for good.
confirmCodeNoCode from the first call.

Output Schema

NameRequiredDescription
kindNoThe kind that was acted on.
nextNoPreview call: what to do next.
erasedNoHow many items were erased for good (0 on the first, preview call).
failedNoHow many failed; the rest still ran.
resultsNoOne row per id or item, in the order given.
permanentNotrue for a permanent delete.
succeededNoHow many ids or items succeeded.
wouldEraseNoPreview call: the items that would be erased.
confirmCodeNoPreview call: send this on the second call, after the person says yes.

TDQS

A5/5.0
Behavior5/5

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

Annotations already mark this as destructive and not read-only, but the description adds critical behavior: recycle-bin recovery, permanent deletion with a two-step confirmation flow, refused deletion cases, and permission requirements. It also describes side effects for deleted playlists, schedules, screens, and locations.

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

Conciseness5/5

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

The description is front-loaded with purpose, then organized into when to use, when not to use, behavior, and parameter notes. Every section adds actionable information without repetition or filler.

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

Completeness5/5

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

Given that this is a destructive mutation tool with complex permanent-delete confirmation behavior, the description covers prerequisites, alternatives, side effects, refusals, permissions, and parameter interaction. An output schema exists, and the description appropriately includes key response elements such as wouldErase, confirmCode, ok, and error without duplicating full return documentation.

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

Parameters5/5

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

Schema coverage is 100%, but the description still adds meaningful semantics beyond the schema: all ids must be of the specified kind, permanent deletion requires a first call and a confirmCode, and the confirmCode is time-limited and tied to the same kind and ids. The example further clarifies invocation.

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

Purpose5/5

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

States a specific verb and resource: deleting items into the 30-day recycle bin. It also clarifies scope and distinguishes the operation from adjacent actions by naming alternatives in the When NOT section.

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

Usage Guidelines5/5

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

Explicitly says when to use the tool, including confirming the target first, and when not to use it. It names concrete alternatives such as update_items removeScreenIds and end_takeover for cases that should not use delete_items.

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

end_takeoverEnd a cast or emergencyA
DestructiveIdempotent
Inspect

End a running takeover or emergency on every screen it covers, in one call.

When to use:

  • Taking down what start_takeover started, early.

When NOT to use:

  • Changing default content: use set_screen_content.

  • Calling once per screen: one call ends it everywhere.

What to know:

  • Screens return to their normal content at once. Ending one that already ended succeeds with alreadyEnded:true; an unknown id fails and lists what is running. Needs screen.cast (emergency-override.create for an emergency).

Parameters:

  • castId: the castId start_takeover returned, an emergency id (emg_…), the id of the content on screen, or the takeover's exact headline. The last two end every running takeover of it. Find running ones with list_items kind casts or emergencies.

NameRequiredDescriptionDefault
castIdYesTakeover id.

Output Schema

NameRequiredDescription
castIdNoThe cast that was ended.
alreadyEndedNotrue when it had already ended.
screensReleasedNoHow many screens went back to normal content.

TDQS

A5/5.0
Behavior5/5

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

Goes well past the destructive/idempotent/openWorld annotations: it discloses immediate restoration of normal content, the idempotent success case (alreadyEnded:true), the failure mode for an unknown id (fails and lists what is running), and the required scopes (screen.cast / emergency-override.create). These are exactly the operational details an agent needs before firing a destructive call.

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

Conciseness5/5

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

Front-loaded opening sentence states action and blast radius, then labeled sections (When to use / When NOT to use / What to know / Parameters) make scanning trivial. Dense but every clause carries actionable information with no filler.

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

Completeness5/5

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

For a single required-parameter, destructive tool with an output schema, this covers discovery (list_items), permissions, idempotency behavior, and failure semantics; return-value detail is delegated to the output schema as expected. Nothing an agent needs to invoke it correctly is missing.

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

Parameters5/5

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

The schema only says 'Takeover id.', but the description adds that castId accepts a castId from start_takeover, an emergency id (emg_…), a content id, or the takeover's exact headline — and that the last two forms end every matching takeover. That is meaningful semantics the schema does not carry.

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

Purpose5/5

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

States a specific verb (End) plus resource (takeover or emergency) and scope (every screen it covers, in one call), which immediately separates it from start_takeover and set_screen_content. The sibling tools listed do not overlap with this scope, so an agent can route to it without opening a schema.

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

Usage Guidelines5/5

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

Explicitly enumerates when to use (tearing down what start_takeover started, early), when NOT to use (changing default content -> set_screen_content; per-screen looping), and points at list_items kind casts/emergencies for discovery. Alternatives and exclusions are named, not implied.

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

get_fleet_reportGet a fleet reportA
Read-onlyIdempotent
Inspect

Read a report across screens for a time window.

When to use:

  • Uptime and outage causes, what actually played, or who changed what.

When NOT to use:

  • One screen's detail: use get_screen_status. What is wrong now: use list_items kind alerts.

What to know:

  • Reads stored history only; only screens this connection can see count. Needs screen.view (uptime), playback-log.view (proof_of_play) or audit-log.view (audit_log).

Parameters:

  • report: uptime (online % per screen, outages with causes, worst first, one-line insights), proof_of_play (plays, watch time, skips and failures per content, and where) or audit_log (who changed what, newest first, by name).

  • from and to: uptime and proof_of_play only; ISO 8601; default the whole stored window (30 days for uptime) up to now; a non-ISO value is refused. screenId: uptime and proof_of_play only, one screen. screenIds, contentIds and detail: proof_of_play only.

  • since, limit (default 50) and cursor (nextCursor of the previous page): audit_log only.

  • Parameters for another report are ignored. Example: {report:"uptime", from:"2026-10-13T00:00:00Z"}.

NameRequiredDescriptionDefault
toNoWindow end.
fromNoWindow start.
limitNoPage size.
sinceNoEvents since.
cursorNoNext page.
detailNoproof_of_play: screens adds byScreen, one row per content and screen.
reportYesWhich report.
screenIdNoScreen id.
screenIdsNoproof_of_play: only these screens, for example every screen at one venue.
contentIdsNoproof_of_play: only these content ids, for example one advertiser's ads.

Output Schema

NameRequiredDescription
toNoWindow end.
fromNoWindow start.
nextCursorNoaudit_log: pass as cursor for the next page.

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, and the description still adds substantial non-structured context: it reads stored history only, scope is limited to screens the connection can see, and each report variant requires a distinct permission (screen.view, playback-log.view, audit-log.view). It also discloses that parameters belonging to another report are silently ignored, which is a non-obvious behavioral trait that would otherwise cause silent misconfiguration.

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

Conciseness5/5

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

Aggressively front-loaded and organized under 'When to use', 'When NOT to use', 'What to know' and 'Parameters'. The prose is compressed into fragments, but each one carries a distinct fact (permission, default, applicability, refusal rule) with no redundancy.

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

Completeness5/5

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

This is a 10-parameter tool with three modes, and the description covers mode selection, per-mode parameter applicability, defaults, format requirements, permission prerequisites and scope limits, while the output schema carries the return shape. Nothing an agent needs in order to call it correctly is missing.

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

Parameters3/5

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

Schema coverage is 100%, so the baseline would be 3, but the description goes well beyond the schema by mapping each parameter to the report types that honor it (from/to only for uptime and proof_of_play, since/limit/cursor only for audit_log), specifying ISO 8601 with rejection of non-ISO values, stating defaults (whole stored window, 30 days for uptime, limit 50), and giving a worked example. The only thing it omits is clarity that cursor is the previous page's nextCursor, which is already in the schema.

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

Purpose5/5

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

Opens with a specific verb and resource ('Read a report across screens for a time window') and immediately enumerates the three report types (uptime, proof_of_play, audit_log), so an agent knows exactly what the tool returns. It also explicitly separates itself from get_screen_status and list_items, which are the closest siblings.

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

Usage Guidelines5/5

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

Provides explicit 'When to use' and 'When NOT to use' blocks, naming concrete alternatives for each exclusion ('One screen's detail: use get_screen_status. What is wrong now: use list_items kind alerts'). This is the strongest form of routing guidance: the agent never has to infer which sibling to pick.

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

get_itemsRead items in fullA
Read-onlyIdempotent
Inspect

Read items of one kind in full.

When to use:

  • Before update_items, to see current values and part ids (playlist items pli_…, schedule blocks sb_…).

  • Checking how many rows of a sheet a repeating creative plays, and how many fit.

  • Checking an approval request, a fired emergency, a device test run, a person's locations and roles, a role's permissions, or who this connection is (kind account).

When NOT to use:

  • Searching by name: use list_items first.

  • Why a screen is blank, its outages or its TV state: use get_screen_status (get_items returns a screen's settings and assigned content).

What to know:

  • Returns a playlist's items in order, a schedule's blocks, a layout's zones, an app's config, a screen's status and content.

  • A creative that repeats for each row also returns repeatStatus: rowCount and rowsThatFit (what the last sync holds and how many play), limitedBy (rows, bytes or null), loopSeconds, columns (each header and its row tag), missingColumns, firstRowBindings, lastSyncedAt and warnings to pass on. rowCount is null when this connection cannot read that data source.

  • Sign-in details of feeds and web links stay in the Brix console: a stored one reads as ••••••••, never as its value. Items outside this connection's locations read as not found.

Parameters:

  • kind: the kind of every id. account takes no ids and returns this connection's actor, workspace and permissions.

  • ids: prefix-typed ids from list_items (pl_… playlist, scr_… screen, sch_… schedule); required for every kind but account. Each id returns its item or not found; the rest still return.

  • device_test_runs: call again until status is finished.

  • Example: {kind:"playlists", ids:["pl_8f2c"]}.

NameRequiredDescriptionDefault
idsNoItem ids.
kindYesKind of the ids.

Output Schema

NameRequiredDescription
kindNoThe kind that was acted on.
failedNoHow many failed; the rest still ran.
resultsNoOne row per id or item, in the order given.
succeededNoHow many ids or items succeeded.

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world, yet the description still adds real operational context: per-id partial failure ('Each id returns its item or not found; the rest still return'), redaction of stored feed/link credentials, out-of-scope items surfacing as not found, rowCount being null when the data source is unreadable, and the polling instruction for device_test_runs. The only shortfall is that it does not mention the 50-id cap enforced by the schema or response size/pagination characteristics.

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

Conciseness4/5

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

Front-loaded with the core statement, then cleanly sectioned into when/when-not/what-to-know/parameters, so an agent can skim to what it needs. It runs long and some of the repeatStatus field inventory (loopSeconds, columns, missingColumns, firstRowBindings) is arguably return-value detail that the output schema already carries.

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

Completeness5/5

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

For a 2-parameter tool spanning 18 kind values with heterogeneous return shapes, the description covers the selection decision, id construction, partial failure semantics, credential redaction and the one special kind. With an output schema present it need not enumerate return fields, and the extra detail on repeating creatives is helpful rather than redundant.

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

Parameters5/5

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

Schema coverage is already 100%, so this had a low bar, but the description still adds genuine meaning: ids are prefix-typed (pl_, scr_, sch_) and sourced from list_items, they are required for every kind except account, and each id independently succeeds or fails. The worked example plus the account special case ('takes no ids and returns this connection's actor, workspace and permissions') tells an agent how to construct calls for an enum value the schema cannot explain.

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

Purpose5/5

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

Opens with a specific verb and resource ('Read items of one kind in full') and immediately separates itself from the two siblings an agent would most plausibly confuse it with — list_items for name search and get_screen_status for screen health. The reader knows it is a full-detail fetch keyed by kind and ids.

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

Usage Guidelines5/5

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

Explicit 'When to use' / 'When NOT to use' sections name concrete preconditions (before update_items to capture part ids) and redirect to the correct alternatives (list_items, get_screen_status) with the reason for each. Nothing about tool selection is left to inference.

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

get_screen_statusCheck one screen's healthA
Read-onlyIdempotent
Inspect

Explain the state of one screen.

When to use:

  • Why a screen shows what it shows, why it is blank or wrong, when it was down, or what its TV did.

When NOT to use:

  • A screen's settings, tags or assigned content: use get_items kind screens.

  • Many screens: use get_fleet_report. A picture: use capture_screenshot. A fix: use control_screens.

What to know:

  • Reads what the screen already reported and never contacts it, so it answers for offline screens. Needs screen.view.

Parameters:

  • screenId: one scr_… id from list_items kind screens.

  • view: why (the source on screen: deactivated, emergency, takeover, schedule or default); diagnose (likely cause plus a checklist; guided:true marks a TV/input/cable guess, not a reading); outages (each outage with length and cause); tv (TV off, other input, cable lost; Signage Sticks only).

  • days: outages default 30; tv default and max 14. limit: default 50; max 200 for outages, 500 for tv. Both are ignored for why and diagnose.

  • Example: {screenId:"scr_lobby7", view:"outages", days:7}.

NameRequiredDescriptionDefault
daysNoDays to look back.
viewYesWhat to explain.
limitNoMost rows.
screenIdYesScreen id.

Output Schema

NameRequiredDescription
guidedNodiagnose: true when the cause is a guess from a checklist, not a reading.
summaryNoOne plain-language sentence answering the view.
screenIdNoThe screen.

TDQS

A5/5.0
Behavior5/5

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

Annotations already carry readOnlyHint/idempotentHint/destructiveHint/openWorldHint, but the description adds behavior the annotations cannot: it reads previously-reported data and 'never contacts it' so it works for offline screens, and it requires screen.view. These are non-obvious operational facts.

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

Conciseness5/5

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

Front-loaded purpose followed by labeled When/NOT/What to know/Parameters sections, ending with a concrete call example. The density is all signal — every bullet conveys a constraint or routing rule.

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

Completeness5/5

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

For a 4-param read tool with an output schema present, the description covers purpose, routing, data-source behavior, permissions, per-view parameter semantics, and an example. No agent-relevant gap remains; return shape is delegated to the output schema.

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

Parameters5/5

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

Schema coverage is 100%, yet the description goes far beyond it: each enum value is defined (why = source on screen; diagnose = cause plus checklist, with the guided:true caveat; outages; tv with a Signage-Sticks-only restriction), and per-view defaults, maxima, and which params are ignored are all given.

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

Purpose5/5

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

The opening line 'Explain the state of one screen' states a specific verb and resource, and the 'When NOT to use' block explicitly routes to siblings (get_items kind screens, get_fleet_report, capture_screenshot, control_screens). An agent can distinguish this from every nearby tool without opening a schema.

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

Usage Guidelines5/5

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

Usage is spelled out in both directions: 'Why a screen shows what it shows, why it is blank or wrong, when it was down, or what its TV did' for when to use, plus four named alternatives each with the condition that selects them.

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

list_itemsList items of one kindA
Read-onlyIdempotent
Inspect

List items of one kind with their ids, so other tools can act on them.

When to use:

  • A request names a screen, file, playlist or location and you need its id.

  • Seeing what runs now (casts, emergencies), what is wrong now (alerts), approval requests, deleted items (recycle_bin), or who is in the workspace and what they may do (people, roles).

When NOT to use:

  • Reading one item's contents: use get_items.

  • History over time: use get_fleet_report.

What to know:

  • Rows are short (id, name, nodeId, counts), never configs or members; only locations this connection can see. people rows add each person's role at each location (never sign-in details); roles rows add their permissions.

  • A kind this connection cannot read is an error, not an empty list. people and roles are read-only here (invite with create_items); changing a person's access, roles, API keys and billing stays with a signed-in person in the Brix console, so a connected app can never widen access. To see what this connection itself may do, use get_items kind account.

  • media, alerts and recycle_bin come newest first. Every call counts toward the connection's 30 tool calls a minute, so page with offset instead of re-listing.

Parameters:

  • kind: the list to read; app_types and connectors are what create_items can make. A connectors row's setup is here (create_items makes it) or console (a person connects it in the Brix console, and it is then used by its id).

  • Filters (all optional, combined with AND, ignored on kinds they do not name): q (name contains, any kind but people and roles); status (screens online/offline/pairing; approvals pending by default, approved, rejected, withdrawn); nodeId (screens at that location and below; alerts at that location only); tag (screens, media); mediaKind and folderId (media); severity and screenId (alerts); binKind (recycle_bin).

  • limit: page size for media and approvals (default 50); other kinds give 100 a page. offset: pass nextOffset while hasMore.

  • Example: {kind:"screens", status:"offline", nodeId:"on_west"}.

NameRequiredDescriptionDefault
qNoName contains.
tagNoTag.
kindYesWhich list.
limitNoPage size.
nodeIdNoLocation id.
offsetNoRows to skip.
statusNoScreen or approval state.
binKindNoRecycle bin kind.
folderIdNoMedia folder id.
screenIdNoScreen id.
severityNoAlert severity.
mediaKindNoMedia type.

Output Schema

NameRequiredDescription
kindNoThe kind listed.
itemsNoOne short row per item: id, name, location (nodeId) and counts. Never full configs or members.
totalNoHow many items match, across all pages.
hasMoreNotrue when another page exists; call again with offset = nextOffset.
nextOffsetNoThe offset of the next page (present when hasMore).

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description adds real value on top: short row shape, visibility limited to locations this connection can see, an unreadable kind raises an error rather than returning [], people/roles are read-only with privilege escalation blocked in the console, and newest-first ordering for media/alerts/recycle_bin. The 30-calls-per-minute rate limit and the advice to page with offset instead of re-listing are exactly the kind of operational context annotations cannot express.

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

Conciseness4/5

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

Front-loaded with one-line purpose, then scannable labelled sections, so an agent can jump to the relevant block. It is long and some sentences are heavily nested with parentheticals (the connectors row setup line), but almost no text is redundant given 12 parameters and 21 kinds.

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

Completeness4/5

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

Return format is covered by the output schema, so the description does not need to restate it, and everything an agent needs to call correctly is present. One gap: it instructs using "get_items kind account" while "account" is not in the kind enum, which would make that follow-up call fail as written.

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

Parameters5/5

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

Schema coverage is 100%, so baseline would be 3, but the description goes well beyond it: it maps each filter to the kinds it applies to (status for screens/approvals, nodeId for screens and alerts with different depth semantics, tag for screens/media, binKind for recycle_bin), states filters combine with AND and are ignored on kinds they do not name, and gives page-size defaults (50 for media/approvals, 100 otherwise) plus offset/nextOffset paging. The worked example anchors the filter combination.

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

Purpose5/5

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

Opens with a specific verb and resource ("List items of one kind with their ids") and states the downstream reason ("so other tools can act on them"), which immediately distinguishes it from get_items and get_fleet_report. The kind enumeration and the note that rows are id+name+counts make the boundary even sharper.

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

Usage Guidelines5/5

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

Explicit "When to use" / "When NOT to use" sections name the alternative tools and the conditions that select them (get_items for one item's contents, get_fleet_report for history). It also gives positive triggers such as needing an id for a named screen, playlist or location.

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

refresh_dataSync data or re-render a web pageA
Idempotent
Inspect

Pull fresh content now instead of at the next scheduled refresh.

When to use:

  • Before an announcement, so menus and prices are current; after someone edits a sheet that a creative repeats over; after changing a web link's crop with update_items, to see the result.

When NOT to use:

  • Changing a feed's or link's settings: use update_items. A screen that has not picked up a change, or is frozen: use control_screens.

What to know:

  • Settings never change. A failing feed is reported in the result, not thrown. Screens showing the data update when a sync succeeds. Needs integration.edit for feeds, media.edit for a web link.

  • A sheet published to the web changes on Google's side up to about 5 minutes after an edit, so a sync straight after an edit can still read the old rows: synced true says the sync ran, not that the edit arrived. Check rowCount with get_items and sync again after a few minutes if it is old.

Parameters:

  • Pass exactly one; none or two is an error.

  • dataSourceId: one ds_… feed from list_items kind data_sources.

  • allDataSources: true syncs every feed you can edit, one after another; one failure does not stop the rest; limited to 5 calls a minute.

  • webLinkId: one med_… web link (list_items kind media, mediaKind web); renders a new snapshot.

NameRequiredDescriptionDefault
webLinkIdNoWeb link id.
dataSourceIdNoData source id.
allDataSourcesNoEvery data source.

Output Schema

NameRequiredDescription
okNoallDataSources: feeds that synced.
errorNoOne feed: why it did not sync.
totalNoallDataSources: feeds tried.
failedNoallDataSources: feeds that failed.
syncedNoOne feed: true when it synced.

TDQS

A4.9/5.0
Behavior5/5

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

Goes well beyond the annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false) by disclosing that settings never change, that failures surface in the result rather than as thrown errors, that permissions integration.edit / media.edit are required, and that allDataSources is throttled to 5 calls a minute. The Google-side propagation caveat (up to ~5 minutes; 'synced true' means the sync ran, not that the edit landed) is exactly the kind of trap an agent could not infer from structured fields.

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

Conciseness4/5

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

Front-loaded with the imperative sentence and cleanly sectioned into when/when-not/what-to-know/parameters, with no filler. The 'What to know' bullet is dense and multi-topic, packing permissions, failure mode, propagation delay, and verification advice into one block, which slightly hurts scannability even though almost every clause carries weight.

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

Completeness5/5

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

For a three-parameter, mutually exclusive, permission-gated tool this covers requirements, throttling, partial failure, and stale-read verification, and an output schema already documents return values. Nothing an agent needs to call it correctly or interpret the result is missing.

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

Parameters5/5

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

Although schema coverage is 100%, the schema only offers one-word descriptions ('Web link id.', 'Every data source.'). The description adds the decisive rule that exactly one of the three must be passed, gives ID prefixes (ds_…, med_…), and explains how to discover IDs via list_items kinds, plus the sequential and partial-failure semantics of allDataSources.

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

Purpose5/5

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

The opening line states a specific verb and resource: pull fresh content now rather than at the next scheduled refresh, and the title clarifies it covers both data sync and web-link re-render. It is clearly separable from siblings that change settings (update_items) or manipulate screens (control_screens).

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

Usage Guidelines5/5

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

Explicit 'When to use' and 'When NOT to use' sections name the exact alternatives: update_items for settings changes and control_screens for a screen that is frozen or not picking up a change. The excluded cases are routed to a specific sibling rather than left to inference.

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

restore_itemsRestore deleted itemsA
Idempotent
Inspect

Bring back deleted items of one kind from the 30-day recycle bin.

When to use:

  • Undoing delete_items.

When NOT to use:

  • Items deleted more than 30 days ago: they are gone and report not found.

What to know:

  • Whatever used a restored item (playlists, screens) uses it again; a restored screen re-pairs by itself if its device still holds its pairing. Each id reports ok or not found. Needs the kind's delete permission.

Parameters:

  • kind: the list_items kind name, so a recycle_bin row of kind playlist is restored with kind playlists.

  • ids: up to 50, from list_items kind recycle_bin. An id that is not in the bin reports "not in the recycle bin"; one deleted over 30 days ago reports not found.

  • Example: {kind:"playlists", ids:["pl_8f2c"]}.

NameRequiredDescriptionDefault
idsYesDeleted item ids.
kindYesKind of the ids.

Output Schema

NameRequiredDescription
kindNoThe kind that was acted on.
failedNoHow many failed; the rest still ran.
resultsNoOne row per id or item, in the order given.
succeededNoHow many ids or items succeeded.

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the annotations (readOnly=false, destructive=false, idempotent=true), the description discloses that restored items become usable again by dependent objects, that screens self-re-pair when the device still holds pairing, per-id ok/not-found reporting, and the required delete permission. That is substantial behavioral context the agent could not infer from the hints alone.

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

Conciseness5/5

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

Front-loaded one-line purpose followed by labeled sections (when to use, when not to use, what to know, parameters) and a concrete example. Every line carries distinct information with no restatement of the schema.

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

Completeness5/5

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

For a two-parameter mutation with an output schema present, nothing essential is missing: the permission prerequisite, the 30-day failure mode, the id cap, and the enum naming convention are all covered. Return values needn't be explained because an output schema exists.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: kind must use the list_items plural kind name (a recycle_bin row of kind playlist is restored with kind playlists), ids come from list_items kind recycle_bin, and the two distinct per-id error cases are spelled out. It stops short of explaining every enum value, so a 4 rather than 5.

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

Purpose5/5

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

"Bring back deleted items of one kind from the 30-day recycle bin" states a specific verb (bring back/restore) plus the resource and its scope (one kind, 30-day bin). It is immediately distinguishable from delete_items, list_items, and get_items.

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

Usage Guidelines5/5

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

Explicit "When to use" names undoing delete_items, and "When NOT to use" names the 30-day expiry case with the resulting not-found behavior. The agent has a clear routing rule plus an exclusion, and the sibling delete_items is named directly.

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

review_approvalApprove, reject or withdraw contentA
Destructive
Inspect

Approve, reject or withdraw one pending approval request.

When to use:

  • This connection's person is an approver and a request is waiting (list_items kind approvals; read it with get_items kind approvals).

  • Cancelling a request that is no longer wanted, or one left behind by a person who has gone: withdraw.

When NOT to use:

  • Editing the content: use update_items (an edit opens a new request).

What to know:

  • approve airs the content where it is assigned, at once; reject keeps it off screens; withdraw closes the request with no decision and puts the content back to draft. Each is final.

  • approve and reject need this connection's person to be an approver in the request's chain; withdraw needs the requester or such an approver. Otherwise the call is refused.

Parameters:

  • approvalId: an ar_… id from list_items kind approvals.

  • reason: required with reject and shown to the requester word for word; with approve, an optional note; ignored with withdraw.

  • Example: {approvalId:"ar_12", decision:"reject", reason:"Price on slide 2 is wrong."}.

NameRequiredDescriptionDefault
reasonNoWhy.
decisionYesApprove, reject or withdraw.
approvalIdYesApproval request id.

Output Schema

NameRequiredDescription
dataNoThe request with its new state and who decided.

TDQS

A4.9/5.0
Behavior5/5

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

Goes well beyond the annotations by spelling out what each decision does to the content (approve airs it immediately, reject keeps it off screens, withdraw returns it to draft), that all three are final, and the exact authorization requirement per decision. It also documents the refusal behavior when the caller lacks a role in the chain.

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

Conciseness4/5

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

Front-loaded with the action, then cleanly sectioned into when/when-not/what-to-know/parameters. Every line carries information, though the heading scaffolding is slightly heavier than a three-parameter tool strictly needs.

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

Completeness5/5

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

For a destructive, non-idempotent mutation with an output schema available, the description covers effects, finality, authorization, and parameter sourcing. An agent has everything needed to choose a decision correctly or know it will be refused.

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

Parameters5/5

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

Schema coverage is 100% and the schema descriptions are one-word ('Why.', 'Approve, reject or withdraw.'), so the description does the real work: it identifies approvalId as an ar_… id sourced from list_items kind approvals and explains that reason is required and shown verbatim for reject, optional for approve, and ignored for withdraw.

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

Purpose5/5

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

The opening sentence gives a specific verb set (approve, reject, withdraw) and a precisely scoped resource (one pending approval request). It is unmistakably distinct from siblings like create_items, update_items, and delete_items.

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

Usage Guidelines5/5

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

Explicit 'When to use' and 'When NOT to use' sections, with the alternative named (update_items, because an edit opens a new request) and the prerequisite stated (this connection's person must be an approver). Nothing is left to inference.

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

set_screen_contentAssign content to screensA
DestructiveIdempotent
Inspect

Set what screens play by default until it is changed again.

When to use:

  • Putting a playlist, schedule, app, media file or creative on one screen, a list, or every screen under a location.

When NOT to use:

  • A takeover that ends by itself: use start_takeover.

  • Changing what a playlist contains: use update_items (every screen playing it follows).

What to know:

  • Screens update within seconds. In a bulk call, screens the content is not shared to or whose location needs approval for it are skipped and counted (notShared, needsApproval); the rest change. Needs screen.cast.

Parameters:

  • screenId, screenIds and nodeId (every screen at and under it, up to 1000): give at least one; they combine into one set.

  • contentKind: playlist, schedule, app, media or creative. null clears what plays and needs exactly one screen and no nodeId.

  • contentId: the playlist, schedule, app, media or creative id from list_items; omit only with contentKind null.

  • Example: {nodeId:"on_ca", contentKind:"playlist", contentId:"pl_spring"}.

NameRequiredDescriptionDefault
nodeIdNoLocation id.
screenIdNoScreen id.
contentIdNoContent id.
screenIdsNoScreen ids.
contentKindYesContent kind.

Output Schema

NameRequiredDescription
dataNoSingle-screen call: the screen as it is now.
changedNoScreen ids whose content changed.
notSharedNoScreens skipped because the content is not shared to their location.
needsApprovalNoScreens skipped because their location needs approval for this content.

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the destructiveHint/idempotentHint/openWorldHint annotations, the description discloses the permission required (screen.cast), the propagation latency ('screens update within seconds'), and partial-failure semantics: unsupported or approval-gated screens are skipped and counted via notShared/needsApproval while the rest still change. That skip-and-count behavior is exactly the kind of outcome an agent cannot infer from destructiveHint=true alone.

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

Conciseness4/5

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

Labeled sections (When to use / When NOT to use / What to know / Parameters) front-load the routing decision, and the worked example is compact. It is dense and slightly long, with the parameter block partly restating schema field names, but almost every line carries non-redundant information.

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

Completeness5/5

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

For a destructive, idempotent bulk-mutation tool, the description covers selection semantics, clearing behavior, bulk partial-failure outcomes, auth requirements, and latency. Return values are covered by the existing output schema, so nothing an agent needs in order to invoke this correctly is missing.

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

Parameters5/5

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

Schema coverage is 100%, so the baseline would be 3, but the description adds real meaning: screenId/screenIds/nodeId combine into a single union set with at least one required, nodeId expands to every screen at and under it up to 1000, contentKind null clears playback and is only legal with exactly one screen and no nodeId, and contentId originates from list_items. A concrete example call reinforces the combination rules.

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

Purpose5/5

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

States a specific verb and resource with its scope: 'Set what screens play by default until it is changed again.' The persistence clause immediately separates it from a temporary takeover, and the when-to-use line enumerates the target shapes (one screen, a list, a location subtree).

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

Usage Guidelines5/5

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

Explicit when-to-use and when-NOT-to-use sections name the two decisive alternatives: start_takeover for self-terminating takeovers and update_items for changing playlist contents. Each alternative comes with the condition that selects it, and the parallel hint ('every screen playing it follows') explains the consequence of picking wrong.

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

start_takeoverTake over screens for a whileA
Destructive
Inspect

Show something on screens over their normal content, now.

When to use:

  • Existing content for a while (the lunch menu until 2 pm), or a pre-armed emergency.

When NOT to use:

  • A lasting change: use set_screen_content.

What to know:

  • Content ends by itself; an emergency stays above everything until end_takeover, so confirm its scope with the person first. Returns castId for end_takeover. Needs screen.cast.

Parameters:

  • Pass exactly one of: contentId with contentKind (from list_items), or emergencyTemplateId (from list_items kind emergency_templates).

  • scopeKind: all (default, every screen this connection reaches), node with scopeNodeId, or screens with screenIds. An emergency ignores scope and uses its template's.

  • expiresAt: ISO 8601 with offset, default one hour from now.

  • Example: {contentKind:"playlist", contentId:"pl_lunch", scopeKind:"node", scopeNodeId:"on_store12", expiresAt:"2026-10-20T14:00:00-07:00"}.

NameRequiredDescriptionDefault
headlineNoListing name, with contentId only.
contentIdNoContent id.
expiresAtNoEnd time.
scopeKindNoWhich screens.
screenIdsNoScreen ids.
contentKindNoContent kind.
scopeNodeIdNoLocation id.
emergencyTemplateIdNoEmergency template id.

Output Schema

NameRequiredDescription
castIdNoPass to end_takeover to stop early (an emergency's id starts with emg_).
expiresAtNoWhen it ends by itself (absent for an emergency).
screenCountNoHow many screens show it.

TDQS

A5/5.0
Behavior5/5

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

Goes well beyond the annotations: it discloses that content self-expires, that an emergency persists above everything until end_takeover, that the call requires the screen.cast permission, and that it returns castId for the paired end_takeover tool. These are non-obvious operational traits (permission, lifecycle, follow-up call) that the destructive/openWorld hints alone do not convey.

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

Conciseness5/5

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

Front-loaded imperative sentence followed by tight labeled sections (when to use, when not to use, what to know, parameters). Every line carries decision-relevant information; no filler.

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

Completeness5/5

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

For an 8-parameter mutation with an output schema, the description covers selection guidance, permission prerequisites, precedence rules, defaults, and the paired cleanup tool. With the output schema handling return shape, nothing material is missing.

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

Parameters5/5

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

Schema coverage is 100% so the baseline would be 3, but the description adds real meaning the schema lacks: the mutual-exclusion rule ('pass exactly one of contentId+contentKind or emergencyTemplateId'), the default for scopeKind and its per-value semantics, the emergency overriding scope, the one-hour default for expiresAt, and a worked example.

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

Purpose5/5

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

States a concrete verb and resource ('show something on screens over their normal content, now') with an explicit temporary-behavior qualifier. The 'When NOT to use' line names set_screen_content, so an agent can separate it from the sibling without opening either schema.

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

Usage Guidelines5/5

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

Gives explicit when-to-use cases (temporary override like a lunch menu, or a pre-armed emergency) and an explicit when-not-to-use case routed to set_screen_content. Emergency vs temporary content handling is also called out as a decision the agent must confirm with the person.

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

update_itemsChange itemsA
Destructive
Inspect

Change existing items of one kind, the same changes on every id.

When to use:

  • Renaming, moving or retagging items; editing what is inside a playlist, schedule, layout or screen group; screen, web link and data feed settings; swapping a screen's device; closing an alert.

  • Turning Repeat for each row on, changing its seconds or turning it off on a creative (repeat, useEachRow).

  • Franchise menus: share a creative live with child workspaces (shareWithWorkspaces), and set one location's own prices on a creative shared to it (localText) while the owner's design keeps updating.

When NOT to use:

  • Showing content on screens: use set_screen_content.

  • New items: use create_items. Removing: use delete_items.

What to know:

  • Per id, changes run as steps in a fixed order and stop at that id's first failure; earlier steps stay and are named; other ids go on. Each id returns the item as it is now.

  • Content that airs where review is required goes back to draft. Needs the kind's edit permission (screen moves: at both locations).

  • Changes go live at once: every screen playing an edited playlist, schedule or layout shows the new version at its next sync. There is no undo; overwritten values and removed playlist items are gone, so note the old values with get_items first.

  • Repeat for each row: one design and one data source play as a slideshow, one slide per row of the sheet. Set dataSourceId and repeat {over:"rows", secondsPerRow:12}; seconds run from 3 to 3600, default 12. A workspace without this feature refuses it with 403 feature_disabled and saves nothing, so tell the person instead of retrying.

  • Row tags follow the slide: {{row.column}} in a text box's text, row.column in a field box's field, {{row.photo}} as an image box's url or the backgroundUrl. {{rows.0.column}} stays on the sheet's first row on every slide.

  • The column name in a row tag is the sheet's header in lower case with accents removed, every other character changed to _, repeats collapsed and none at the ends: Date de début is row.date_de_debut, Région (€) is row.region. A missing column or an empty cell reads blank.

  • A picture cell must be a plain https address; anything else leaves that box empty on that slide.

  • At most 200 rows and 3 MB of slides play, and each slide is a whole copy of the design, so a large design fits fewer rows. Afterwards read it with get_items: repeatStatus gives rowCount, rowsThatFit, limitedBy, columns, missingColumns and warnings. Tell the person when rowsThatFit is below rowCount.

  • It reaches screens like any design: set_screen_content or start_takeover with contentKind creative, a schedule block or a layout zone. A playlist item has its own switch: appendItems with refKind creative may answer 403 feature_disabled, and then set_screen_content still works.

  • repeat:null turns it off and the design plays once; its row tags then have no row to read, so change them to {{rows.0.column}} in the same call's boxes.

Parameters:

  • kind and ids: every id must be of that kind; get them from list_items. Every id gets identical changes; for different values per item, call once per value.

  • changes: only the fields to change. Each field's description names the kinds that take it; a field the kind does not take is refused before anything changes.

  • zones, boxes, config and tags replace the whole value: read it with get_items first. In config, a value that reads •••••••• (sent back or left out) keeps what is stored; a new sign-in value, or clearing one, is refused because a person changes those in the Brix console.

  • Example: {kind:"screens", ids:["scr_lobby7", "scr_lobby8"], changes:{nodeId:"on_store12", tags:["lobby"]}}.

NameRequiredDescriptionDefault
idsYesItem ids.
kindYesKind of the ids.
changesYesFields to change.

Output Schema

NameRequiredDescription
kindNoThe kind changed.
failedNoHow many stopped at a failed step.
resultsNoOne row per id, in the order given.
succeededNoHow many items changed fully.

TDQS

A4.8/5.0
Behavior5/5

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

The annotations already flag mutation, destruction, non-idempotence, and open-world behavior, but the description adds substantial operational context: per-id step ordering, partial failure semantics, review/draft behavior, permission requirements, immediate live changes, no undo, feature-disabled errors, and row-limit warnings. It also explains bulk-update behavior and the fact that each id receives identical changes, which is critical beyond the annotations.

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

Conciseness4/5

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

The structure is front-loaded and useful: purpose, when/when-not, what to know, then parameters. It is long, but the length is largely justified by the tool's complexity; some repeat/row-tag details duplicate or expand schema-level information, keeping it just short of ideal concision.

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

Completeness5/5

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

For a complex destructive bulk-update tool, the description covers permissions, failure behavior, live propagation, undo risk, feature restrictions, repeat-row semantics, limits, and error handling. Output schema exists, so it does not need to describe return structure in detail, and its mention of get_items/repeatStatus is useful rather than redundant.

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

Parameters4/5

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

Schema coverage is 100%, so the parameter schema already carries much of the field-level meaning. The description still adds valuable cross-parameter semantics: all ids must be the same kind, every id gets identical changes, missing fields are unchanged, whole-value replacement for zones/boxes/config/tags requires get_items first, sentinel secret handling in config, and a concrete example call.

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

Purpose5/5

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

The description opens with a specific verb and scope: "Change existing items of one kind, the same changes on every id." It explicitly distinguishes the tool from set_screen_content, create_items, and delete_items, so an agent can choose it without inspecting siblings.

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

Usage Guidelines5/5

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

It has explicit "When to use" and "When NOT to use" sections, naming alternatives such as set_screen_content, create_items, and delete_items. The guidance is concrete enough to route an agent correctly across the most likely sibling tools.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool update
    • Changedget_fleet_report3 fields changed
      • addedInput schema / properties / contentIds
        Added value: +{
        +  "description": "proof_of_play: only these content ids, for example one advertiser's ads.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / detail
        Added value: +{
        +  "description": "proof_of_play: screens adds byScreen, one row per content and screen.",
        +  "enum": [
        +    "screens"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / screenIds
        Added value: +{
        +  "description": "proof_of_play: only these screens, for example every screen at one venue.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}

Publisher details

Operator
Brix Signage, LLC · Publisher source
Vendor relationship
First-party · Publisher source
Restrictions
Requires a Brix account (free trial available). Sign in with OAuth and choose the workspace and permission areas to share. Billing, payment, API keys, users and roles are not reachable through the connector. · Publisher source

Related MCP Connectors

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources