Skip to main content
Glama

Update Component

update_component
DestructiveIdempotent

Update an authored component's complete version-4 source/metadata IN PLACE (same id) — the correct verb for the author→preview→fix loop (preview_component returns the admission or runtime error; fix the template here and re-preview, instead of creating a new component each iteration). Pass componentId + the changed fields as body. Same source contract as create_component: {version:4, componentId, template, manifest, definition}, admitted before the write; the template finds its root with document.getElementById('root'), and declared slots arrive in the scene's assets, never params. PLACED CLIPS: every placed clip renders the exact version it pins, so an update moves placed clips ONLY when you name a project — put projectId (and optionally compositionId; default the project's active composition) in body, and that composition's placements move to the new version in the same write. The answer carries repinned (what moved) and placementsPinnedToPrevious (placements across the org still rendering the previous version). Without projectId nothing placed moves: previews and renders of an existing clip keep the old version. For one placement, register the source WITHOUT projectId, read its immutable sourceVersionId, then use apply_composition clip.update to change only the selected clip source and exact pin under observed concurrency expectations. Explicit-project update_component admits and repins all matching placements in that composition; use it only when that broader edit is requested.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
bodyYesPUT /components/:id body: every writable field, all optional; an omitted field is carried forward. Org/user are server-resolved; never accepted from the body.
componentIdYescomponentId (path).

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
idNoThe entry's id: a `primitiveId` for a built-in, a `componentId` for an installed component.
kindNoRENDER kind (component | transition | scene). NOT the ClipSource variant — see `placement` for how to author it on the timeline.
moodNoVibe/tone tags (e.g. 'cinematic', 'minimal'). Filter to match the edit's mood.
nameNo
tagsNoFree-text search keywords.
tierNoQuality/applicability RANKING (a preference, not a flag). Prefer 'recommended'; reach for 'niche' only when its specific use-case is exactly the beat.
formatNo
intentNoSelection signal: a verb naming what this primitive accomplishes (e.g. 'product-trailer'). Match it to the beat you are authoring.
originNo
sourceNo'default' = built-in primitive (place by primitiveId); 'installed' = org-authored component (place by componentId).
tokensNo
useCaseNoThe edit ROLE(s) this primitive fills — the dimension to filter by for a beat (e.g. 'intro', 'title-over-footage', 'grade').
useWhenNoWhen to use this — AND when not to. The negative guidance is load-bearing; read it before picking.
versionNoThe ENTRY's version: a semver string ('0.0.0' until an authored component is versioned). Distinct from `manifest.version`, which is the runtime contract version (4 native, 2 retired TSX).
categoryNo
examplesNoUsage examples, as authored. A built-in primitive projects {name, mood?, params?, description?}; an authored component's examples are whatever it wrote, which is why the item is open. One shape for both directions: what you write here is what you read back.
manifestNo
repinnedNoPresent when the update named `projectId`: the composition whose placements moved to the new version.
warningsNoNon-blocking save-time advisories — the create/update SUCCEEDED. Currently: a `fontFamily` string literal referencing a NON-vendored font (a bare CSS generic like 'serif', or an unknown named family like 'Arial') whose LIVE-lane pixels vary by render host — re-author with a vendored family or 'Georgia'. Omitted when there is nothing to flag; only present on the create/update responses.
avoidWithNoAuthoring guidance: ids of primitives that CONFLICT with this one — do not place together.
fixedCopyNoOn-screen strings this primitive BAKES — the read-side counterpart to propSchema. These literals render REGARDLESS of params (no param can change them); fork the source via get_component_source to edit them. Use this to see at author time what fixed copy (someone-else's marketing text, faux-code, faux-data) will appear before you render.
pairsWithNoAuthoring guidance: ids of primitives that COMPOSE well with this one in the same edit.
placementNo
textParamNoThe param field that carries this primitive's primary text; null = no single text slot.
propSchemaNo
descriptionNo
ejectedFromNo
propDefaultsNo
subtextParamNoThe param field for secondary text (subtitle/byline); null = none.
brandBindingsNoParams that can follow the project brand kit. Each {param, brandToken} says: set `param` to `brandToken` (a `$brand:` ref, e.g. '$brand:colors.accent') to track the brand instead of a literal. See the list response's `brandTokens` for the full ref vocabulary. Omitted when nothing is brand-bound.
durationInFramesNo
placementsPinnedToPreviousNoPlacements across the org that still pin the previous version and will keep rendering it. Name `projectId` (and `compositionId`) on the update to move a composition's placements with it.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed14 schema fields changed
    • addedInput schema / properties / body / properties / source / properties / manifest / properties / hfContract
      Added value: +{
      +  "const": 1,
      +  "type": "number"
      +}
    • addedInput schema / properties / body / properties / source / properties / manifest / properties / kind
      Added value: +{
      +  "const": "scene",
      +  "type": "string"
      +}
    • addedInput schema / properties / body / properties / source / properties / manifest / properties / runtime
      Added value: +{
      +  "const": "hyperframes",
      +  "type": "string"
      +}
    • changedInput schema / properties / body / properties / source / properties / manifest / properties / version / const
      Previous value: -2New value: +4
    • removedInput schema / properties / body / properties / source / properties / manifest / properties / visualMedia
      Removed value: -{
      -  "additionalProperties": false,
      -  "properties": {
      -    "version": {
      -      "const": 1,
      -      "type": "number"
      -    }
      -  },
      -  "required": [
      -    "version"
      -  ],
      -  "type": "object"
      -}
    • changedInput schema / properties / body / properties / source / properties / manifest / required
      Previous value: -[
      -  "version",
      -  "assets",
      -  "graphics",
      -  "alphaPolicy"
      -]New value: +[
      +  "version",
      +  "runtime",
      +  "hfContract",
      +  "kind",
      +  "assets",
      +  "graphics",
      +  "alphaPolicy"
      +]
    • addedInput schema / properties / body / properties / source / properties / template
      Added value: +{
      +  "maxLength": 2000000,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • removedInput schema / properties / body / properties / source / properties / tsxSource
      Removed value: -{
      -  "maxLength": 8000000,
      -  "minLength": 1,
      -  "type": "string"
      -}
    • changedInput schema / properties / body / properties / source / properties / version / const
      Previous value: -3New value: +4
    • changedInput schema / properties / body / properties / source / required
      Previous value: -[
      -  "version",
      -  "componentId",
      -  "tsxSource",
      -  "manifest",
      -  "definition"
      -]New value: +[
      +  "version",
      +  "componentId",
      +  "template",
      +  "manifest",
      +  "definition"
      +]
    • removedOutput schema / properties / manifest / additionalProperties
      Removed value: -{}
    • removedOutput schema / properties / manifest / properties
      Removed value: -{}
    • removedOutput schema / properties / manifest / type
      Removed value: -"object"
    • changedOutput schema / properties / version / description
      Previous value: -"The ENTRY's version: a semver string ('0.0.0' until an authored component is versioned). Distinct from `manifest.version`, which is the runtime contract version and is always the literal 2."New value: +"The ENTRY's version: a semver string ('0.0.0' until an authored component is versioned). Distinct from `manifest.version`, which is the runtime contract version (4 native, 2 retired TSX)."
  2. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Annotations declare destructive=true and idempotent=true, but the description goes far beyond them: it discloses that placements move ONLY when projectId is named, the exact source contract admitted before write, the return fields (`repinned`, `placementsPinnedToPrevious`), and that previews/renders of existing clips keep the old version otherwise. This is rich behavioral disclosure of side effects.

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

Conciseness4/5

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

Front-loaded with the core purpose and the loop context before drilling into placement mechanics, so the most important sentence comes first. It is dense and slightly sprawling as a single paragraph, but almost every sentence carries non-redundant routing or behavior information given the tool's complexity.

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

Completeness5/5

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

For a destructive in-place mutation with a deeply nested schema and many siblings, the description covers the loop, the placement-repin decision, the single-clip alternative, and the concurrency expectations. Although an output schema exists (so return values are documented), the mention of `repinned`/`placementsPinnedToPrevious` adds useful caller-facing context.

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 genuine meaning: it tells the caller to pass componentId plus changed fields as `body`, and explains projectId/compositionId semantics (which placements repin, default to the active composition) that the schema's short property descriptions do not fully convey.

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

Purpose5/5

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

States a precise verb+resource+scope: 'Update an authored component's complete version-4 source/metadata IN PLACE (same id)'. It explicitly distinguishes itself from siblings by naming preview_component, create_component, and apply_composition clip.update, so an agent can route without opening schemas.

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

Usage Guidelines5/5

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

Gives explicit when-to-use (the author→preview→fix loop, instead of creating a new component each iteration), when-not (without projectId nothing placed moves), and a named alternative for the single-placement case (register without projectId, then apply_composition clip.update). Conditions that select each path are spelled out.

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.