Skip to main content
Glama

create_content

Create content in SRG+ hub profiles with privacy settings, cover images, and structured widgets (text, links, media, profiles). Assign channels and categories to manage placement and publishing.

Instructions

Create a new content item in a hub profile.

workspace_id: target workspace ID — get available IDs from list_workspaces()
privacy: "Preview" (default), "Private", or "Public"
channels: list of channel IDs. NOTE: a channel placement needs a category,
    so passing channels alone here often does NOT stick (saved channels:[]).
    To reliably place content, call add_content_to_categories(content_id,
    channel_id, category_ids=[...]) after create.
main_asset_id: ID of the primary playable asset
url: optional external URL to associate with the content
cover_image: http(s):// URL (or local path) of the cover; the URL PATH must
    end in an image extension (.jpg/.png/...). Query strings are fine (signed
    URLs work); an extension-less URL (e.g. placehold.co/600x400) returns 400.
categories: category assignment objects

context: the body — an ordered list of widget objects. Each widget MUST
carry a "$type" discriminator (literal key, with the dollar sign). Keys are
camelCase: the backend rejects snake_case for multi-word fields (assetId,
hubProfileIds, referenceIds) as a silent 400, so never send asset_id etc.
Shapes:
  • Text (markdown body):
    {"$type": "Text", "content": "<markdown, required>", "title": "<optional>"}
  • LinkList:
    {"$type": "LinkList", "title": "<optional>", "links": [
        {"$type": "CustomLink", "title": "<required, unique in list>", "url": "https://...", "extension": "<optional image ext>"},
        {"$type": "KnownLink",  "title": "<required>", "url": "https://..."}
    ]}
    (both link types use "title" + "url"; NOT "label"/"type". Max 20 links.)
  • Media: {"$type": "Media", "assetId": "<existing PLAYABLE/video asset id>", "autoplay": false, "title": "<optional>"}
    (assetId must be an EXISTING playable/video asset of the hub; an image or
    a just-uploaded asset is NOT playable media and returns 404. No image-body
    widget exists — use the cover, a CustomLink, or markdown in a Text widget.)
  • HubProfile: {"$type": "HubProfile", "hubProfileIds": ["<hub id>", ...], "title": "<optional>"}
    (hubProfileIds is a REQUIRED array, even for a single hub)
  • ContentWidget: {"$type": "ContentWidget", "referenceType": "Content",
        "referenceIds": [{"$type": "Content", "id": "<content id>"}], "title": "<optional>"}
    (each reference is {"$type": "Content"|"Asset", "id": "..."}; referenceType matches the kind)
A single bad widget rejects the WHOLE call with 400 (the error now names the
rejected field). Widget title (when set) is 1-150 chars.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
urlNo
nameYes
contextNo
detailsNo
privacyNoPreview
channelsNo
categoriesNo
cover_imageNo
workspace_idYes
main_asset_idNo
hub_profile_idYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv0.4.18

TDQS

A4.8/5.0
Behavior5/5

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

The description goes far beyond annotations, disclosing failure modes such as silent 400s for snake_case, 400 for extension-less cover URLs, whole-call rejection on a bad widget, the playable-asset requirement, and the channel/category caveat. This richly documents actual behavior.

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

Conciseness5/5

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

The description is long but well organized with line-per-parameter explanations and bulleted widget shapes. Every section carries necessary constraint information, and the opening sentence immediately states the tool's purpose.

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

Completeness5/5

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

For a complex creation tool, the description covers required input semantics, per-field formats, widget schemas, error behavior, and post-create follow-up guidance. It is complete enough for an agent to construct a valid request without additional external knowledge.

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

Parameters5/5

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

With 0% schema coverage, the description compensates substantially by explaining workspace_id, privacy, channels, main_asset_id, url, cover_image, categories, and especially the context widget structures. It adds critical constraints like the required '$type' discriminator, camelCase keys, and max link counts.

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

Purpose5/5

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

The description opens with 'Create a new content item in a hub profile,' which states a specific verb and resource. This clearly distinguishes the tool from siblings such as update_content, archive_content, and get_content.

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

Usage Guidelines4/5

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

It gives clear context about creating content and explicitly advises using add_content_to_categories after create for reliable channel placement. It does not explicitly contrast create with update_content or archive_content, but the intent is clear enough.

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

Deploy Server

Other Tools