Skip to main content
Glama

save_decoration

Destructive

Save a proven 3D decoration to a reusable library, capturing its content, depth, mode, material, and processing pipeline so the same design can be applied to new models later.

Instructions

Save a proven decoration to the library for reuse on future models.

        Captures the content file (heightmap, SVG, image), settings
        (depth, mode, material), and processing pipeline from the
        ``.kiln_recipe.json`` sidecar so the exact same decoration can
        be applied to new models with ``apply_decoration``.

        :param name: Human-readable name (e.g. "Ash Portrait").
        :param model_path: Path to the model that was just decorated.
        :param content_type: Content type — ``photo``, ``svg``, ``qr``,
            ``text``, or ``auto`` (detect from file extension).
        :param source_path: Path to the original input file (photo, SVG).
        :param content_data: For QR: the data string. For text: the text.
        :param depth_mm: Decoration depth in mm (0 = auto from recipe).
        :param mode: ``emboss`` or ``deboss``.  Omitted, the recipe
            sidecar's mode is used when it has one, else ``emboss``.
        :param image_style: Image processing style (coin, portrait, etc.).
            Omitted, the recipe sidecar's style is used when it has one,
            else ``auto``.
        :param material: Material used (e.g. PLA, PETG).  Omitted, the
            recipe sidecar's material is used when it has one, else PLA.
        :param tags: Comma-separated tags for filtering.
        :returns: Dict with saved decoration details and library path.
        

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "name": "<name>",
      "model_path": "<model_path>"
    },
    "name": "save_decoration"
  }
}

Input Schema

NameRequiredDescriptionDefault
modeNo``emboss`` or ``deboss``. Omitted, the recipe sidecar's mode is used when it has one, else ``emboss``.
nameYesHuman-readable name (e.g. "Ash Portrait").
tagsNoComma-separated tags for filtering. Default: "".
depth_mmNoDecoration depth in mm (0 = auto from recipe). Default: 0.0.
materialNoMaterial used (e.g. PLA, PETG). Omitted, the recipe sidecar's material is used when it has one, else PLA.
model_pathYesPath to the model that was just decorated.
image_styleNoImage processing style (coin, portrait, etc.). Omitted, the recipe sidecar's style is used when it has one, else ``auto``.
source_pathNoPath to the original input file (photo, SVG). Default: "".
content_dataNoFor QR: the data string. For text: the text. Default: "".
content_typeNoContent type — ``photo``, ``svg``, ``qr``, ``text``, or ``auto`` (detect from file extension). Default: "auto".

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed16 schema fields changedv1.5.1
    • changedInput schema / properties / content_data / description
      Previous value: -"Default: \"\"."New value: +"For QR: the data string. For text: the text. Default: \"\"."
    • changedInput schema / properties / content_type / description
      Previous value: -"Default: \"auto\"."New value: +"Content type — ``photo``, ``svg``, ``qr``, ``text``, or ``auto`` (detect from file extension). Default: \"auto\"."
    • changedInput schema / properties / depth_mm / description
      Previous value: -"Default: 0.0."New value: +"Decoration depth in mm (0 = auto from recipe). Default: 0.0."
    • addedInput schema / properties / image_style / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / image_style / description
      Previous value: -"Default: \"auto\"."New value: +"Image processing style (coin, portrait, etc.). Omitted, the recipe sidecar's style is used when it has one, else ``auto``."
    • removedInput schema / properties / image_style / type
      Removed value: -"string"
    • addedInput schema / properties / material / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / material / description
      Previous value: -"Default: \"PLA\"."New value: +"Material used (e.g. PLA, PETG).  Omitted, the recipe sidecar's material is used when it has one, else PLA."
    • removedInput schema / properties / material / type
      Removed value: -"string"
    • addedInput schema / properties / mode / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedInput schema / properties / mode / description
      Previous value: -"Default: \"emboss\"."New value: +"``emboss`` or ``deboss``.  Omitted, the recipe sidecar's mode is used when it has one, else ``emboss``."
    • removedInput schema / properties / mode / type
      Removed value: -"string"
    • addedInput schema / properties / model_path / description
      Added value: +"Path to the model that was just decorated."
    • addedInput schema / properties / name / description
      Added value: +"Human-readable name (e.g. \"Ash Portrait\")."
    • changedInput schema / properties / source_path / description
      Previous value: -"Default: \"\"."New value: +"Path to the original input file (photo, SVG). Default: \"\"."
    • changedInput schema / properties / tags / description
      Previous value: -"Default: \"\"."New value: +"Comma-separated tags for filtering. Default: \"\"."
  2. Changed16 schema fields changedv1.5.0
    • removedInput schema / properties / content_data / default
      Removed value: -""
    • addedInput schema / properties / content_data / description
      Added value: +"Default: \"\"."
    • removedInput schema / properties / content_type / default
      Removed value: -"auto"
    • addedInput schema / properties / content_type / description
      Added value: +"Default: \"auto\"."
    • removedInput schema / properties / depth_mm / default
      Removed value: -0
    • addedInput schema / properties / depth_mm / description
      Added value: +"Default: 0.0."
    • removedInput schema / properties / image_style / default
      Removed value: -"auto"
    • addedInput schema / properties / image_style / description
      Added value: +"Default: \"auto\"."
    • removedInput schema / properties / material / default
      Removed value: -"PLA"
    • addedInput schema / properties / material / description
      Added value: +"Default: \"PLA\"."
    • removedInput schema / properties / mode / default
      Removed value: -"emboss"
    • addedInput schema / properties / mode / description
      Added value: +"Default: \"emboss\"."
    • removedInput schema / properties / source_path / default
      Removed value: -""
    • addedInput schema / properties / source_path / description
      Added value: +"Default: \"\"."
    • removedInput schema / properties / tags / default
      Removed value: -""
    • addedInput schema / properties / tags / description
      Added value: +"Default: \"\"."
  3. First observedv0.1.0

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false and destructiveHint=true; the description usefully discloses that state is harvested from the ``.kiln_recipe.json`` sidecar and that omitted params fall back to sidecar values then defaults. It does not, however, explain the destructive aspect — what happens on a name collision, whether an existing library entry is replaced, or where the library lives — which is the one behavior the agent most needs before calling it.

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

Conciseness3/5

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

The opening two paragraphs are well front-loaded and earn their place, but roughly half the text is a parameter list that duplicates a fully-described schema, padding a definition that could be half as long without losing information.

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

Completeness3/5

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

For a 10-parameter mutating tool with a destructive hint and no output schema, the definition covers inputs and the returns shape but omits the success/failure semantics (collision handling, required sidecar presence, path errors) that an agent needs to invoke it safely.

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 100%, so the schema already documents every parameter, and the description's ``:param:`` list restates those same texts nearly verbatim. It adds no format, coupling, or validation detail beyond the schema, so the baseline of 3 applies.

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 proven decoration to the library") plus the payoff (reuse on future models), and explicitly pairs it with ``apply_decoration``, so it is distinguishable from list_decorations, decoration_info and apply_decoration without opening a schema.

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

Usage Guidelines3/5

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

Implies the timing ("proven decoration", "model that was just decorated") and names the follow-up tool ``apply_decoration``, but never states when not to use it — e.g. whether a repeat name overwrites an existing library entry, or whether presets (create_decoration_preset) are the better choice.

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