Skip to main content
Glama

Create items

create_items

Create new items of one kind.

When to use:

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

When NOT to use:

  • Changing an existing item: use update_items.

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

What to know:

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

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

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

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

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

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

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

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

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

Parameters:

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

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

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

Input Schema

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

Output Schema

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

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedInput schema / properties / creatives / items / properties / dataSourceId / description
      Previous value: -"Data source in THIS workspace for field/list bindings."New value: +"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."
    • addedInput schema / properties / creatives / items / properties / repeat
      Added value: +{
      +  "description": "Repeat for each row: plays the design once per row of dataSourceId, with row bindings following the row. Example: {over:\"rows\", secondsPerRow:12}. Omit for a design that plays once. A workspace without the feature refuses it (403 feature_disabled) and nothing is created.",
      +  "properties": {
      +    "over": {
      +      "description": "What it repeats over: the rows of the data source.",
      +      "enum": [
      +        "rows"
      +      ],
      +      "type": "string"
      +    },
      +    "secondsPerRow": {
      +      "description": "How long each row stays up, 3 to 3600 seconds; default 12.",
      +      "maximum": 3600,
      +      "minimum": 3,
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "over"
      +  ],
      +  "type": "object"
      +}
  2. Changed5 schema fields changed
    • changedInput schema / properties / apps / items / properties / config / description
      Previous value: -"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."New value: +"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."
    • changedInput schema / properties / data_sources / description
      Previous value: -"Data feeds (CSV, Google Sheets, JSON API, POS), max 20. Find connector types with list_items kind connectors. Credentials in config are encrypted at rest and never read back."New value: +"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."
    • changedInput schema / properties / data_sources / items / properties / config / description
      Previous value: -"Connector settings (URL, sheet id, token, …)."New value: +"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}."
    • changedInput schema / properties / data_sources / items / properties / connector / description
      Previous value: -"Connector type from list_items kind connectors, e.g. \"google-sheets\"."New value: +"Connector type from list_items kind connectors with setup \"here\", e.g. \"google-sheets\"."
    • changedInput schema / properties / people / description
      Previous value: -"Invite people, max 10. Each gets an email to set a password; 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."New value: +"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."
  3. Changed1 schema field changed
    • changedInput schema / properties / emergency_templates / items / properties / contentKind / enum
      Previous value: -[
      -  "media",
      -  "playlist",
      -  "app",
      -  "creative"
      -]New value: +[
      +  "media",
      +  "creative",
      +  "playlist",
      +  "app"
      +]
  4. Changed1 schema field changed
    • addedInput schema / properties / people
      Added value: +{
      +  "description": "Invite people, max 10. Each gets an email to set a password; 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.",
      +  "items": {
      +    "properties": {
      +      "email": {
      +        "description": "Their email address.",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Their name.",
      +        "type": "string"
      +      },
      +      "nodeIds": {
      +        "description": "Locations where they hold the role (list_items kind locations).",
      +        "items": {
      +          "type": "string"
      +        },
      +        "minItems": 1,
      +        "type": "array"
      +      },
      +      "roleId": {
      +        "description": "Role to hold (list_items kind roles); it can hold only permissions this connection holds.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "email",
      +      "roleId",
      +      "nodeIds"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 10,
      +  "type": "array"
      +}
  5. Changed1 schema field changed
    • changedInput schema / properties / media_files / description
      Previous value: -"Files whose bytes you hold (an image you made, a file the person pasted), uploaded straight into the media library."New value: +"Files whose bytes you hold (an image you made, a file the person pasted), uploaded straight into the media library, 6 MB each."
  6. Changed2 schema fields changed
    • changedInput schema / properties / celebrations / description
      Previous value: -"Celebration entries to import, max 100 per call. A bad row is reported, the rest are still created."New value: +"Celebration entries to import, max 100 per call."
    • changedInput schema / properties / creatives / description
      Previous value: -"Creatives to create, max 100 per call. One invalid box rejects the whole call."New value: +"Creatives to create, max 100 per call."
  7. Changed1 schema field changed
    • addedInput schema / properties / media_files
      Added value: +{
      +  "description": "Files whose bytes you hold (an image you made, a file the person pasted), uploaded straight into the media library.",
      +  "items": {
      +    "properties": {
      +      "contentType": {
      +        "description": "MIME type, e.g. image/png, image/jpeg, video/mp4, application/pdf.",
      +        "type": "string"
      +      },
      +      "dataBase64": {
      +        "description": "The file's bytes, base64 (a data: URL prefix is accepted).",
      +        "type": "string"
      +      },
      +      "folderId": {
      +        "description": "Folder id (list_items kind media_folders); omit for the root.",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "File name with its extension, e.g. \"menu.png\".",
      +        "type": "string"
      +      },
      +      "nodeId": {
      +        "description": "Location id to home it at; omit for the workspace root.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "name",
      +      "contentType",
      +      "dataBase64"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 5,
      +  "type": "array"
      +}
  8. Changed1 schema field changed
    • changedInput schema / properties / emergency_templates / description
      Previous value: -"Pre-armed emergency takeovers (Lockdown, Fire drill, …), max 50. Fire one with start_cast emergencyTemplateId."New value: +"Pre-armed emergency takeovers (Lockdown, Fire drill, …), max 50. Fire one with start_takeover emergencyTemplateId."
  9. Added

TDQS

A4.8/5.0
Behavior5/5

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

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

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

Conciseness4/5

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

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

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

Completeness5/5

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

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

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

Parameters4/5

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

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

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

Purpose5/5

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

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

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

Usage Guidelines5/5

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

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

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources