Brix is digital-signage management for a fleet of screens. Every tool shares one set of kind names (screens, media, playlists, schedules, layouts, creatives, apps, data_sources, screen_groups, locations, media_folders, emergency_templates). Work read then write: list_items finds ids by name, get_items reads items in full; create_items, update_items, delete_items and restore_items change items; set_screen_content sets what screens play by default; start_takeover takes screens over for a while and end_takeover stops it. For one screen use get_screen_status (why, diagnose, outages, tv), capture_screenshot and control_screens; for the fleet use get_fleet_report and list_items kind alerts. Deletes go to a 30-day recycle bin (restore_items brings them back). Confirm deletes, emergencies and fleet-wide casts with the person first. A connected app reads people and roles (list_items kind people, roles) and invites a person with a role that does not manage access (create_items people). Changing a person's access, roles, API keys, billing and payment stays with a person in the Brix console. A data feed that needs a sign-in or key is connected by a person in the Brix console; tools then use it by its id and never take sign-in values. All results are scoped to the workspace, permissions and location the connection was granted.
Discoverability
0 pass · 1 partial0 passed · 1 partial8/100
Client listings and public setup information.
mcp.json or server-card.json
Either mcp.json or an MCP Server Card declaring this endpoint passes.
No matching mcp.json manifest or MCP Server Card was found at the checked URLs.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
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"}.
The description explains the capability, when to use it, and what to expect.
Inputs63/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
kind
Which list.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
q
Name contains.
Clear enough to supply this argument.
status
Screen or approval state.
Resolve the mismatch between this description and its schema constraints.
nodeId
Location id.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
tag
Tag.
Explain the meaning of this value, not just its name.
mediaKind
Media type.
Explain the meaning of this value, not just its name.
folderId
Media folder id.
Clear enough to supply this argument.
severity
Alert severity.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
screenId
Screen id.
Explain the meaning of this value, not just its name.
binKind
Recycle bin kind.
Explain the meaning of this value, not just its name.
limit
Page size.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
offset
Rows to skip.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations100/100
All four behavior hints are declared.
{
"title": "List items of one kind",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
Output schema80/100
The output schema explains the structured result.
View output schema
{
"type": "object",
"properties": {
"kind": {
"type": [
"string",
"null"
],
"description": "The kind listed."
},
"items": {
"type": "array",
"items": {
"type": "object"
},
"description": "One short row per item: id, name, location (nodeId) and counts. Never full configs or members."
},
"total": {
"type": [
"integer",
"null"
],
"description": "How many items match, across all pages."
},
"hasMore": {
"type": [
"boolean",
"null"
],
"description": "true when another page exists; call again with offset = nextOffset."
},
"nextOffset": {
"type": [
"integer",
"null"
],
"description": "The offset of the next page (present when hasMore)."
}
}
}
Original tool metadata
{
"name": "list_items",
"title": "List items of one kind",
"description": "List items of one kind with their ids, so other tools can act on them.\n\nWhen to use:\n- A request names a screen, file, playlist or location and you need its id.\n- 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).\n\nWhen NOT to use:\n- Reading one item's contents: use get_items.\n- History over time: use get_fleet_report.\n\nWhat to know:\n- 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.\n- 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.\n- 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.\n\nParameters:\n- 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).\n- 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).\n- limit: page size for media and approvals (default 50); other kinds give 100 a page. offset: pass nextOffset while hasMore.\n- Example: {kind:\"screens\", status:\"offline\", nodeId:\"on_west\"}.",
"inputSchema": {
"type": "object",
"required": [
"kind"
],
"properties": {
"q": {
"type": "string",
"description": "Name contains."
},
"tag": {
"type": "string",
"description": "Tag."
},
"kind": {
"enum": [
"screens",
"media",
"playlists",
"schedules",
"layouts",
"creatives",
"apps",
"data_sources",
"screen_groups",
"locations",
"media_folders",
"emergency_templates",
"casts",
"emergencies",
"alerts",
"approvals",
"recycle_bin",
"app_types",
"connectors",
"people",
"roles"
],
"type": "string",
"description": "Which list."
},
"limit": {
"type": "integer",
"maximum": 200,
"minimum": 1,
"description": "Page size."
},
"nodeId": {
"type": "string",
"description": "Location id."
},
"offset": {
"type": "integer",
"minimum": 0,
"description": "Rows to skip."
},
"status": {
"enum": [
"online",
"offline",
"pairing",
"pending",
"approved",
"rejected",
"withdrawn"
],
"type": "string",
"description": "Screen or approval state."
},
"binKind": {
"type": "string",
"description": "Recycle bin kind."
},
"folderId": {
"type": "string",
"description": "Media folder id."
},
"screenId": {
"type": "string",
"description": "Screen id."
},
"severity": {
"enum": [
"info",
"warning",
"critical"
],
"type": "string",
"description": "Alert severity."
},
"mediaKind": {
"type": "string",
"description": "Media type."
}
}
},
"outputSchema": {
"type": "object",
"properties": {
"kind": {
"type": [
"string",
"null"
],
"description": "The kind listed."
},
"items": {
"type": "array",
"items": {
"type": "object"
},
"description": "One short row per item: id, name, location (nodeId) and counts. Never full configs or members."
},
"total": {
"type": [
"integer",
"null"
],
"description": "How many items match, across all pages."
},
"hasMore": {
"type": [
"boolean",
"null"
],
"description": "true when another page exists; call again with offset = nextOffset."
},
"nextOffset": {
"type": [
"integer",
"null"
],
"description": "The offset of the next page (present when hasMore)."
}
}
},
"annotations": {
"title": "List items of one kind",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
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"]}.
The description explains the capability, when to use it, and what to expect.
Inputs69/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
kind
Kind of the ids.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
ids
Item ids.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"properties": {
"kind": {
"type": [
"string",
"null"
],
"description": "The kind that was acted on."
},
"failed": {
"type": [
"integer",
"null"
],
"description": "How many failed; the rest still ran."
},
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"ok": {
"type": [
"boolean",
"null"
],
"description": "true when this one succeeded."
},
"error": {
"type": [
"string",
"null"
],
"description": "Why this one failed, with the next step to take (present when not ok)."
},
"label": {
"type": [
"string",
"null"
],
"description": "The id, or the item's name (or #position) for a create."
},
"result": {
"type": "object",
"description": "The record as the API returned it (present when ok)."
}
}
},
"description": "One row per id or item, in the order given."
},
"succeeded": {
"type": [
"integer",
"null"
],
"description": "How many ids or items succeeded."
}
}
}
Original tool metadata
{
"name": "get_items",
"title": "Read items in full",
"description": "Read items of one kind in full.\n\nWhen to use:\n- Before update_items, to see current values and part ids (playlist items pli_…, schedule blocks sb_…).\n- Checking how many rows of a sheet a repeating creative plays, and how many fit.\n- 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).\n\nWhen NOT to use:\n- Searching by name: use list_items first.\n- 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).\n\nWhat to know:\n- 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.\n- 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.\n- 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.\n\nParameters:\n- kind: the kind of every id. account takes no ids and returns this connection's actor, workspace and permissions.\n- 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.\n- device_test_runs: call again until status is finished.\n- Example: {kind:\"playlists\", ids:[\"pl_8f2c\"]}.",
"inputSchema": {
"type": "object",
"required": [
"kind"
],
"properties": {
"ids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 50,
"minItems": 1,
"description": "Item ids."
},
"kind": {
"enum": [
"screens",
"media",
"playlists",
"schedules",
"layouts",
"creatives",
"apps",
"data_sources",
"screen_groups",
"locations",
"media_folders",
"emergency_templates",
"approvals",
"emergencies",
"device_test_runs",
"people",
"roles",
"account"
],
"type": "string",
"description": "Kind of the ids."
}
}
},
"outputSchema": {
"type": "object",
"properties": {
"kind": {
"type": [
"string",
"null"
],
"description": "The kind that was acted on."
},
"failed": {
"type": [
"integer",
"null"
],
"description": "How many failed; the rest still ran."
},
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"ok": {
"type": [
"boolean",
"null"
],
"description": "true when this one succeeded."
},
"error": {
"type": [
"string",
"null"
],
"description": "Why this one failed, with the next step to take (present when not ok)."
},
"label": {
"type": [
"string",
"null"
],
"description": "The id, or the item's name (or #position) for a create."
},
"result": {
"type": "object",
"description": "The record as the API returned it (present when ok)."
}
}
},
"description": "One row per id or item, in the order given."
},
"succeeded": {
"type": [
"integer",
"null"
],
"description": "How many ids or items succeeded."
}
}
},
"annotations": {
"title": "Read items in full",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description89/100
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. Optional: limit (at most N rows) and filters (only rows where a column is / contains / is greater than a value), for example "only the active offers, at most 10". 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}]}]}.
The description explains the capability, when to use it, and what to expect.
Inputs82/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
playlists › items › name
Playlist display name.
Clear enough to supply this argument.
playlists › items › description
Optional note about the playlist, shown in the console.
Clear enough to supply this argument.
playlists › items › items › items › refKind
'media' for a library file, 'app' for an app instance.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
playlists › items › items › items › refId
A media or app id in THIS workspace (find ids with list_items kind media or apps).
Clear enough to supply this argument.
playlists › items › items › items › durationSec
Seconds this item plays; default 10.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
schedules › items › name
Schedule display name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
schedules › items › description
Optional note about the schedule, shown in the console.
Clear enough to supply this argument.
schedules › items › blocks › items › daysOfWeek
0=Sunday … 6=Saturday.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
schedules › items › blocks › items › startTime
HH:MM, 24-hour.
Clear enough to supply this argument.
schedules › items › blocks › items › endTime
HH:MM, 24-hour.
Clear enough to supply this argument.
schedules › items › blocks › items › refKind
Kind of content refId names.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
schedules › items › blocks › items › refId
A live content id in THIS workspace.
Clear enough to supply this argument.
schedules › items › blocks › items › label
Block name shown in the CMS, e.g. "Breakfast". Default "Block".
Clear enough to supply this argument.
schedules › items › blocks › items › startDate
YYYY-MM-DD first day the block runs. Omit for no start bound.
Clear enough to supply this argument.
schedules › items › blocks › items › endDate
YYYY-MM-DD last day the block runs. Omit for no end bound.
Clear enough to supply this argument.
schedules › items › blocks › items › priority
Higher wins where blocks overlap. Default 0.
Clear enough to supply this argument.
locations › items › name
Location display name, e.g. "Store 0142" or "West region".
Clear enough to supply this argument.
locations › items › externalId
Location ID (store number, region code). Unique per workspace.
Clear enough to supply this argument.
locations › items › parentId
Existing parent node id; omit for a child of the Space root.
Clear enough to supply this argument.
locations › items › parentExternalId
Location ID of the parent — an existing node or an earlier node in this call.
Clear enough to supply this argument.
locations › items › tier
Depth hint; derived from the parent when omitted.
Clear enough to supply this argument.
celebrations › items › name
Who is being celebrated.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
celebrations › items › occasionType
e.g. birthday | anniversary | retirement.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
celebrations › items › occasionMonth
Month of the occasion, 1 = January.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
celebrations › items › occasionDay
Day of the month of the occasion.
Clear enough to supply this argument.
celebrations › items › occasionYear
Optional year, e.g. birth year or start year (for ages and work anniversaries).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
celebrations › items › department
Optional department, e.g. "Sales".
Clear enough to supply this argument.
celebrations › items › title
Optional job title.
Clear enough to supply this argument.
celebrations › items › location
Optional site or office name, as free text.
Clear enough to supply this argument.
celebrations › items › customMessage
Optional message shown with the entry.
Clear enough to supply this argument.
celebrations › items › externalId
Stable id from the source system — makes re-imports idempotent upstream.
Clear enough to supply this argument.
creatives › items › name
Creative display name.
Clear enough to supply this argument.
creatives › items › stage
Canvas orientation; default landscape.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
creatives › items › backgroundUrl
http(s) URL or a /v1/media/<id>/file URL from this workspace.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
creatives › items › dataSourceId
Data source in THIS workspace (ds_… from list_items kind data_sources) that the design's field, list and row bindings read. Required with repeat.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
creatives › items › repeat › over
What it repeats over: the rows of the data source.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
creatives › items › repeat › secondsPerRow
How long each row stays up, 3 to 3600 seconds; default 12.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
creatives › items › repeat › limit
Show at most this many rows (after the filters), from the top of the sheet; null = every row.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
kind:'app' only: the app's catalog key (the appKey of that app in list_items, for example 'weather' or 'clock'). Optional; the editor reads it from the app when it is absent.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
screens › items › code
The 6-digit pairing code shown on the device.
Clear enough to supply this argument.
screens › items › name
Screen name, e.g. "Lobby left".
Clear enough to supply this argument.
screens › items › nodeId
Location id for the screen (list_items kind locations); omit for the workspace root.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
screen_groups › items › name
Group name, unique in the workspace, up to 120 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
screen_groups › items › description
Note, up to 500 characters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
screen_groups › items › screenIds
First members (ids from list_items kind screens); ids out of reach are skipped.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
web_links › items › name
Name shown in the library.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
web_links › items › url
http(s) address. A private or loopback address is refused unless onScreenNetwork is true.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
web_links › items › folderId
Folder id (list_items kind media_folders); omit for the root.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
web_links › items › tags
Tags to set.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
web_links › items › onScreenNetwork
true when only the screen's own network can reach the page (an intranet dashboard); the cloud then never fetches it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
media_from_urls › items › url
Public http(s) URL of the file: a Drive share, S3 object or old CMS export.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
media_from_urls › items › name
Display name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
media_from_urls › items › folderId
Folder id (list_items kind media_folders); omit for the root.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
media_from_urls › items › tags
Tags to set, e.g. ["menu"].
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
media_files › items › name
File name with its extension, e.g. "menu.png".
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
media_files › items › contentType
MIME type, e.g. image/png, image/jpeg, video/mp4, application/pdf.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
media_files › items › dataBase64
The file's bytes, base64 (a data: URL prefix is accepted).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
media_files › items › folderId
Folder id (list_items kind media_folders); omit for the root.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
media_files › items › nodeId
Location id to home it at; omit for the workspace root.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
layouts › items › name
Layout name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
layouts › items › resolution › w
Width in pixels.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
layouts › items › resolution › h
Height in pixels.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
layouts › items › nodeId
Location id to home it at; omit for the workspace root.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
layouts › items › zones
Zones, each { name, x, y, w, h (pixels on the canvas), content: { kind, id } (media, playlist or app), frame?, radius?, role? }, the shape get_items kind layouts returns.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
layouts › items › theme
{ source: "brand", mode?: "dark"|"light", radius?: px } paints the layout in the workspace Brand Kit; null = bare canvas.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
apps › items › appKey
App type key from list_items kind app_types, e.g. "weather".
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
apps › items › name
Instance name, e.g. "Lobby weather".
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
apps › items › config
App settings; each app has its own keys. Read an instance of the same app with get_items kind apps to see them. Omit for defaults. A sign-in value is refused.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
apps › items › nodeId
Location id to home it at; omit for the workspace root.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
data_sources › items › name
Feed name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
data_sources › items › connector
Connector type from list_items kind connectors with setup "here", e.g. "google-sheets".
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
data_sources › items › config
Connector settings, with no sign-in values: csv {url} or {csv}; google-sheets {sheetUrl, sheetName?}; ical {url, tz?}; transitous {stopId, rows?}; http-json and rest {url}; momentus {apiUrl}.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
data_sources › items › nodeId
Location id to home it at; omit for the workspace root.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
media_folders › items › name
Folder name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
media_folders › items › parentId
Parent folder id; omit for a top-level folder.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
media_folders › items › nodeId
Location id; omit for the workspace root.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
emergency_templates › items › name
Template name, e.g. "Lockdown".
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
emergency_templates › items › contentKind
Kind of content to show: media, playlist, app or creative.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
emergency_templates › items › contentId
Id of that content (list_items).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
emergency_templates › items › scopeKind
Which screens it takes over: all, node (one location and below) or screens.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
emergency_templates › items › scopeNodeId
With scopeKind node: the location id.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
emergency_templates › items › severity
info, warning or critical.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
emergency_templates › items › headline
Text shown over the content.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
emergency_templates › items › body
Smaller text under the headline.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
emergency_templates › items › prestage
true caches the content on every in-scope screen now, so it shows at once when fired.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
people › items › email
Their email address.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
people › items › name
Their name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
people › items › roleId
Role to hold (list_items kind roles); it can hold only permissions this connection holds.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
people › items › nodeIds
Locations where they hold the role (list_items kind locations).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
device_test_runs › items › screenId
Screen to test (list_items kind screens).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
device_test_runs › items › suite
smoke (safe liveness), display, capacity, requirements, content, soak, chaos or full. Start with smoke.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"properties": {
"kind": {
"type": [
"string",
"null"
],
"description": "The kind created."
},
"failed": {
"type": [
"integer",
"null"
],
"description": "One-by-one kinds: how many failed."
},
"created": {
"type": "array",
"items": {
"type": "object"
},
"description": "Bulk kinds: the new records with their ids."
},
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"ok": {
"type": [
"boolean",
"null"
],
"description": "true when this one succeeded."
},
"error": {
"type": [
"string",
"null"
],
"description": "Why this one failed, with the next step to take (present when not ok)."
},
"label": {
"type": [
"string",
"null"
],
"description": "The id, or the item's name (or #position) for a create."
},
"result": {
"type": "object",
"description": "The record as the API returned it (present when ok)."
}
}
},
"description": "One row per id or item, in the order given."
},
"succeeded": {
"type": [
"integer",
"null"
],
"description": "One-by-one kinds: how many were created."
}
},
"description": "Bulk kinds return the bulk result (ids of what was created); one-by-one kinds return one row per item."
}
Original tool metadata
{
"name": "create_items",
"title": "Create items",
"description": "Create new items of one kind.\n\nWhen to use:\n- 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.\n\nWhen NOT to use:\n- Changing an existing item: use update_items.\n- Showing it on screens: create it, then use set_screen_content or start_takeover.\n\nWhat to know:\n- 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.\n- New content at a location under review starts as a draft. Needs the kind's create permission there.\n- 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.\n- 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. Optional: limit (at most N rows) and filters (only rows where a column is / contains / is greater than a value), for example \"only the active offers, at most 10\". A workspace without this feature refuses it with 403 feature_disabled and saves nothing, so tell the person instead of retrying.\n- 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.\n- 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.\n- A picture cell must be a plain https address; anything else leaves that box empty on that slide.\n- 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.\n- 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.\n\nParameters:\n- Pass exactly one array; its name is the kind and two arrays is an error.\n- Ids inside items (refId, contentId, nodeId, screenId, appKey, connector) must already exist; get them from list_items.\n- Example: {playlists:[{name:\"Lobby loop\", items:[{refKind:\"media\", refId:\"med_logo\", durationSec:10}]}]}.",
"inputSchema": {
"type": "object",
"properties": {
"apps": {
"type": "array",
"items": {
"type": "object",
"required": [
"appKey",
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Instance name, e.g. \"Lobby weather\"."
},
"appKey": {
"type": "string",
"description": "App type key from list_items kind app_types, e.g. \"weather\"."
},
"config": {
"type": "object",
"description": "App settings; each app has its own keys. Read an instance of the same app with get_items kind apps to see them. Omit for defaults. A sign-in value is refused."
},
"nodeId": {
"type": "string",
"description": "Location id to home it at; omit for the workspace root."
}
}
},
"maxItems": 50,
"description": "App instances (weather, clock, menu board, …), max 50. Find valid appKey values with list_items kind app_types."
},
"people": {
"type": "array",
"items": {
"type": "object",
"required": [
"email",
"roleId",
"nodeIds"
],
"properties": {
"name": {
"type": "string",
"description": "Their name."
},
"email": {
"type": "string",
"description": "Their email address."
},
"roleId": {
"type": "string",
"description": "Role to hold (list_items kind roles); it can hold only permissions this connection holds."
},
"nodeIds": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"description": "Locations where they hold the role (list_items kind locations)."
}
}
},
"maxItems": 10,
"description": "Invite 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."
},
"layouts": {
"type": "array",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Layout name."
},
"theme": {
"type": [
"object",
"null"
],
"description": "{ source: \"brand\", mode?: \"dark\"|\"light\", radius?: px } paints the layout in the workspace Brand Kit; null = bare canvas."
},
"zones": {
"type": "array",
"items": {
"type": "object"
},
"description": "Zones, each { name, x, y, w, h (pixels on the canvas), content: { kind, id } (media, playlist or app), frame?, radius?, role? }, the shape get_items kind layouts returns."
},
"nodeId": {
"type": "string",
"description": "Location id to home it at; omit for the workspace root."
},
"resolution": {
"type": "object",
"required": [
"w",
"h"
],
"properties": {
"h": {
"type": "integer",
"minimum": 1,
"description": "Height in pixels."
},
"w": {
"type": "integer",
"minimum": 1,
"description": "Width in pixels."
}
},
"description": "Canvas size in pixels, e.g. {w:1920, h:1080}; portrait is {w:1080, h:1920}. Default {w:1920, h:1080}."
}
}
},
"maxItems": 50,
"description": "Multi-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)."
},
"screens": {
"type": "array",
"items": {
"type": "object",
"required": [
"code",
"name"
],
"properties": {
"code": {
"type": "string",
"pattern": "^[0-9]{6}$",
"description": "The 6-digit pairing code shown on the device."
},
"name": {
"type": "string",
"description": "Screen name, e.g. \"Lobby left\"."
},
"nodeId": {
"type": "string",
"description": "Location id for the screen (list_items kind locations); omit for the workspace root."
}
}
},
"maxItems": 20,
"description": "Pair new devices, max 20. Each device shows a 6-digit pairing code on its screen; the code pairs it into this workspace."
},
"creatives": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"boxes"
],
"properties": {
"name": {
"type": "string",
"description": "Creative display name."
},
"boxes": {
"type": "array",
"items": {
"type": "object",
"required": [
"kind",
"x",
"y",
"w",
"h"
],
"properties": {
"h": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "Height, as a fraction of the stage height."
},
"w": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "Width, as a fraction of the stage width."
},
"x": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "Left edge, as a fraction of the stage width (0 = left, 1 = right)."
},
"y": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "Top edge, as a fraction of the stage height (0 = top, 1 = bottom)."
},
"kind": {
"enum": [
"text",
"field",
"list",
"image",
"shape",
"celebrations",
"event-board",
"signage",
"group",
"slot"
],
"type": "string",
"description": "Layer type; decides which extra fields apply."
},
"slot": {
"oneOf": [
{
"type": "null"
},
{
"type": "object",
"required": [
"kind",
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Id of that file, playlist or app in this workspace."
},
"kind": {
"enum": [
"media",
"playlist",
"app"
],
"type": "string",
"description": "What fills the hole: a media file, a playlist or an app."
},
"name": {
"type": "string",
"description": "Display label shown in the editor; optional."
},
"appKey": {
"type": "string",
"description": "kind:'app' only: the app's catalog key (the appKey of that app in list_items, for example 'weather' or 'clock'). Optional; the editor reads it from the app when it is absent."
}
}
}
],
"description": "kind:'slot' only — the file / playlist / app this hole plays (ids from list_items in this workspace). null = an empty hole the customer fills in the editor."
}
}
},
"description": "The layers of the design; see the tool description for each kind's extra fields."
},
"stage": {
"enum": [
"landscape",
"portrait"
],
"type": "string",
"description": "Canvas orientation; default landscape."
},
"nodeId": {
"type": "string",
"description": "Org node to home the creative at; omit for the Space root."
},
"repeat": {
"type": "object",
"required": [
"over"
],
"properties": {
"over": {
"enum": [
"rows"
],
"type": "string",
"description": "What it repeats over: the rows of the data source."
},
"limit": {
"type": [
"integer",
"null"
],
"maximum": 200,
"minimum": 1,
"description": "Show at most this many rows (after the filters), from the top of the sheet; null = every row."
},
"filters": {
"type": [
"array",
"null"
],
"items": {
"type": "object",
"required": [
"column",
"op"
],
"properties": {
"op": {
"enum": [
"is",
"is_not",
"contains",
"not_contains",
"empty",
"not_empty",
"gt",
"lt"
],
"type": "string",
"description": "is, is_not, contains, not_contains, empty, not_empty, gt (greater than), lt (less than)."
},
"value": {
"type": [
"string",
"number"
],
"description": "What to compare with. Not used by empty / not_empty."
},
"column": {
"type": "string",
"description": "The sheet's column name, as in its first row."
}
}
},
"maxItems": 5,
"description": "Only rows that match EVERY filter play, in sheet order. Text compares ignore case, accents and outer spaces; gt/lt compare numbers (\"1 200,50 €\" reads 1200.5) and skip a cell with no number. Example: [{column:\"Actif\", op:\"is\", value:\"oui\"}]. null or [] = no filter."
},
"secondsPerRow": {
"type": "number",
"maximum": 3600,
"minimum": 3,
"description": "How long each row stays up, 3 to 3600 seconds; default 12."
}
},
"description": "Repeat for each row: plays the design once per row of dataSourceId, with row bindings following the row. Example: {over:\"rows\", secondsPerRow:12, limit:10, filters:[{column:\"Actif\", op:\"is\", value:\"oui\"}]}. Omit for a design that plays once. A workspace without the feature refuses it (403 feature_disabled) and nothing is created."
},
"dataSourceId": {
"type": "string",
"description": "Data source in THIS workspace (ds_… from list_items kind data_sources) that the design's field, list and row bindings read. Required with repeat."
},
"backgroundUrl": {
"type": "string",
"description": "http(s) URL or a /v1/media/<id>/file URL from this workspace."
}
}
},
"maxItems": 100,
"description": "Creatives to create, max 100 per call."
},
"locations": {
"type": "array",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Location display name, e.g. \"Store 0142\" or \"West region\"."
},
"tier": {
"type": "integer",
"minimum": 1,
"description": "Depth hint; derived from the parent when omitted."
},
"parentId": {
"type": "string",
"description": "Existing parent node id; omit for a child of the Space root."
},
"externalId": {
"type": "string",
"description": "Location ID (store number, region code). Unique per workspace."
},
"parentExternalId": {
"type": "string",
"description": "Location ID of the parent — an existing node or an earlier node in this call."
}
}
},
"maxItems": 1000,
"description": "Locations (org-tree nodes) to create, max 1000 per call. List a parent before its children."
},
"playlists": {
"type": "array",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Playlist display name."
},
"items": {
"type": "array",
"items": {
"type": "object",
"required": [
"refKind",
"refId"
],
"properties": {
"refId": {
"type": "string",
"description": "A media or app id in THIS workspace (find ids with list_items kind media or apps)."
},
"refKind": {
"enum": [
"media",
"app"
],
"type": "string",
"description": "'media' for a library file, 'app' for an app instance."
},
"durationSec": {
"type": "number",
"minimum": 1,
"description": "Seconds this item plays; default 10."
}
}
},
"description": "What the playlist plays, in play order. Omit for an empty playlist."
},
"description": {
"type": "string",
"description": "Optional note about the playlist, shown in the console."
}
}
},
"maxItems": 500,
"description": "Playlists to create, max 500 per call."
},
"schedules": {
"type": "array",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Schedule display name."
},
"blocks": {
"type": "array",
"items": {
"type": "object",
"required": [
"daysOfWeek",
"startTime",
"endTime",
"refKind",
"refId"
],
"properties": {
"label": {
"type": "string",
"description": "Block name shown in the CMS, e.g. \"Breakfast\". Default \"Block\"."
},
"refId": {
"type": "string",
"description": "A live content id in THIS workspace."
},
"endDate": {
"type": "string",
"description": "YYYY-MM-DD last day the block runs. Omit for no end bound."
},
"endTime": {
"type": "string",
"description": "HH:MM, 24-hour."
},
"refKind": {
"enum": [
"media",
"playlist",
"app",
"layout",
"creative",
"signage"
],
"type": "string",
"description": "Kind of content refId names."
},
"priority": {
"type": "integer",
"maximum": 1000,
"minimum": 0,
"description": "Higher wins where blocks overlap. Default 0."
},
"startDate": {
"type": "string",
"description": "YYYY-MM-DD first day the block runs. Omit for no start bound."
},
"startTime": {
"type": "string",
"description": "HH:MM, 24-hour."
},
"daysOfWeek": {
"type": "array",
"items": {
"type": "integer",
"maximum": 6,
"minimum": 0
},
"description": "0=Sunday … 6=Saturday."
}
}
},
"maxItems": 50,
"description": "Time blocks, max 50. Each plays one piece of content on the given days between startTime and endTime."
},
"description": {
"type": "string",
"description": "Optional note about the schedule, shown in the console."
}
}
},
"maxItems": 200,
"description": "Schedules to create, max 200 per call."
},
"web_links": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"url"
],
"properties": {
"url": {
"type": "string",
"description": "http(s) address. A private or loopback address is refused unless onScreenNetwork is true."
},
"name": {
"type": "string",
"description": "Name shown in the library."
},
"tags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Tags to set."
},
"folderId": {
"type": "string",
"description": "Folder id (list_items kind media_folders); omit for the root."
},
"onScreenNetwork": {
"type": "boolean",
"description": "true when only the screen's own network can reach the page (an intranet dashboard); the cloud then never fetches it."
}
}
},
"maxItems": 50,
"description": "Live web pages or dashboards for the media library, max 50. Set crop, scroll and refresh after with update_items kind media."
},
"media_files": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"contentType",
"dataBase64"
],
"properties": {
"name": {
"type": "string",
"description": "File name with its extension, e.g. \"menu.png\"."
},
"nodeId": {
"type": "string",
"description": "Location id to home it at; omit for the workspace root."
},
"folderId": {
"type": "string",
"description": "Folder id (list_items kind media_folders); omit for the root."
},
"dataBase64": {
"type": "string",
"description": "The file's bytes, base64 (a data: URL prefix is accepted)."
},
"contentType": {
"type": "string",
"description": "MIME type, e.g. image/png, image/jpeg, video/mp4, application/pdf."
}
}
},
"maxItems": 5,
"description": "Files whose bytes you hold (an image you made, a file the person pasted), uploaded straight into the media library, 6 MB each."
},
"celebrations": {
"type": "array",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Who is being celebrated."
},
"title": {
"type": "string",
"description": "Optional job title."
},
"location": {
"type": "string",
"description": "Optional site or office name, as free text."
},
"department": {
"type": "string",
"description": "Optional department, e.g. \"Sales\"."
},
"externalId": {
"type": "string",
"description": "Stable id from the source system — makes re-imports idempotent upstream."
},
"occasionDay": {
"type": "integer",
"maximum": 31,
"minimum": 1,
"description": "Day of the month of the occasion."
},
"occasionType": {
"type": "string",
"description": "e.g. birthday | anniversary | retirement."
},
"occasionYear": {
"type": "integer",
"description": "Optional year, e.g. birth year or start year (for ages and work anniversaries)."
},
"customMessage": {
"type": "string",
"description": "Optional message shown with the entry."
},
"occasionMonth": {
"type": "integer",
"maximum": 12,
"minimum": 1,
"description": "Month of the occasion, 1 = January."
}
}
},
"maxItems": 100,
"description": "Celebration entries to import, max 100 per call."
},
"data_sources": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"connector",
"config"
],
"properties": {
"name": {
"type": "string",
"description": "Feed name."
},
"config": {
"type": "object",
"description": "Connector settings, with no sign-in values: csv {url} or {csv}; google-sheets {sheetUrl, sheetName?}; ical {url, tz?}; transitous {stopId, rows?}; http-json and rest {url}; momentus {apiUrl}."
},
"nodeId": {
"type": "string",
"description": "Location id to home it at; omit for the workspace root."
},
"connector": {
"type": "string",
"description": "Connector type from list_items kind connectors with setup \"here\", e.g. \"google-sheets\"."
}
}
},
"maxItems": 20,
"description": "Data 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_folders": {
"type": "array",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Folder name."
},
"nodeId": {
"type": "string",
"description": "Location id; omit for the workspace root."
},
"parentId": {
"type": "string",
"description": "Parent folder id; omit for a top-level folder."
}
}
},
"maxItems": 50,
"description": "Media library folders, max 50."
},
"screen_groups": {
"type": "array",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Group name, unique in the workspace, up to 120 characters."
},
"screenIds": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 5000,
"description": "First members (ids from list_items kind screens); ids out of reach are skipped."
},
"description": {
"type": "string",
"description": "Note, up to 500 characters."
}
}
},
"maxItems": 50,
"description": "Screen groups, max 50. A group is a flat label across locations; it grants no permissions."
},
"media_from_urls": {
"type": "array",
"items": {
"type": "object",
"required": [
"url",
"name"
],
"properties": {
"url": {
"type": "string",
"description": "Public http(s) URL of the file: a Drive share, S3 object or old CMS export."
},
"name": {
"type": "string",
"description": "Display name."
},
"tags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Tags to set, e.g. [\"menu\"]."
},
"folderId": {
"type": "string",
"description": "Folder id (list_items kind media_folders); omit for the root."
}
}
},
"maxItems": 20,
"description": "Files (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_runs": {
"type": "array",
"items": {
"type": "object",
"required": [
"screenId",
"suite"
],
"properties": {
"suite": {
"enum": [
"smoke",
"chaos",
"full",
"content",
"requirements",
"display",
"soak",
"capacity"
],
"type": "string",
"description": "smoke (safe liveness), display, capacity, requirements, content, soak, chaos or full. Start with smoke."
},
"screenId": {
"type": "string",
"description": "Screen to test (list_items kind screens)."
}
}
},
"maxItems": 10,
"description": "Device 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_templates": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"contentKind",
"contentId"
],
"properties": {
"body": {
"type": "string",
"description": "Smaller text under the headline."
},
"name": {
"type": "string",
"description": "Template name, e.g. \"Lockdown\"."
},
"headline": {
"type": "string",
"description": "Text shown over the content."
},
"prestage": {
"type": "boolean",
"description": "true caches the content on every in-scope screen now, so it shows at once when fired."
},
"severity": {
"enum": [
"info",
"warning",
"critical"
],
"type": "string",
"description": "info, warning or critical."
},
"contentId": {
"type": "string",
"description": "Id of that content (list_items)."
},
"scopeKind": {
"enum": [
"all",
"node",
"screens"
],
"type": "string",
"description": "Which screens it takes over: all, node (one location and below) or screens."
},
"contentKind": {
"enum": [
"media",
"creative",
"playlist",
"app"
],
"type": "string",
"description": "Kind of content to show: media, playlist, app or creative."
},
"scopeNodeId": {
"type": "string",
"description": "With scopeKind node: the location id."
}
}
},
"maxItems": 50,
"description": "Pre-armed emergency takeovers (Lockdown, Fire drill, …), max 50. Fire one with start_takeover emergencyTemplateId."
}
}
},
"outputSchema": {
"type": "object",
"properties": {
"kind": {
"type": [
"string",
"null"
],
"description": "The kind created."
},
"failed": {
"type": [
"integer",
"null"
],
"description": "One-by-one kinds: how many failed."
},
"created": {
"type": "array",
"items": {
"type": "object"
},
"description": "Bulk kinds: the new records with their ids."
},
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"ok": {
"type": [
"boolean",
"null"
],
"description": "true when this one succeeded."
},
"error": {
"type": [
"string",
"null"
],
"description": "Why this one failed, with the next step to take (present when not ok)."
},
"label": {
"type": [
"string",
"null"
],
"description": "The id, or the item's name (or #position) for a create."
},
"result": {
"type": "object",
"description": "The record as the API returned it (present when ok)."
}
}
},
"description": "One row per id or item, in the order given."
},
"succeeded": {
"type": [
"integer",
"null"
],
"description": "One-by-one kinds: how many were created."
}
},
"description": "Bulk kinds return the bulk result (ids of what was created); one-by-one kinds return one row per item."
},
"annotations": {
"title": "Create items",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
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. Optional: limit (at most N rows) and filters (only rows where a column is / contains / is greater than a value), for example "only the active offers, at most 10". 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"]}}.
The description explains the capability, when to use it, and what to expect.
Inputs82/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
kind
Kind of the ids.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
ids
Item ids.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › name
New name. Every kind.
Clear enough to supply this argument.
changes › description
New note. playlists, schedules, screen_groups.
Clear enough to supply this argument.
changes › nodeId
Move to this location (list_items kind locations); null = workspace root. screens (refused when what it plays needs approval there), playlists, schedules, layouts, creatives, apps, data_sources, media, media_folders.
Clear enough to supply this argument.
changes › parentId
New parent. locations (a move re-paths every location under it), media_folders.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › externalId
Location ID (store number), unique per workspace. locations.
Clear enough to supply this argument.
changes › tags
Tags. screens, media.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › rotation
Degrees clockwise: 0, 90, 180 or 270. screens.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › timezone
IANA zone, e.g. "America/Chicago"; schedule times follow it. screens, schedules.
Clear enough to supply this argument.
changes › closed
true closes the alert by hand (the alert evaluator also closes it when the screen recovers). alerts.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › replaceDeviceCode
The 6-digit pairing code a NEW device shows; it takes over this screen with its name, content and location, and the old device is released. screens.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › operatingHours
Weekly on and off hours, the shape get_items kind screens returns; null = always on. screens.
Clear enough to supply this argument.
changes › shuffle
true plays items in random order. playlists.
Clear enough to supply this argument.
changes › fullscreen
Inside a layout, every item fills the whole screen. playlists.
Clear enough to supply this argument.
changes › transition
Change between items: "fade" crossfades, "slide-left"/"slide-right"/"slide-up"/"slide-down" push the next item in from that side, "zoom" fades it in from slightly larger; "none" or null cuts. Refused (feature_disabled) where the workspace does not have playlist transitions yet. playlists.
Clear enough to supply this argument.
changes › transitionMs
How long the transition runs, in ms (200–1500); null = the default 450. Needs a transition. playlists.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › startsAt
ISO 8601 time it starts airing; null clears. playlists.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › expiresAt
ISO 8601 time it stops airing; null clears. playlists, media.
Clear enough to supply this argument.
changes › appendItems › items › refKind
Kind of content refId names (playlist = a nested playlist, creative = a design).
Clear enough to supply this argument.
changes › appendItems › items › refId
Content id in THIS workspace (list_items kind media, apps, playlists, layouts or creatives).
Clear enough to supply this argument.
changes › appendItems › items › durationSeconds
Seconds this item shows. Omit to use the content's default.
Clear enough to supply this argument.
changes › appendItems › items › fit
How this slot fills the screen. Omit or null to follow the file's own setting.
Clear enough to supply this argument.
changes › appendItems › items › fullscreen
When this playlist plays inside a layout, this item fills the whole screen and the other zones hide while it plays. Default false.
Clear enough to supply this argument.
changes › patchItems › items › itemId
Playlist item id (pli_…), from get_items kind playlists.
Clear enough to supply this argument.
changes › patchItems › items › durationSeconds
Seconds the item shows when durationMode is fixed.
Clear enough to supply this argument.
changes › patchItems › items › durationMode
fixed = durationSeconds; full = the video's own length; live = stays on with no timer (live web page); loop = loopCount plays of an animated file; manual = holds until someone presses a bound key.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › patchItems › items › loopCount
With durationMode loop: how many times the animated file plays before the next item.
Clear enough to supply this argument.
changes › patchItems › items › fit
How this slot fills the screen. Send null to clear the override and follow the file's own setting.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › patchItems › items › fullscreen
When this playlist plays inside a layout, this item fills the whole screen and the other zones hide while it plays.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › removeItemIds
Item ids (pli_…) to remove, max 50 per call. An id that is already gone is ignored.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › reorderItemIds
The COMPLETE item order after the move — unknown ids are dropped, the rest keep this sequence.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › addBlocks › items › daysOfWeek
0 = Sunday … 6 = Saturday.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › addBlocks › items › startTime
HH:MM, e.g. "07:00".
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › addBlocks › items › endTime
HH:MM, e.g. "11:00".
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › addBlocks › items › refKind
Kind of content refId names: playlist, media, app, layout or creative.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › addBlocks › items › refId
Content id in this workspace.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › addBlocks › items › label
Block name shown in the console, e.g. "Breakfast".
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › addBlocks › items › priority
Higher wins where blocks overlap; default 0.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › addBlocks › items › startDate
YYYY-MM-DD first day; omit for no start.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › addBlocks › items › endDate
YYYY-MM-DD last day; omit for no end.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › patchBlocks › items › blockId
Block id (sb_…) from get_items kind schedules.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › removeBlockIds
Block ids to remove. schedules.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › addScreenIds
Screens to add (list_items kind screens); ids out of reach are skipped. screen_groups.
Clear enough to supply this argument.
changes › removeScreenIds
Screens to take out; the screens themselves do not change. screen_groups.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › folderId
Move to this folder; null = library root. media.
Clear enough to supply this argument.
changes › altText
Accessibility text for an image or video; null clears. media.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › fit
How the file fills a screen or zone: contain (bars), blur-fill (blurred bars), cover (crops) or fill (stretches). media.
Clear enough to supply this argument.
changes › autoArchiveOnExpiry
true moves the file to the recycle bin when it expires. media.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › showOnly
Web links: CSS selector of the one part of the page to show, e.g. "#timetable"; empty string shows the whole page. Prefer an id; class names change. media.
Clear enough to supply this argument.
changes › autoScrollPxPerSec
Web links: scroll a long page at this speed; 0 stops. media.
Clear enough to supply this argument.
changes › refreshSeconds
Web links: reload the page this often; 0 = never. media.
Clear enough to supply this argument.
changes › renderWidth
Web links: browser width in pixels, default 1920. media.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › renderHeight
Web links: browser height in pixels, default 1080. media.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › resolution › w
Width in pixels.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › resolution › h
Height in pixels.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › zones
All zones of the layout. layouts.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › theme
{ source: "brand", mode?, radius? } or null. layouts.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › autoFullscreenForVideo
A video in any zone fills the whole screen while it plays. layouts.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › boxes
All layers of the creative, same box shape as create_items creatives. creatives.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › backgroundUrl
Background image URL. creatives.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › dataSourceId
Data source (ds_… from list_items kind data_sources) that the field, list and row layers read. creatives.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › repeat › over
What it repeats over: the rows of the data source.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › repeat › secondsPerRow
How long each row stays up, 3 to 3600 seconds; default 12.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › repeat › limit
Show at most this many rows (after the filters), from the top of the sheet; null = every row.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › repeat › filters › items › column
The sheet's column name, as in its first row.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › repeat › filters › items › value
What to compare with. Not used by empty / not_empty.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › useEachRow
true moves every binding on the sheet's first row (rows.0.column) to the current row (row.column), including a header with spaces or accents; other rows.N stay. Same as Use each row in the console. Needs a repeat, set here or already on the design. creatives.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › localText
This location's own text on a creative shared to it, box id → text, e.g. {"tacos-birria-tacos-price":"$14.49"}; null puts the owner's text back. Only boxes the owner left editable (get_items shows each box's shareLock); other edits are refused. Boxes not named keep their local text. creatives.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › localAt
With localText: the location (list_items kind locations) whose text this is; omit for the whole workspace. creatives.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › shareWithWorkspaces
Child workspace ids to share this creative with, live: they play it and see every change you make, and may only change what its boxes' shareLock allows. creatives.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › config
All settings of the app or feed, as get_items returned them, with no new sign-in values. apps, data_sources.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › contentKind
emergency_templates: kind of content to show.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › contentId
emergency_templates: id of that content.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › scopeKind
emergency_templates: all, node or screens.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › scopeNodeId
emergency_templates: with scopeKind node, the location id.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › severity
emergency_templates.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › headline
emergency_templates: text over the content.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › body
emergency_templates: smaller text under the headline.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
changes › prestage
emergency_templates: cache the content on screens now.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"properties": {
"kind": {
"type": [
"string",
"null"
],
"description": "The kind changed."
},
"failed": {
"type": [
"integer",
"null"
],
"description": "How many stopped at a failed step."
},
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"ok": {
"type": [
"boolean",
"null"
],
"description": "true when every step applied."
},
"error": {
"type": [
"string",
"null"
],
"description": "The step that failed, why, and what stayed applied (present when not ok)."
},
"label": {
"type": [
"string",
"null"
],
"description": "The id."
},
"result": {
"type": "object",
"description": "The item as it is now, read after the change (present when ok)."
},
"applied": {
"type": "array",
"items": {
"type": [
"string",
"null"
]
},
"description": "Steps applied for this id, in order."
}
}
},
"description": "One row per id, in the order given."
},
"succeeded": {
"type": [
"integer",
"null"
],
"description": "How many items changed fully."
}
}
}
Original tool metadata
{
"name": "update_items",
"title": "Change items",
"description": "Change existing items of one kind, the same changes on every id.\n\nWhen to use:\n- 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.\n- Turning Repeat for each row on, changing its seconds or turning it off on a creative (repeat, useEachRow).\n- 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.\n\nWhen NOT to use:\n- Showing content on screens: use set_screen_content.\n- New items: use create_items. Removing: use delete_items.\n\nWhat to know:\n- 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.\n- Content that airs where review is required goes back to draft. Needs the kind's edit permission (screen moves: at both locations).\n- 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.\n- 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. Optional: limit (at most N rows) and filters (only rows where a column is / contains / is greater than a value), for example \"only the active offers, at most 10\". A workspace without this feature refuses it with 403 feature_disabled and saves nothing, so tell the person instead of retrying.\n- 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.\n- 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.\n- A picture cell must be a plain https address; anything else leaves that box empty on that slide.\n- 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.\n- 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.\n- 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.\n\nParameters:\n- 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.\n- 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.\n- 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.\n- Example: {kind:\"screens\", ids:[\"scr_lobby7\", \"scr_lobby8\"], changes:{nodeId:\"on_store12\", tags:[\"lobby\"]}}.",
"inputSchema": {
"type": "object",
"required": [
"kind",
"ids",
"changes"
],
"properties": {
"ids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 50,
"minItems": 1,
"description": "Item ids."
},
"kind": {
"enum": [
"screens",
"media",
"playlists",
"schedules",
"layouts",
"creatives",
"apps",
"data_sources",
"screen_groups",
"locations",
"media_folders",
"emergency_templates",
"alerts"
],
"type": "string",
"description": "Kind of the ids."
},
"changes": {
"type": "object",
"properties": {
"fit": {
"enum": [
"contain",
"blur-fill",
"cover",
"fill"
],
"type": "string",
"description": "How the file fills a screen or zone: contain (bars), blur-fill (blurred bars), cover (crops) or fill (stretches). media."
},
"body": {
"type": "string",
"description": "emergency_templates: smaller text under the headline."
},
"name": {
"type": "string",
"description": "New name. Every kind."
},
"tags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Tags. screens, media."
},
"boxes": {
"type": "array",
"items": {
"type": "object"
},
"description": "All layers of the creative, same box shape as create_items creatives. creatives."
},
"theme": {
"type": [
"object",
"null"
],
"description": "{ source: \"brand\", mode?, radius? } or null. layouts."
},
"zones": {
"type": "array",
"items": {
"type": "object"
},
"description": "All zones of the layout. layouts."
},
"closed": {
"enum": [
true
],
"type": "boolean",
"description": "true closes the alert by hand (the alert evaluator also closes it when the screen recovers). alerts."
},
"config": {
"type": "object",
"description": "All settings of the app or feed, as get_items returned them, with no new sign-in values. apps, data_sources."
},
"nodeId": {
"type": [
"string",
"null"
],
"description": "Move to this location (list_items kind locations); null = workspace root. screens (refused when what it plays needs approval there), playlists, schedules, layouts, creatives, apps, data_sources, media, media_folders."
},
"repeat": {
"type": [
"object",
"null"
],
"required": [
"over"
],
"properties": {
"over": {
"enum": [
"rows"
],
"type": "string",
"description": "What it repeats over: the rows of the data source."
},
"limit": {
"type": [
"integer",
"null"
],
"maximum": 200,
"minimum": 1,
"description": "Show at most this many rows (after the filters), from the top of the sheet; null = every row."
},
"filters": {
"type": [
"array",
"null"
],
"items": {
"type": "object",
"required": [
"column",
"op"
],
"properties": {
"op": {
"enum": [
"is",
"is_not",
"contains",
"not_contains",
"empty",
"not_empty",
"gt",
"lt"
],
"type": "string",
"description": "is, is_not, contains, not_contains, empty, not_empty, gt (greater than), lt (less than)."
},
"value": {
"type": [
"string",
"number"
],
"description": "What to compare with. Not used by empty / not_empty."
},
"column": {
"type": "string",
"description": "The sheet's column name, as in its first row."
}
}
},
"maxItems": 5,
"description": "Only rows that match EVERY filter play, in sheet order. Text compares ignore case, accents and outer spaces; gt/lt compare numbers (\"1 200,50 €\" reads 1200.5) and skip a cell with no number. Example: [{column:\"Actif\", op:\"is\", value:\"oui\"}]. null or [] = no filter."
},
"secondsPerRow": {
"type": "number",
"maximum": 3600,
"minimum": 3,
"description": "How long each row stays up, 3 to 3600 seconds; default 12."
}
},
"description": "Repeat for each row: {over:\"rows\", secondsPerRow:12, limit:10, filters:[{column:\"Actif\", op:\"is\", value:\"oui\"}]}; null turns it off. A value out of range or an unknown field is refused. creatives."
},
"altText": {
"type": [
"string",
"null"
],
"description": "Accessibility text for an image or video; null clears. media."
},
"localAt": {
"type": [
"string",
"null"
],
"description": "With localText: the location (list_items kind locations) whose text this is; omit for the whole workspace. creatives."
},
"shuffle": {
"type": "boolean",
"description": "true plays items in random order. playlists."
},
"folderId": {
"type": [
"string",
"null"
],
"description": "Move to this folder; null = library root. media."
},
"headline": {
"type": "string",
"description": "emergency_templates: text over the content."
},
"parentId": {
"type": [
"string",
"null"
],
"description": "New parent. locations (a move re-paths every location under it), media_folders."
},
"prestage": {
"type": "boolean",
"description": "emergency_templates: cache the content on screens now."
},
"rotation": {
"enum": [
0,
90,
180,
270
],
"type": "integer",
"description": "Degrees clockwise: 0, 90, 180 or 270. screens."
},
"severity": {
"enum": [
"info",
"warning",
"critical"
],
"type": "string",
"description": "emergency_templates."
},
"showOnly": {
"type": "string",
"description": "Web links: CSS selector of the one part of the page to show, e.g. \"#timetable\"; empty string shows the whole page. Prefer an id; class names change. media."
},
"startsAt": {
"type": [
"string",
"null"
],
"description": "ISO 8601 time it starts airing; null clears. playlists."
},
"timezone": {
"type": "string",
"description": "IANA zone, e.g. \"America/Chicago\"; schedule times follow it. screens, schedules."
},
"addBlocks": {
"type": "array",
"items": {
"type": "object",
"required": [
"daysOfWeek",
"startTime",
"endTime",
"refKind",
"refId"
],
"properties": {
"label": {
"type": "string",
"description": "Block name shown in the console, e.g. \"Breakfast\"."
},
"refId": {
"type": "string",
"description": "Content id in this workspace."
},
"endDate": {
"type": "string",
"description": "YYYY-MM-DD last day; omit for no end."
},
"endTime": {
"type": "string",
"description": "HH:MM, e.g. \"11:00\"."
},
"refKind": {
"type": "string",
"description": "Kind of content refId names: playlist, media, app, layout or creative."
},
"priority": {
"type": "integer",
"maximum": 1000,
"minimum": 0,
"description": "Higher wins where blocks overlap; default 0."
},
"startDate": {
"type": "string",
"description": "YYYY-MM-DD first day; omit for no start."
},
"startTime": {
"type": "string",
"description": "HH:MM, e.g. \"07:00\"."
},
"daysOfWeek": {
"type": "array",
"items": {
"type": "integer",
"maximum": 6,
"minimum": 0
},
"description": "0 = Sunday … 6 = Saturday."
}
}
},
"maxItems": 50,
"description": "Time blocks to add. schedules. Times are HH:MM 24-hour in the screen's timezone."
},
"contentId": {
"type": "string",
"description": "emergency_templates: id of that content."
},
"expiresAt": {
"type": [
"string",
"null"
],
"description": "ISO 8601 time it stops airing; null clears. playlists, media."
},
"localText": {
"type": "object",
"description": "This location's own text on a creative shared to it, box id → text, e.g. {\"tacos-birria-tacos-price\":\"$14.49\"}; null puts the owner's text back. Only boxes the owner left editable (get_items shows each box's shareLock); other edits are refused. Boxes not named keep their local text. creatives.",
"additionalProperties": {
"type": [
"string",
"null"
]
}
},
"scopeKind": {
"enum": [
"all",
"node",
"screens"
],
"type": "string",
"description": "emergency_templates: all, node or screens."
},
"externalId": {
"type": "string",
"description": "Location ID (store number), unique per workspace. locations."
},
"fullscreen": {
"type": "boolean",
"description": "Inside a layout, every item fills the whole screen. playlists."
},
"patchItems": {
"type": "array",
"items": {
"type": "object",
"required": [
"itemId"
],
"properties": {
"fit": {
"enum": [
"contain",
"cover",
"fill",
"blur-fill",
null
],
"type": [
"string",
"null"
],
"description": "How this slot fills the screen. Send null to clear the override and follow the file's own setting."
},
"itemId": {
"type": "string",
"description": "Playlist item id (pli_…), from get_items kind playlists."
},
"loopCount": {
"type": "integer",
"minimum": 1,
"description": "With durationMode loop: how many times the animated file plays before the next item."
},
"fullscreen": {
"type": "boolean",
"description": "When this playlist plays inside a layout, this item fills the whole screen and the other zones hide while it plays."
},
"durationMode": {
"enum": [
"fixed",
"full",
"live",
"loop",
"manual"
],
"type": "string",
"description": "fixed = durationSeconds; full = the video's own length; live = stays on with no timer (live web page); loop = loopCount plays of an animated file; manual = holds until someone presses a bound key."
},
"durationSeconds": {
"type": "number",
"minimum": 1,
"description": "Seconds the item shows when durationMode is fixed."
}
}
},
"maxItems": 50,
"description": "Changes to existing items, max 50 per call. Only the fields given change."
},
"resolution": {
"type": "object",
"required": [
"w",
"h"
],
"properties": {
"h": {
"type": "integer",
"minimum": 1,
"description": "Height in pixels."
},
"w": {
"type": "integer",
"minimum": 1,
"description": "Width in pixels."
}
},
"description": "Canvas size in pixels, e.g. {w:1080, h:1920} for portrait. layouts."
},
"transition": {
"enum": [
"none",
"fade",
"slide-left",
"slide-right",
"slide-up",
"slide-down",
"zoom",
null
],
"type": [
"string",
"null"
],
"description": "Change between items: \"fade\" crossfades, \"slide-left\"/\"slide-right\"/\"slide-up\"/\"slide-down\" push the next item in from that side, \"zoom\" fades it in from slightly larger; \"none\" or null cuts. Refused (feature_disabled) where the workspace does not have playlist transitions yet. playlists."
},
"useEachRow": {
"type": "boolean",
"description": "true moves every binding on the sheet's first row (rows.0.column) to the current row (row.column), including a header with spaces or accents; other rows.N stay. Same as Use each row in the console. Needs a repeat, set here or already on the design. creatives."
},
"appendItems": {
"type": "array",
"items": {
"type": "object",
"required": [
"refKind",
"refId"
],
"properties": {
"fit": {
"enum": [
"contain",
"cover",
"fill",
"blur-fill",
null
],
"type": [
"string",
"null"
],
"description": "How this slot fills the screen. Omit or null to follow the file's own setting."
},
"refId": {
"type": "string",
"description": "Content id in THIS workspace (list_items kind media, apps, playlists, layouts or creatives)."
},
"refKind": {
"enum": [
"media",
"playlist",
"app",
"layout",
"ad-slot",
"creative"
],
"type": "string",
"description": "Kind of content refId names (playlist = a nested playlist, creative = a design)."
},
"fullscreen": {
"type": "boolean",
"description": "When this playlist plays inside a layout, this item fills the whole screen and the other zones hide while it plays. Default false."
},
"durationSeconds": {
"type": "number",
"minimum": 1,
"description": "Seconds this item shows. Omit to use the content's default."
}
}
},
"maxItems": 50,
"description": "Items to add at the end of the playlist, in order, max 50 per call."
},
"contentKind": {
"enum": [
"media",
"creative",
"playlist",
"app"
],
"type": "string",
"description": "emergency_templates: kind of content to show."
},
"description": {
"type": "string",
"description": "New note. playlists, schedules, screen_groups."
},
"patchBlocks": {
"type": "array",
"items": {
"type": "object",
"required": [
"blockId"
],
"properties": {
"blockId": {
"type": "string",
"description": "Block id (sb_…) from get_items kind schedules."
}
}
},
"maxItems": 50,
"description": "Edits to existing blocks: blockId plus only the block fields to change (same fields as addBlocks). schedules."
},
"renderWidth": {
"type": "number",
"minimum": 320,
"description": "Web links: browser width in pixels, default 1920. media."
},
"scopeNodeId": {
"type": "string",
"description": "emergency_templates: with scopeKind node, the location id."
},
"addScreenIds": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 5000,
"minItems": 1,
"description": "Screens to add (list_items kind screens); ids out of reach are skipped. screen_groups."
},
"dataSourceId": {
"type": "string",
"description": "Data source (ds_… from list_items kind data_sources) that the field, list and row layers read. creatives."
},
"renderHeight": {
"type": "number",
"minimum": 240,
"description": "Web links: browser height in pixels, default 1080. media."
},
"transitionMs": {
"type": [
"integer",
"null"
],
"maximum": 1500,
"minimum": 200,
"description": "How long the transition runs, in ms (200–1500); null = the default 450. Needs a transition. playlists."
},
"backgroundUrl": {
"type": "string",
"description": "Background image URL. creatives."
},
"removeItemIds": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 50,
"description": "Item ids (pli_…) to remove, max 50 per call. An id that is already gone is ignored."
},
"operatingHours": {
"type": [
"object",
"null"
],
"description": "Weekly on and off hours, the shape get_items kind screens returns; null = always on. screens."
},
"refreshSeconds": {
"type": "number",
"minimum": 0,
"description": "Web links: reload the page this often; 0 = never. media."
},
"removeBlockIds": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 50,
"description": "Block ids to remove. schedules."
},
"reorderItemIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "The COMPLETE item order after the move — unknown ids are dropped, the rest keep this sequence."
},
"removeScreenIds": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 5000,
"minItems": 1,
"description": "Screens to take out; the screens themselves do not change. screen_groups."
},
"replaceDeviceCode": {
"type": "string",
"pattern": "^[0-9]{6}$",
"description": "The 6-digit pairing code a NEW device shows; it takes over this screen with its name, content and location, and the old device is released. screens."
},
"autoScrollPxPerSec": {
"type": "number",
"minimum": 0,
"description": "Web links: scroll a long page at this speed; 0 stops. media."
},
"autoArchiveOnExpiry": {
"type": "boolean",
"description": "true moves the file to the recycle bin when it expires. media."
},
"shareWithWorkspaces": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 50,
"description": "Child workspace ids to share this creative with, live: they play it and see every change you make, and may only change what its boxes' shareLock allows. creatives."
},
"autoFullscreenForVideo": {
"type": "boolean",
"description": "A video in any zone fills the whole screen while it plays. layouts."
}
},
"description": "Fields to change."
}
}
},
"outputSchema": {
"type": "object",
"properties": {
"kind": {
"type": [
"string",
"null"
],
"description": "The kind changed."
},
"failed": {
"type": [
"integer",
"null"
],
"description": "How many stopped at a failed step."
},
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"ok": {
"type": [
"boolean",
"null"
],
"description": "true when every step applied."
},
"error": {
"type": [
"string",
"null"
],
"description": "The step that failed, why, and what stayed applied (present when not ok)."
},
"label": {
"type": [
"string",
"null"
],
"description": "The id."
},
"result": {
"type": "object",
"description": "The item as it is now, read after the change (present when ok)."
},
"applied": {
"type": "array",
"items": {
"type": [
"string",
"null"
]
},
"description": "Steps applied for this id, in order."
}
}
},
"description": "One row per id, in the order given."
},
"succeeded": {
"type": [
"integer",
"null"
],
"description": "How many items changed fully."
}
}
},
"annotations": {
"title": "Change items",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
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"]}.
The description explains the capability, when to use it, and what to expect.
Inputs69/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
kind
Kind of the ids.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
ids
Item ids.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
permanent
Erase for good.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
confirmCode
Code from the first call.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"properties": {
"kind": {
"type": [
"string",
"null"
],
"description": "The kind that was acted on."
},
"next": {
"type": [
"string",
"null"
],
"description": "Preview call: what to do next."
},
"erased": {
"type": [
"integer",
"null"
],
"description": "How many items were erased for good (0 on the first, preview call)."
},
"failed": {
"type": [
"integer",
"null"
],
"description": "How many failed; the rest still ran."
},
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"ok": {
"type": [
"boolean",
"null"
],
"description": "true when this one succeeded."
},
"error": {
"type": [
"string",
"null"
],
"description": "Why this one failed, with the next step to take (present when not ok)."
},
"label": {
"type": [
"string",
"null"
],
"description": "The id, or the item's name (or #position) for a create."
},
"result": {
"type": "object",
"description": "The record as the API returned it (present when ok)."
}
}
},
"description": "One row per id or item, in the order given."
},
"permanent": {
"type": [
"boolean",
"null"
],
"description": "true for a permanent delete."
},
"succeeded": {
"type": [
"integer",
"null"
],
"description": "How many ids or items succeeded."
},
"wouldErase": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": [
"string",
"null"
],
"description": "Item id."
},
"name": {
"type": [
"string",
"null"
],
"description": "Item name."
},
"found": {
"type": [
"boolean",
"null"
],
"description": "false when it is already in the recycle bin or not found."
}
}
},
"description": "Preview call: the items that would be erased."
},
"confirmCode": {
"type": [
"string",
"null"
],
"description": "Preview call: send this on the second call, after the person says yes."
}
}
}
Original tool metadata
{
"name": "delete_items",
"title": "Delete items",
"description": "Delete items of one kind into the 30-day recycle bin.\n\nWhen to use:\n- The person has confirmed what should go (show it with list_items or get_items first).\n\nWhen NOT to use:\n- Taking a screen out of a group: use update_items removeScreenIds.\n- Stopping a takeover: use end_takeover.\n\nWhat to know:\n- 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.\n- 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.\n\nParameters:\n- kind and ids: every id must be of that kind.\n- permanent: true erases for good instead (recycle-bin kinds only). The first call deletes nothing and returns wouldErase and a confirmCode.\n- 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.\n- Example: {kind:\"playlists\", ids:[\"pl_8f2c\"]}.",
"inputSchema": {
"type": "object",
"required": [
"kind",
"ids"
],
"properties": {
"ids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 50,
"minItems": 1,
"description": "Item ids."
},
"kind": {
"enum": [
"screens",
"media",
"playlists",
"schedules",
"layouts",
"creatives",
"apps",
"data_sources",
"screen_groups",
"locations",
"media_folders",
"emergency_templates"
],
"type": "string",
"description": "Kind of the ids."
},
"permanent": {
"type": "boolean",
"description": "Erase for good."
},
"confirmCode": {
"type": "string",
"description": "Code from the first call."
}
}
},
"outputSchema": {
"type": "object",
"properties": {
"kind": {
"type": [
"string",
"null"
],
"description": "The kind that was acted on."
},
"next": {
"type": [
"string",
"null"
],
"description": "Preview call: what to do next."
},
"erased": {
"type": [
"integer",
"null"
],
"description": "How many items were erased for good (0 on the first, preview call)."
},
"failed": {
"type": [
"integer",
"null"
],
"description": "How many failed; the rest still ran."
},
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"ok": {
"type": [
"boolean",
"null"
],
"description": "true when this one succeeded."
},
"error": {
"type": [
"string",
"null"
],
"description": "Why this one failed, with the next step to take (present when not ok)."
},
"label": {
"type": [
"string",
"null"
],
"description": "The id, or the item's name (or #position) for a create."
},
"result": {
"type": "object",
"description": "The record as the API returned it (present when ok)."
}
}
},
"description": "One row per id or item, in the order given."
},
"permanent": {
"type": [
"boolean",
"null"
],
"description": "true for a permanent delete."
},
"succeeded": {
"type": [
"integer",
"null"
],
"description": "How many ids or items succeeded."
},
"wouldErase": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": [
"string",
"null"
],
"description": "Item id."
},
"name": {
"type": [
"string",
"null"
],
"description": "Item name."
},
"found": {
"type": [
"boolean",
"null"
],
"description": "false when it is already in the recycle bin or not found."
}
}
},
"description": "Preview call: the items that would be erased."
},
"confirmCode": {
"type": [
"string",
"null"
],
"description": "Preview call: send this on the second call, after the person says yes."
}
}
},
"annotations": {
"title": "Delete items",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
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"]}.
The description explains the capability, when to use it, and what to expect.
Inputs69/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
kind
Kind of the ids.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
ids
Deleted item ids.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"properties": {
"kind": {
"type": [
"string",
"null"
],
"description": "The kind that was acted on."
},
"failed": {
"type": [
"integer",
"null"
],
"description": "How many failed; the rest still ran."
},
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"ok": {
"type": [
"boolean",
"null"
],
"description": "true when this one succeeded."
},
"error": {
"type": [
"string",
"null"
],
"description": "Why this one failed, with the next step to take (present when not ok)."
},
"label": {
"type": [
"string",
"null"
],
"description": "The id, or the item's name (or #position) for a create."
},
"result": {
"type": "object",
"description": "The record as the API returned it (present when ok)."
}
}
},
"description": "One row per id or item, in the order given."
},
"succeeded": {
"type": [
"integer",
"null"
],
"description": "How many ids or items succeeded."
}
}
}
Original tool metadata
{
"name": "restore_items",
"title": "Restore deleted items",
"description": "Bring back deleted items of one kind from the 30-day recycle bin.\n\nWhen to use:\n- Undoing delete_items.\n\nWhen NOT to use:\n- Items deleted more than 30 days ago: they are gone and report not found.\n\nWhat to know:\n- 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.\n\nParameters:\n- kind: the list_items kind name, so a recycle_bin row of kind playlist is restored with kind playlists.\n- 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.\n- Example: {kind:\"playlists\", ids:[\"pl_8f2c\"]}.",
"inputSchema": {
"type": "object",
"required": [
"kind",
"ids"
],
"properties": {
"ids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 50,
"minItems": 1,
"description": "Deleted item ids."
},
"kind": {
"enum": [
"screens",
"media",
"playlists",
"schedules",
"layouts",
"creatives",
"apps",
"data_sources",
"media_folders",
"screen_groups"
],
"type": "string",
"description": "Kind of the ids."
}
}
},
"outputSchema": {
"type": "object",
"properties": {
"kind": {
"type": [
"string",
"null"
],
"description": "The kind that was acted on."
},
"failed": {
"type": [
"integer",
"null"
],
"description": "How many failed; the rest still ran."
},
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"ok": {
"type": [
"boolean",
"null"
],
"description": "true when this one succeeded."
},
"error": {
"type": [
"string",
"null"
],
"description": "Why this one failed, with the next step to take (present when not ok)."
},
"label": {
"type": [
"string",
"null"
],
"description": "The id, or the item's name (or #position) for a create."
},
"result": {
"type": "object",
"description": "The record as the API returned it (present when ok)."
}
}
},
"description": "One row per id or item, in the order given."
},
"succeeded": {
"type": [
"integer",
"null"
],
"description": "How many ids or items succeeded."
}
}
},
"annotations": {
"title": "Restore deleted items",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
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"}.
The description explains the capability, when to use it, and what to expect.
Inputs57/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
screenId
Screen id.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
screenIds
Screen ids.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
nodeId
Location id.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
contentKind
Content kind.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contentId
Content id.
Explain the meaning of this value, not just its name.
{
"type": "object",
"properties": {
"data": {
"type": "object",
"description": "Single-screen call: the screen as it is now."
},
"changed": {
"type": "array",
"items": {
"type": [
"string",
"null"
]
},
"description": "Screen ids whose content changed."
},
"notShared": {
"type": [
"integer",
"null"
],
"description": "Screens skipped because the content is not shared to their location."
},
"needsApproval": {
"type": [
"integer",
"null"
],
"description": "Screens skipped because their location needs approval for this content."
}
}
}
Original tool metadata
{
"name": "set_screen_content",
"title": "Assign content to screens",
"description": "Set what screens play by default until it is changed again.\n\nWhen to use:\n- Putting a playlist, schedule, app, media file or creative on one screen, a list, or every screen under a location.\n\nWhen NOT to use:\n- A takeover that ends by itself: use start_takeover.\n- Changing what a playlist contains: use update_items (every screen playing it follows).\n\nWhat to know:\n- 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.\n\nParameters:\n- screenId, screenIds and nodeId (every screen at and under it, up to 1000): give at least one; they combine into one set.\n- contentKind: playlist, schedule, app, media or creative. null clears what plays and needs exactly one screen and no nodeId.\n- contentId: the playlist, schedule, app, media or creative id from list_items; omit only with contentKind null.\n- Example: {nodeId:\"on_ca\", contentKind:\"playlist\", contentId:\"pl_spring\"}.",
"inputSchema": {
"type": "object",
"required": [
"contentKind"
],
"properties": {
"nodeId": {
"type": "string",
"description": "Location id."
},
"screenId": {
"type": "string",
"description": "Screen id."
},
"contentId": {
"type": "string",
"description": "Content id."
},
"screenIds": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 200,
"description": "Screen ids."
},
"contentKind": {
"enum": [
"playlist",
"schedule",
"app",
"media",
"creative",
null
],
"type": [
"string",
"null"
],
"description": "Content kind."
}
}
},
"outputSchema": {
"type": "object",
"properties": {
"data": {
"type": "object",
"description": "Single-screen call: the screen as it is now."
},
"changed": {
"type": "array",
"items": {
"type": [
"string",
"null"
]
},
"description": "Screen ids whose content changed."
},
"notShared": {
"type": [
"integer",
"null"
],
"description": "Screens skipped because the content is not shared to their location."
},
"needsApproval": {
"type": [
"integer",
"null"
],
"description": "Screens skipped because their location needs approval for this content."
}
}
},
"annotations": {
"title": "Assign content to screens",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
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"}.
The description explains the capability, when to use it, and what to expect.
Inputs52/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contentKind
Content kind.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contentId
Content id.
Explain the meaning of this value, not just its name.
emergencyTemplateId
Emergency template id.
Explain the meaning of this value, not just its name.
scopeKind
Which screens.
Explain the meaning of this value, not just its name.
scopeNodeId
Location id.
Explain the meaning of this value, not just its name.
screenIds
Screen ids.
Explain the meaning of this value, not just its name.
expiresAt
End time.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
headline
Listing name, with contentId only.
Explain the meaning of this value, not just its name.
Annotations100/100
All four behavior hints are declared.
{
"title": "Take over screens for a while",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
Output schema90/100
The output schema explains the structured result.
View output schema
{
"type": "object",
"properties": {
"castId": {
"type": [
"string",
"null"
],
"description": "Pass to end_takeover to stop early (an emergency's id starts with emg_)."
},
"expiresAt": {
"type": [
"string",
"null"
],
"description": "When it ends by itself (absent for an emergency)."
},
"screenCount": {
"type": [
"integer",
"null"
],
"description": "How many screens show it."
}
}
}
Original tool metadata
{
"name": "start_takeover",
"title": "Take over screens for a while",
"description": "Show something on screens over their normal content, now.\n\nWhen to use:\n- Existing content for a while (the lunch menu until 2 pm), or a pre-armed emergency.\n\nWhen NOT to use:\n- A lasting change: use set_screen_content.\n\nWhat to know:\n- 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.\n\nParameters:\n- Pass exactly one of: contentId with contentKind (from list_items), or emergencyTemplateId (from list_items kind emergency_templates).\n- scopeKind: all (default, every screen this connection reaches), node with scopeNodeId, or screens with screenIds. An emergency ignores scope and uses its template's.\n- expiresAt: ISO 8601 with offset, default one hour from now.\n- Example: {contentKind:\"playlist\", contentId:\"pl_lunch\", scopeKind:\"node\", scopeNodeId:\"on_store12\", expiresAt:\"2026-10-20T14:00:00-07:00\"}.",
"inputSchema": {
"type": "object",
"properties": {
"headline": {
"type": "string",
"description": "Listing name, with contentId only."
},
"contentId": {
"type": "string",
"description": "Content id."
},
"expiresAt": {
"type": "string",
"description": "End time."
},
"scopeKind": {
"enum": [
"all",
"node",
"screens"
],
"type": "string",
"description": "Which screens."
},
"screenIds": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 500,
"description": "Screen ids."
},
"contentKind": {
"enum": [
"media",
"playlist",
"app",
"creative",
"schedule"
],
"type": "string",
"description": "Content kind."
},
"scopeNodeId": {
"type": "string",
"description": "Location id."
},
"emergencyTemplateId": {
"type": "string",
"description": "Emergency template id."
}
}
},
"outputSchema": {
"type": "object",
"properties": {
"castId": {
"type": [
"string",
"null"
],
"description": "Pass to end_takeover to stop early (an emergency's id starts with emg_)."
},
"expiresAt": {
"type": [
"string",
"null"
],
"description": "When it ends by itself (absent for an emergency)."
},
"screenCount": {
"type": [
"integer",
"null"
],
"description": "How many screens show it."
}
}
},
"annotations": {
"title": "Take over screens for a while",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs50/100
Explain the meaning of this value, not just its name.
castId
Takeover id.
Explain the meaning of this value, not just its name.
Annotations100/100
All four behavior hints are declared.
{
"title": "End a cast or emergency",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
Output schema79/100
The output schema explains the structured result.
View output schema
{
"type": "object",
"properties": {
"castId": {
"type": [
"string",
"null"
],
"description": "The cast that was ended."
},
"alreadyEnded": {
"type": [
"boolean",
"null"
],
"description": "true when it had already ended."
},
"screensReleased": {
"type": [
"integer",
"null"
],
"description": "How many screens went back to normal content."
}
}
}
Original tool metadata
{
"name": "end_takeover",
"title": "End a cast or emergency",
"description": "End a running takeover or emergency on every screen it covers, in one call.\n\nWhen to use:\n- Taking down what start_takeover started, early.\n\nWhen NOT to use:\n- Changing default content: use set_screen_content.\n- Calling once per screen: one call ends it everywhere.\n\nWhat to know:\n- 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).\n\nParameters:\n- 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.",
"inputSchema": {
"type": "object",
"required": [
"castId"
],
"properties": {
"castId": {
"type": "string",
"description": "Takeover id."
}
}
},
"outputSchema": {
"type": "object",
"properties": {
"castId": {
"type": [
"string",
"null"
],
"description": "The cast that was ended."
},
"alreadyEnded": {
"type": [
"boolean",
"null"
],
"description": "true when it had already ended."
},
"screensReleased": {
"type": [
"integer",
"null"
],
"description": "How many screens went back to normal content."
}
}
},
"annotations": {
"title": "End a cast or emergency",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
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}.
The description explains the capability, when to use it, and what to expect.
Inputs65/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
screenId
Screen id.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
view
What to explain.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
days
Days to look back.
Explain what happens when this optional value is omitted.
limit
Most rows.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"properties": {
"guided": {
"type": [
"boolean",
"null"
],
"description": "diagnose: true when the cause is a guess from a checklist, not a reading."
},
"summary": {
"type": [
"string",
"null"
],
"description": "One plain-language sentence answering the view."
},
"screenId": {
"type": [
"string",
"null"
],
"description": "The screen."
}
},
"description": "The view's answer; other fields depend on the view."
}
Original tool metadata
{
"name": "get_screen_status",
"title": "Check one screen's health",
"description": "Explain the state of one screen.\n\nWhen to use:\n- Why a screen shows what it shows, why it is blank or wrong, when it was down, or what its TV did.\n\nWhen NOT to use:\n- A screen's settings, tags or assigned content: use get_items kind screens.\n- Many screens: use get_fleet_report. A picture: use capture_screenshot. A fix: use control_screens.\n\nWhat to know:\n- Reads what the screen already reported and never contacts it, so it answers for offline screens. Needs screen.view.\n\nParameters:\n- screenId: one scr_… id from list_items kind screens.\n- 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).\n- 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.\n- Example: {screenId:\"scr_lobby7\", view:\"outages\", days:7}.",
"inputSchema": {
"type": "object",
"required": [
"screenId",
"view"
],
"properties": {
"days": {
"type": "number",
"minimum": 1,
"description": "Days to look back."
},
"view": {
"enum": [
"why",
"diagnose",
"outages",
"tv"
],
"type": "string",
"description": "What to explain."
},
"limit": {
"type": "number",
"minimum": 1,
"description": "Most rows."
},
"screenId": {
"type": "string",
"description": "Screen id."
}
}
},
"outputSchema": {
"type": "object",
"properties": {
"guided": {
"type": [
"boolean",
"null"
],
"description": "diagnose: true when the cause is a guess from a checklist, not a reading."
},
"summary": {
"type": [
"string",
"null"
],
"description": "One plain-language sentence answering the view."
},
"screenId": {
"type": [
"string",
"null"
],
"description": "The screen."
}
},
"description": "The view's answer; other fields depend on the view."
},
"annotations": {
"title": "Check one screen's health",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs50/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
screenId
Screen id.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
Annotations100/100
All four behavior hints are declared.
{
"title": "Take a screenshot of a screen",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
Output schema74/100
The output schema explains the structured result.
View output schema
{
"type": "object",
"properties": {
"fresh": {
"type": [
"boolean",
"null"
],
"description": "true when the frame was taken after this call."
},
"latestFrameAt": {
"type": [
"string",
"null"
],
"description": "ISO 8601 time the returned frame was taken."
},
"latestFrameUrl": {
"type": [
"string",
"null"
],
"description": "Link to the frame."
},
"latestScreenshotId": {
"type": [
"string",
"null"
],
"description": "Id of the stored frame."
}
}
}
Original tool metadata
{
"name": "capture_screenshot",
"title": "Take a screenshot of a screen",
"description": "Take a new screenshot of one screen and return it as an image; nothing on the screen changes.\n\nWhen to use:\n- Checking what a screen shows, e.g. after set_screen_content or control_screens.\n\nWhen NOT to use:\n- Learning why: use get_screen_status. Polling in a loop.\n\nWhat to know:\n- 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).\n\nParameters:\n- 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.",
"inputSchema": {
"type": "object",
"required": [
"screenId"
],
"properties": {
"screenId": {
"type": "string",
"description": "Screen id."
}
}
},
"outputSchema": {
"type": "object",
"properties": {
"fresh": {
"type": [
"boolean",
"null"
],
"description": "true when the frame was taken after this call."
},
"latestFrameAt": {
"type": [
"string",
"null"
],
"description": "ISO 8601 time the returned frame was taken."
},
"latestFrameUrl": {
"type": [
"string",
"null"
],
"description": "Link to the frame."
},
"latestScreenshotId": {
"type": [
"string",
"null"
],
"description": "Id of the stored frame."
}
}
},
"annotations": {
"title": "Take a screenshot of a screen",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
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"]}.
The description explains the capability, when to use it, and what to expect.
Inputs65/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
action
Device action.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
screenId
Screen id.
Explain the meaning of this value, not just its name.
screenIds
Screen ids.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations100/100
All four behavior hints are declared.
{
"title": "Restart, reload or power screens",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
Output schema76/100
The output schema explains the structured result.
View output schema
{
"type": "object",
"properties": {
"queued": {
"type": [
"integer",
"null"
],
"description": "How many screens the action was sent to."
},
"skipped": {
"type": [
"integer",
"null"
],
"description": "Screens skipped as out of reach."
},
"commandIds": {
"type": "array",
"items": {
"type": [
"string",
"null"
]
},
"description": "Ids of the queued commands."
}
}
}
Original tool metadata
{
"name": "control_screens",
"title": "Restart, reload or power screens",
"description": "Send a device action to one or many screens.\n\nWhen to use:\n- A change has not appeared, a screen is frozen, an old or broken file keeps playing, or the TV must go on or off.\n\nWhen NOT to use:\n- Changing content: use set_screen_content. New data from a feed or web page: use refresh_data.\n\nWhat to know:\n- Devices act within seconds; offline ones act when they come back. Check the result with capture_screenshot. Needs screen.edit.\n\nParameters:\n- 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).\n- 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.\n- Example: {action:\"refresh\", screenIds:[\"scr_7\", \"scr_8\"]}.",
"inputSchema": {
"type": "object",
"required": [
"action"
],
"properties": {
"action": {
"enum": [
"refresh",
"reboot",
"clear_cache",
"tv_on",
"tv_off"
],
"type": "string",
"description": "Device action."
},
"screenId": {
"type": "string",
"description": "Screen id."
},
"screenIds": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 200,
"description": "Screen ids."
}
}
},
"outputSchema": {
"type": "object",
"properties": {
"queued": {
"type": [
"integer",
"null"
],
"description": "How many screens the action was sent to."
},
"skipped": {
"type": [
"integer",
"null"
],
"description": "Screens skipped as out of reach."
},
"commandIds": {
"type": "array",
"items": {
"type": [
"string",
"null"
]
},
"description": "Ids of the queued commands."
}
}
},
"annotations": {
"title": "Restart, reload or power screens",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
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."}.
The description explains the capability, when to use it, and what to expect.
Inputs58/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
approvalId
Approval request id.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
decision
Approve, reject or withdraw.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
reason
Why.
Explain the meaning of this value, not just its name.
Describe the returned fields so an agent can interpret the result.
View output schema
{
"type": "object",
"properties": {
"data": {
"type": "object",
"description": "The request with its new state and who decided."
}
}
}
Original tool metadata
{
"name": "review_approval",
"title": "Approve, reject or withdraw content",
"description": "Approve, reject or withdraw one pending approval request.\n\nWhen to use:\n- This connection's person is an approver and a request is waiting (list_items kind approvals; read it with get_items kind approvals).\n- Cancelling a request that is no longer wanted, or one left behind by a person who has gone: withdraw.\n\nWhen NOT to use:\n- Editing the content: use update_items (an edit opens a new request).\n\nWhat to know:\n- 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.\n- 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.\n\nParameters:\n- approvalId: an ar_… id from list_items kind approvals.\n- reason: required with reject and shown to the requester word for word; with approve, an optional note; ignored with withdraw.\n- Example: {approvalId:\"ar_12\", decision:\"reject\", reason:\"Price on slide 2 is wrong.\"}.",
"inputSchema": {
"type": "object",
"required": [
"approvalId",
"decision"
],
"properties": {
"reason": {
"type": "string",
"description": "Why."
},
"decision": {
"enum": [
"approve",
"reject",
"withdraw"
],
"type": "string",
"description": "Approve, reject or withdraw."
},
"approvalId": {
"type": "string",
"description": "Approval request id."
}
}
},
"outputSchema": {
"type": "object",
"properties": {
"data": {
"type": "object",
"description": "The request with its new state and who decided."
}
}
},
"annotations": {
"title": "Approve, reject or withdraw content",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
Shorten the title to an action and subject; move usage details into the description.
Description96/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs57/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
dataSourceId
Data source id.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
allDataSources
Every data source.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
webLinkId
Web link id.
Explain the meaning of this value, not just its name.
Annotations100/100
All four behavior hints are declared.
{
"title": "Sync data or re-render a web page",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
Output schema68/100
Describe the returned fields so an agent can interpret the result.
{
"name": "refresh_data",
"title": "Sync data or re-render a web page",
"description": "Pull fresh content now instead of at the next scheduled refresh.\n\nWhen to use:\n- 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.\n\nWhen NOT to use:\n- 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.\n\nWhat to know:\n- 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.\n- 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.\n\nParameters:\n- Pass exactly one; none or two is an error.\n- dataSourceId: one ds_… feed from list_items kind data_sources.\n- allDataSources: true syncs every feed you can edit, one after another; one failure does not stop the rest; limited to 5 calls a minute.\n- webLinkId: one med_… web link (list_items kind media, mediaKind web); renders a new snapshot.",
"inputSchema": {
"type": "object",
"properties": {
"webLinkId": {
"type": "string",
"description": "Web link id."
},
"dataSourceId": {
"type": "string",
"description": "Data source id."
},
"allDataSources": {
"type": "boolean",
"description": "Every data source."
}
}
},
"outputSchema": {
"type": "object",
"properties": {
"ok": {
"type": [
"integer",
"null"
],
"description": "allDataSources: feeds that synced."
},
"error": {
"type": [
"string",
"null"
],
"description": "One feed: why it did not sync."
},
"total": {
"type": [
"integer",
"null"
],
"description": "allDataSources: feeds tried."
},
"failed": {
"type": [
"integer",
"null"
],
"description": "allDataSources: feeds that failed."
},
"synced": {
"type": [
"boolean",
"null"
],
"description": "One feed: true when it synced."
}
}
},
"annotations": {
"title": "Sync data or re-render a web page",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
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"}.
The description explains the capability, when to use it, and what to expect.
Inputs61/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
report
Which report.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
from
Window start.
Explain what happens when this optional value is omitted.
to
Window end.
Explain the meaning of this value, not just its name.
screenId
Screen id.
Explain the meaning of this value, not just its name.
screenIds
proof_of_play: only these screens, for example every screen at one venue.
Clear enough to supply this argument.
contentIds
proof_of_play: only these content ids, for example one advertiser's ads.
Clear enough to supply this argument.
detail
proof_of_play: screens adds byScreen, one row per content and screen.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
since
Events since.
Explain the meaning of this value, not just its name.
limit
Page size.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cursor
Next page.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"properties": {
"to": {
"type": [
"string",
"null"
],
"description": "Window end."
},
"from": {
"type": [
"string",
"null"
],
"description": "Window start."
},
"nextCursor": {
"type": [
"string",
"null"
],
"description": "audit_log: pass as cursor for the next page."
}
},
"description": "The report; rows depend on the report."
}
Original tool metadata
{
"name": "get_fleet_report",
"title": "Get a fleet report",
"description": "Read a report across screens for a time window.\n\nWhen to use:\n- Uptime and outage causes, what actually played, or who changed what.\n\nWhen NOT to use:\n- One screen's detail: use get_screen_status. What is wrong now: use list_items kind alerts.\n\nWhat to know:\n- 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).\n\nParameters:\n- 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).\n- 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.\n- since, limit (default 50) and cursor (nextCursor of the previous page): audit_log only.\n- Parameters for another report are ignored. Example: {report:\"uptime\", from:\"2026-10-13T00:00:00Z\"}.",
"inputSchema": {
"type": "object",
"required": [
"report"
],
"properties": {
"to": {
"type": "string",
"description": "Window end."
},
"from": {
"type": "string",
"description": "Window start."
},
"limit": {
"type": "integer",
"maximum": 500,
"minimum": 1,
"description": "Page size."
},
"since": {
"type": "string",
"description": "Events since."
},
"cursor": {
"type": "string",
"description": "Next page."
},
"detail": {
"enum": [
"screens"
],
"type": "string",
"description": "proof_of_play: screens adds byScreen, one row per content and screen."
},
"report": {
"enum": [
"uptime",
"proof_of_play",
"audit_log"
],
"type": "string",
"description": "Which report."
},
"screenId": {
"type": "string",
"description": "Screen id."
},
"screenIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "proof_of_play: only these screens, for example every screen at one venue."
},
"contentIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "proof_of_play: only these content ids, for example one advertiser's ads."
}
}
},
"outputSchema": {
"type": "object",
"properties": {
"to": {
"type": [
"string",
"null"
],
"description": "Window end."
},
"from": {
"type": [
"string",
"null"
],
"description": "Window start."
},
"nextCursor": {
"type": [
"string",
"null"
],
"description": "audit_log: pass as cursor for the next page."
}
},
"description": "The report; rows depend on the report."
},
"annotations": {
"title": "Get a fleet report",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
Loading score analytics…
Put your MCP to the test
A few tasks worth trying with this server, chosen from its reviewed tools. These have not been run.
01List items of one kindList items of one kind with their ids, so other tools can act on them.
02Read items in fullRead items of one kind in full.
03Check one screen's healthExplain the state of one screen.
04Get a fleet reportRead a report across screens for a time window.
Want to run these tasks against your MCP server with us?
Brix setup, tools, quality score, publishing readiness, and alternatives.
How do I add Brix to Claude, ChatGPT, or Cursor?
Add Brix to Claude, ChatGPT, or Cursor by connecting its remote MCP URL in each client's MCP settings. In Claude, add a custom connector. In ChatGPT, add an MCP app. In Cursor, add an MCP server under Settings. The MCP URL is https://api.brixsignage.com/v1/mcp.
Is Brix MCP ready for ChatGPT and Claude?
As of November 10, 2026, Brix scores 96/100 on Manufact's MCP publishing checklist. The scan meets ChatGPT publishing checks and meets Claude publishing checks. Passing these checks does not guarantee marketplace approval.
How clear is Brix's MCP tool documentation?
As of November 10, 2026, Brix scores 84/100 in Manufact's review of tool titles, descriptions, input and output schemas, and behavior annotations. The review covers 15 of 15 discovered tools. The quality score measures documentation clarity; runtime behavior and marketplace readiness require separate checks.
How can Brix improve its MCP documentation?
get_fleet_report is the lowest-scoring reviewed tool at 77/100. Align the output schema with the tool’s documented result. Open its review for feedback and a copyable fix prompt, then rerun the documentation review after updating your tool metadata.
Not your MCP?
Review any public or OAuth MCP server for protocol compatibility, tool documentation, and ChatGPT and Claude publishing readiness. No account required.