Skip to main content
Glama

palette_customize

Destructive

Changes the palette (colors, fonts, button styles, background) of ONE Riddle, as a path => value map, e.g. {"bgColor": "#ffffff", "font.name": "Roboto"} - the paths are palette_get's or riddle://reference/palette/fields. Never affects another Riddle: a palette inherited from the account/project default preset is not changed for the others, the values are stored as an override on this one. A built-in palette ("default:*") is stored nowhere and is therefore duplicated into a Riddle-owned copy automatically; newPaletteName always works on a copy. Two things to know. The new design only reaches the embedded (live) Riddle after another riddle_publish. A palette write does NOT move modifiedAt/modifiedBy (the Creator does not stamp them for a design change either), so polling those will not notice it: the detector is riddle_get's context.modified.hasChanges, true from the preset side. context.preset.drifted usually moves too but is not reliable alone - it means "diverged from the PARENT preset", so on a Riddle whose context.preset.parentId is null it stays false however much you change; read it only alongside parentId. Only if the Riddle's origin.writableByThisKey is true (riddle_get, riddle_list): riddle://reference/concepts/access.

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": {
      "riddleUUID": "<riddleUUID>",
      "values": "<values>"
    },
    "name": "palette_customize"
  }
}

Input Schema

NameRequiredDescriptionDefault
selectNoSelect the palette afterwards so the Riddle actually renders with it. Newly created palettes are always selected.
valuesYesMap of palette path => new value, e.g. {"bgColor": "#ffffff", "buttonColor": "rgba(0,0,0,0.8)", "font.name": "Roboto", "riddleBorderRadius": 12, "isImageInBgDisplayed": true}. Every path must be one of the paths listed in riddle://reference/palette/fields.
riddleUUIDYesThe UUID of the Riddle you want to restyle.
paletteUUIDNoThe palette to change. Omit to change the currently selected palette. Pass a built-in id ("default:timeless") to start from that palette.
newPaletteNameNoCreate a new palette with this name (copied from paletteUUID / the selected palette) and apply the values to the copy, leaving the original untouched.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / riddleUUID / description
      Previous value: -"The UUID of the Riddle you want to restyle. Only Riddles created via the Riddle Builder tools or generated by the Riddle AI can be restyled."New value: +"The UUID of the Riddle you want to restyle."
  2. First observed

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and idempotentHint=false, but the description adds substantial beyond-schema behavior: values are stored as an override on one Riddle only, built-in 'default:*' palettes are duplicated into a Riddle-owned copy, newPaletteName always operates on a copy, and modifiedAt/modifiedBy are not stamped. The only minor gap is it never explains what makes the call destructive or how overwriting an existing override behaves.

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 action and scope before the caveats, and no sentence is filler. It is on the long side, with the modifiedAt/drift detection paragraph dense enough that a shorter pointer to the concepts reference might have served.

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, nested-object mutation with no output schema, the description covers access prerequisites, copy/override semantics, the publish step, and change-detection signals — everything an agent needs to call it correctly and verify the result.

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 already 100%, so the baseline is 3, but the description earns extra: it explains that 'values' is a path=>value map with examples and that paths must come from the palette fields reference, and clarifies that newPaletteName applies changes to a copy leaving the original untouched. Minor omissions remain, e.g. how the 'select' flag interacts with an inherited preset.

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 ('Changes the palette ... of ONE Riddle') plus the fields it covers and the path=>value input shape. The scope contrast with siblings is explicit: it modifies a single Riddle while palette_get only reads, so an agent can route 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?

Gives concrete when-to-use context and prerequisites: paths come from palette_get or riddle://reference/palette/fields, a following riddle_publish is required for the change to reach the live embed, and the call is only valid when origin.writableByThisKey is true. It also tells the agent which detection signal to poll (context.modified.hasChanges) and warns that context.preset.drifted is unreliable alone.

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