Skip to main content
Glama

Tapercraft — VHS Label Maker

Save a design

save_design

Save a design straight to the user's dashboard and return its link. Takes the SAME fields as compose_design plus a name; needs an API key with design:write. Use it when the user wants the design kept on their account without opening a link first. Images are copied into the design (safe to delete from the library afterwards). The preview thumbnail and the frozen content snapshot are captured the first time the owner opens and saves it in the browser — say so.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
nameNoDesign name shown on the dashboard (max 120 chars)
textNoOverrides for the fetched metadata (video formats only — on audio formats these come back as unsupported). Omit a field to keep the provider value.
styleNo
textsNoFree text blocks placed on the label (the designer's Text tab). x/y are the block's center in percent of the sheet; width is the percent of the sheet width the block spans (text wraps); size is the font size as percent of the sheet height.
decalsNoStickers, graphics, shapes and the user's own images placed on the label. Each entry names a catalog decal by id (list_decals) OR an upload by ref (upload_image; needs the API key). x/y are percent of the sheet (center-anchored; see describe_format → placement for the coordinate space and the size units). Size with `width` (percent of the sheet width) where describe_format accepts it, else `scale`.
formatYesWhich packaging format
imagesNoThe user's own artwork by upload ref (from upload_image). Needs the API key that owns the uploads. Single-surface formats only (describe_format → singleSurface). Each value is a ref string or { ref, fit, opacity }.
layoutNo
contentNoWhat the design is of. Provide a query, or an id from search_content. Video formats take movie/tv; audio formats (cassette, jcard, cd*, vinyl*, minidisc*) take album. For audio, the album alone builds the complete design — cover art, tracklist sides, QR code — and style.font / labelColor / background restyle it.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • addedInput schema / properties / style / properties / productionLogoColor
      Added value: +{
      +  "description": "6-digit hex the studio logos are painted with ('tint' / 'solid'); absent = the label colour.",
      +  "type": "string"
      +}
    • addedInput schema / properties / style / properties / productionLogoColorize
      Added value: +{
      +  "description": "Video formats: how the studio logos (style.productionLogos or the title's own) are painted. 'solid' (the default) fills them flat in the label colour — a full-colour mark like RCA/Columbia becomes a plain shape; 'off' keeps their original colours; 'tint' recolours while keeping shading.",
      +  "enum": [
      +    "off",
      +    "tint",
      +    "solid"
      +  ],
      +  "type": "string"
      +}
  2. Changed1 schema field changed
    • addedInput schema / properties / layout / properties / spine2
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "title": {
      +      "description": "Turns on Dual Spine and gives the second spine its own title: 'text' prints the title as text there, 'logo' paints the provider's wordmark. The first spine keeps style.useLogo / text.title. Formats with a second spine only (slipcover, doublevhs, betamax, compact-tape, bluray-slipcover, cardbox); elsewhere reported unsupported.",
      +      "enum": [
      +        "text",
      +        "logo"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "title"
      +  ],
      +  "type": "object"
      +}
  3. Changed5 schema fields changed
    • addedInput schema / properties / decals
      Added value: +{
      +  "description": "Stickers, graphics, shapes and the user's own images placed on the label. Each entry names a catalog decal by id (list_decals) OR an upload by ref (upload_image; needs the API key). x/y are percent of the sheet (center-anchored; see describe_format → placement for the coordinate space and the size units). Size with `width` (percent of the sheet width) where describe_format accepts it, else `scale`.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "color": {
      +        "description": "6-digit hex for colorize (default: the label colour)",
      +        "type": "string"
      +      },
      +      "colorize": {
      +        "description": "Paint the decal one colour: 'tint' keeps its shading, 'solid' flattens it",
      +        "enum": [
      +          "tint",
      +          "solid"
      +        ],
      +        "type": "string"
      +      },
      +      "id": {
      +        "description": "A decal id from list_decals (e.g. \"rcacolumbia!\", \"04-rounded-rectangle\")",
      +        "type": "string"
      +      },
      +      "layer": {
      +        "description": "'over' (default), 'under' the label's text and pictures, or 'background'",
      +        "enum": [
      +          "over",
      +          "under",
      +          "background"
      +        ],
      +        "type": "string"
      +      },
      +      "ref": {
      +        "description": "An upload ref, instead of id",
      +        "pattern": "^upload:",
      +        "type": "string"
      +      },
      +      "rotation": {
      +        "maximum": 360,
      +        "minimum": -360,
      +        "type": "integer"
      +      },
      +      "scale": {
      +        "description": "The designer's size unit (100 = natural width ÷ 4 layout units); use instead of width",
      +        "maximum": 900,
      +        "minimum": 10,
      +        "type": "integer"
      +      },
      +      "side": {
      +        "description": "Two-sided formats only",
      +        "enum": [
      +          "front",
      +          "back"
      +        ],
      +        "type": "string"
      +      },
      +      "stretch": {
      +        "description": "Horizontal stretch, percent of the natural aspect",
      +        "maximum": 1000,
      +        "minimum": 10,
      +        "type": "integer"
      +      },
      +      "width": {
      +        "description": "Rendered width as percent of the sheet width (formats with placement.decals.layoutWidthUnits)",
      +        "maximum": 200,
      +        "minimum": 1,
      +        "type": "number"
      +      },
      +      "x": {
      +        "description": "Center, percent of the sheet width (default 50)",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "y": {
      +        "description": "Center, percent of the sheet height (default 50)",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "number"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "maxItems": 24,
      +  "type": "array"
      +}
    • changedInput schema / properties / layout / properties / hide / description
      Previous value: -"Fields to hide on the design"New value: +"Fields to hide on the design (video formats). 'poster' removes the cover art so a panel image or decal can carry the front."
    • changedInput schema / properties / layout / properties / hide / items / enum
      Previous value: -[
      -  "rating",
      -  "texsOrg",
      -  "overview",
      -  "labelOverview",
      -  "fbiWarning",
      -  "rules",
      -  "pullquote",
      -  "pullquoteCredit",
      -  "spineMeta",
      -  "barcode",
      -  "qrCode",
      -  "spineLogo",
      -  "title",
      -  "tagline",
      -  "year",
      -  "origin",
      -  "runtime",
      -  "starring",
      -  "director",
      -  "budget",
      -  "revenue",
      -  "movieId",
      -  "seasonEpisode",
      -  "writers",
      -  "composer",
      -  "producer",
      -  "productionLogos"
      -]New value: +[
      +  "poster",
      +  "rating",
      +  "texsOrg",
      +  "overview",
      +  "labelOverview",
      +  "fbiWarning",
      +  "rules",
      +  "pullquote",
      +  "pullquoteCredit",
      +  "spineMeta",
      +  "barcode",
      +  "qrCode",
      +  "spineLogo",
      +  "title",
      +  "tagline",
      +  "year",
      +  "origin",
      +  "runtime",
      +  "starring",
      +  "director",
      +  "budget",
      +  "revenue",
      +  "movieId",
      +  "seasonEpisode",
      +  "writers",
      +  "composer",
      +  "producer",
      +  "productionLogos"
      +]
    • addedInput schema / properties / style / properties / productionLogos
      Added value: +{
      +  "description": "Video formats: Classic Logo ids (list_decals → classicLogos, e.g. \"rcacolumbia!\") for the spine and studio slot, in order (#1 is the spine). As the whole selection they REPLACE the title's own studio logos; [] removes the studio slot.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "maxItems": 4,
      +  "type": "array"
      +}
    • addedInput schema / properties / texts
      Added value: +{
      +  "description": "Free text blocks placed on the label (the designer's Text tab). x/y are the block's center in percent of the sheet; width is the percent of the sheet width the block spans (text wraps); size is the font size as percent of the sheet height.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "align": {
      +        "enum": [
      +          "left",
      +          "center",
      +          "right"
      +        ],
      +        "type": "string"
      +      },
      +      "allCaps": {
      +        "type": "boolean"
      +      },
      +      "color": {
      +        "description": "6-digit hex (default: the label colour)",
      +        "type": "string"
      +      },
      +      "font": {
      +        "description": "Family name — a curated family or any Google font",
      +        "type": "string"
      +      },
      +      "italic": {
      +        "type": "boolean"
      +      },
      +      "letterSpacing": {
      +        "description": "px",
      +        "maximum": 50,
      +        "minimum": -20,
      +        "type": "number"
      +      },
      +      "lineHeight": {
      +        "maximum": 4,
      +        "minimum": 0.5,
      +        "type": "number"
      +      },
      +      "rotation": {
      +        "maximum": 360,
      +        "minimum": -360,
      +        "type": "integer"
      +      },
      +      "side": {
      +        "enum": [
      +          "front",
      +          "back"
      +        ],
      +        "type": "string"
      +      },
      +      "size": {
      +        "description": "Font size, percent of the sheet height (default 9)",
      +        "maximum": 60,
      +        "minimum": 0.5,
      +        "type": "number"
      +      },
      +      "text": {
      +        "description": "The text; newlines allowed",
      +        "type": "string"
      +      },
      +      "weight": {
      +        "maximum": 900,
      +        "minimum": 100,
      +        "type": "integer"
      +      },
      +      "width": {
      +        "description": "Percent of the sheet width (default 50)",
      +        "maximum": 100,
      +        "minimum": 10,
      +        "type": "integer"
      +      },
      +      "x": {
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "y": {
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "text"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 24,
      +  "type": "array"
      +}
  4. Added

TDQS

A4.3/5.0
Behavior5/5

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

Beyond the annotations (readOnlyHint=false, destructiveHint=false, openWorldHint=true) it discloses the required scope ('needs an API key with design:write'), a side effect ('Images are copied into the design – safe to delete from the library afterwards'), and deferred behavior (thumbnail/snapshot only captured on the owner's first browser open-and-save). This is meaningful context an agent could not infer.

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?

Purpose and link-return are front-loaded, followed by the compose_design equivalence, the auth requirement, the when-to-use rule and two behavioral notes. Every sentence carries information; the closing 'say so' is slightly instruction-like but still purposeful.

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

Completeness4/5

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

For a 9-parameter, deeply nested mutation tool with no output schema, the description covers the operation, the returned link, auth scope, side effects and deferred capture. The only thin spot is that parameter-level detail is left almost entirely to the rich schema, which is acceptable here.

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

Parameters3/5

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

Schema description coverage is high (78%) and the schema documents name, format, content, images, decals, texts, style and layout in depth. The description adds only the cross-reference that the fields match compose_design 'plus a name', which is useful orientation but not new semantic detail; baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb and resource ('save a design straight to the user's dashboard and return its link') and explicitly names the sibling it relates to ('Takes the SAME fields as compose_design plus a name'), so the agent can separate it from compose_design.

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?

Gives a clear when-to-use condition ('when the user wants the design kept on their account without opening a link first'), which implicitly positions compose_design as the ephemeral alternative. It stops short of an explicit when-not statement, so it is strong but not fully routing.

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