Skip to main content
Glama

Set theme

set_theme
DestructiveIdempotent

Write the site theme into theme.css (draft): preset, palette, darkPalette, styleGuide tokens (incl. spacingDensity, radii), fonts, typography (type scale), breakpoints. suggest_palettes / suggest_font_pairings only show options. Company fields: site.json (edit_site_file). Names, keys, workflow: get_style_reference({ topic: "theme" }).

Input Schema

NameRequiredDescriptionDefault
idNoSite id.
fontsNoHint ({ url } or { families }) parsed into heading/body families when styleGuide omits them.
presetNoPreset slug; loads palette, fonts and styleGuide. Explicit params override it.
daisyuiNoDaisyUI component classes (btn, card…). Default on; HTML imports off.
paletteNoComplete palette — replaces the existing one. [{ name, color }] with DaisyUI names (Primary, Primary Content, Secondary, Accent, Neutral, Base 100/200/300, Base Content, …), never "Background"/"Foreground". Colors: hex, rgb, hsl or oklch().
styleGuideNoDesign tokens, merged into the existing styleGuide; each key becomes a CSS var (headingFontFamily, bodyFontFamily, radiusBox, buttonPadding, contentWidth, input*Color, …). Key list: get_style_reference({ topic: "theme" }).
typographyNoType scale tokens, merged by name over the ones fonts made: [{ name: "Heading", fontSize: "3rem", lineHeight: "1.1", letterSpacing: "-0.02em", fontWeight: "700", textTransform: "none" }]. Each field becomes --heading-font-size etc.; the `ph-heading` / `ph-body` classes read them.
breakpointsNoResponsive widths in px for the whole site (sm, md, lg, xl, 2xl; Tailwind's are 640, 768, 1024, 1280, 1536): { md: 800, lg: 1100 }. What sm:/md:/lg: classes switch at, in the published site.
darkPaletteNoOptional dark-mode palette with the same names. Enables dark mode.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • addedInput schema / properties / breakpoints
      Added value: +{
      +  "description": "Responsive widths in px for the whole site (sm, md, lg, xl, 2xl; Tailwind's are 640, 768, 1024, 1280, 1536): { md: 800, lg: 1100 }. What sm:/md:/lg: classes switch at, in the published site.",
      +  "properties": {
      +    "2xl": {
      +      "type": "number"
      +    },
      +    "lg": {
      +      "type": "number"
      +    },
      +    "md": {
      +      "type": "number"
      +    },
      +    "sm": {
      +      "type": "number"
      +    },
      +    "xl": {
      +      "type": "number"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / typography
      Added value: +{
      +  "description": "Type scale tokens, merged by name over the ones fonts made: [{ name: \"Heading\", fontSize: \"3rem\", lineHeight: \"1.1\", letterSpacing: \"-0.02em\", fontWeight: \"700\", textTransform: \"none\" }]. Each field becomes --heading-font-size etc.; the `ph-heading` / `ph-body` classes read them.",
      +  "items": {
      +    "properties": {
      +      "fontFamily": {
      +        "description": "Family.",
      +        "maxLength": 128,
      +        "type": "string"
      +      },
      +      "fontSize": {
      +        "description": "CSS size, e.g. 2.5rem or clamp(2rem, 5vw, 3.5rem).",
      +        "maxLength": 128,
      +        "type": "string"
      +      },
      +      "fontWeight": {
      +        "description": "100-900.",
      +        "maxLength": 16,
      +        "type": "string"
      +      },
      +      "letterSpacing": {
      +        "description": "CSS length.",
      +        "maxLength": 32,
      +        "type": "string"
      +      },
      +      "lineHeight": {
      +        "description": "Unitless or CSS length.",
      +        "maxLength": 32,
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "Token name: Heading, Body, or your own.",
      +        "maxLength": 40,
      +        "type": "string"
      +      },
      +      "textTransform": {
      +        "description": "none, uppercase, …",
      +        "maxLength": 32,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "name"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  2. Changed9 schema fields changed
    • removedInput schema / properties / animations
      Removed value: -{
      -  "description": "Upserted by key into theme.animations; nodes then use root.animation \"site:<key>\". Only for motion no built-in preset covers. Rules + examples: get_style_reference({ topic: \"animation\" }).",
      -  "items": {
      -    "properties": {
      -      "direction": {
      -        "enum": [
      -          "normal",
      -          "reverse",
      -          "alternate",
      -          "alternate-reverse"
      -        ],
      -        "type": "string"
      -      },
      -      "duration": {
      -        "description": "Seconds, 0.05–30.",
      -        "type": "number"
      -      },
      -      "easing": {
      -        "description": "easeOut | easeIn | easeInOut | linear | spring | cubic-bezier() | steps()",
      -        "maxLength": 80,
      -        "type": "string"
      -      },
      -      "iterations": {
      -        "description": "\"1\"–\"20\" or \"infinite\".",
      -        "maxLength": 8,
      -        "type": "string"
      -      },
      -      "key": {
      -        "description": "Slug /^[a-z][a-z0-9-]{0,39}$/, no \"site:\" prefix.",
      -        "maxLength": 40,
      -        "type": "string"
      -      },
      -      "keyframes": {
      -        "description": "Stops incl. at 0 and at 100.",
      -        "items": {
      -          "properties": {
      -            "at": {
      -              "description": "Percent, 0–100.",
      -              "type": "number"
      -            },
      -            "style": {
      -              "description": "Kebab-case CSS property → value, e.g. { \"clip-path\": \"inset(0 100% 0 0)\" }.",
      -              "type": "object"
      -            }
      -          },
      -          "required": [
      -            "at",
      -            "style"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 12,
      -        "minItems": 2,
      -        "type": "array"
      -      },
      -      "label": {
      -        "maxLength": 60,
      -        "type": "string"
      -      },
      -      "trigger": {
      -        "enum": [
      -          "scroll",
      -          "load",
      -          "continuous"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "key",
      -      "label",
      -      "trigger",
      -      "duration",
      -      "easing",
      -      "iterations",
      -      "keyframes"
      -    ],
      -    "type": "object"
      -  },
      -  "maxItems": 50,
      -  "type": "array"
      -}
    • removedInput schema / properties / buildStyle
      Removed value: -{
      -  "description": "Vibe override for block filtering. Rarely needed — preset sets it.",
      -  "enum": [
      -    "aurora",
      -    "brutalist",
      -    "corporate",
      -    "editorial",
      -    "minimal",
      -    "organic"
      -  ],
      -  "maxLength": 128,
      -  "type": "string"
      -}
    • removedInput schema / properties / demo
      Removed value: -{
      -  "description": "Demo URL.",
      -  "maxLength": 2048,
      -  "type": "string"
      -}
    • removedInput schema / properties / description
      Removed value: -{
      -  "description": "Short description (≤75 chars).",
      -  "maxLength": 16384,
      -  "type": "string"
      -}
    • removedInput schema / properties / hidden
      Removed value: -{
      -  "description": "Hide from the public gallery.",
      -  "type": "boolean"
      -}
    • removedInput schema / properties / homePage
      Removed value: -{
      -  "description": "Home page flag (default true).",
      -  "type": "boolean"
      -}
    • removedInput schema / properties / jsonLd
      Removed value: -{
      -  "description": "Schema.org JSON-LD object; {{company.*}} variables work inside it.",
      -  "type": "object"
      -}
    • removedInput schema / properties / removeAnimations
      Removed value: -{
      -  "description": "Keys to delete from theme.animations.",
      -  "items": {
      -    "maxLength": 45,
      -    "type": "string"
      -  },
      -  "maxItems": 50,
      -  "type": "array"
      -}
    • removedInput schema / properties / title
      Removed value: -{
      -  "description": "Title.",
      -  "maxLength": 512,
      -  "type": "string"
      -}
  3. Changed1 schema field changed
    • addedInput schema / properties / daisyui
      Added value: +{
      +  "description": "DaisyUI component classes (btn, card…). Default on; HTML imports off.",
      +  "type": "boolean"
      +}
  4. Changed1 schema field changed
    • changedInput schema / properties / id / description
      Previous value: -"Site id. Pass it on every call."New value: +"Site id."
  5. Changed2 schema fields changed
    • addedInput schema / properties / animations
      Added value: +{
      +  "description": "Upserted by key into theme.animations; nodes then use root.animation \"site:<key>\". Only for motion no built-in preset covers. Rules + examples: get_style_reference({ topic: \"animation\" }).",
      +  "items": {
      +    "properties": {
      +      "direction": {
      +        "enum": [
      +          "normal",
      +          "reverse",
      +          "alternate",
      +          "alternate-reverse"
      +        ],
      +        "type": "string"
      +      },
      +      "duration": {
      +        "description": "Seconds, 0.05–30.",
      +        "type": "number"
      +      },
      +      "easing": {
      +        "description": "easeOut | easeIn | easeInOut | linear | spring | cubic-bezier() | steps()",
      +        "maxLength": 80,
      +        "type": "string"
      +      },
      +      "iterations": {
      +        "description": "\"1\"–\"20\" or \"infinite\".",
      +        "maxLength": 8,
      +        "type": "string"
      +      },
      +      "key": {
      +        "description": "Slug /^[a-z][a-z0-9-]{0,39}$/, no \"site:\" prefix.",
      +        "maxLength": 40,
      +        "type": "string"
      +      },
      +      "keyframes": {
      +        "description": "Stops incl. at 0 and at 100.",
      +        "items": {
      +          "properties": {
      +            "at": {
      +              "description": "Percent, 0–100.",
      +              "type": "number"
      +            },
      +            "style": {
      +              "description": "Kebab-case CSS property → value, e.g. { \"clip-path\": \"inset(0 100% 0 0)\" }.",
      +              "type": "object"
      +            }
      +          },
      +          "required": [
      +            "at",
      +            "style"
      +          ],
      +          "type": "object"
      +        },
      +        "maxItems": 12,
      +        "minItems": 2,
      +        "type": "array"
      +      },
      +      "label": {
      +        "maxLength": 60,
      +        "type": "string"
      +      },
      +      "trigger": {
      +        "enum": [
      +          "scroll",
      +          "load",
      +          "continuous"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "key",
      +      "label",
      +      "trigger",
      +      "duration",
      +      "easing",
      +      "iterations",
      +      "keyframes"
      +    ],
      +    "type": "object"
      +  },
      +  "maxItems": 50,
      +  "type": "array"
      +}
    • addedInput schema / properties / removeAnimations
      Added value: +{
      +  "description": "Keys to delete from theme.animations.",
      +  "items": {
      +    "maxLength": 45,
      +    "type": "string"
      +  },
      +  "maxItems": 50,
      +  "type": "array"
      +}
  6. Changed1 schema field changed
    • removedInput schema / properties / image
      Removed value: -{
      -  "description": "Preview image URL.",
      -  "maxLength": 2048,
      -  "type": "string"
      -}
  7. First observed

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false; the description adds the crucial mitigating context that output goes into theme.css as a draft, so changes are not live until published. It also signals that palette replacement is whole-value rather than additive (per schema) and points to the reference tool for token key validity, though it says nothing about failure modes for invalid presets or token keys.

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 verb and target file, then a compact coverage list, then routing. The telegraphic colon style packs a lot into four sentences with no filler, though the dense clause stacking is slightly harder to parse than plain prose.

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, nested-object, no-output-schema mutation tool, the description covers what gets written, where, and which sibling to consult for names and previews. The main remaining gap is the publish step and how token/key validation failures are surfaced, which an agent would need to know before relying on the draft write.

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; the description goes beyond it by mapping parameter groups to destinations (theme.css vs site.json) and directing agents to get_style_reference for the styleGuide key list and naming conventions. It still leaves the preset override precedence and font-hint behavior to the schema.

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?

Specific verb+resource ('Write the site theme into theme.css') followed by an enumeration of exactly what it covers (preset, palette, darkPalette, styleGuide, fonts, typography, breakpoints). It also carves out scope against siblings: suggest_palettes/suggest_font_pairings only preview, company fields belong in site.json via edit_site_file.

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?

Explicitly routes agents away from suggest_palettes/suggest_font_pairings ('only show options') and toward edit_site_file for company fields and get_style_reference for token names/keys/workflow. It doesn't state exclusions relative to other theme-adjacent siblings such as apply_kit_block or update_site, so it stops short of full when/when-not coverage.

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