Skip to main content
Glama

UiChemy AI Website Creator

uichemy_batch

Destructive

Many edits in ONE write. Copy, pictures, video clips, per-element text styles, button roles, badge designs, image display settings, section backgrounds and icons, in the order you give them. Prefer this to calling the single tools thirty times: each of those is its own revision and its own chance to collide with somebody editing the project in the browser, and a collision halfway through leaves fourteen changes applied and no record of where it stopped. ALL OR NOTHING — one invalid op refuses the whole batch and nothing is written, with every problem named so the batch can be fixed and sent again. link points a button or text link (by its text_… / icon_url_… key, from uichemy_list_links) at an href, the same as uichemy_set_link.

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": {
      "projectId": "<projectId>",
      "ops": "<ops>"
    },
    "name": "uichemy_batch"
  }
}

Input Schema

NameRequiredDescriptionDefault
opsYes
projectIdYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / ops / items / anyOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "op": {
      -        "const": "text",
      -        "type": "string"
      -      },
      -      "values": {
      -        "additionalProperties": {
      -          "type": "string"
      -        },
      -        "description": "{ \"text_a1b2c3\": \"New headline\" }",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "values"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "op": {
      -        "const": "images",
      -        "type": "string"
      -      },
      -      "values": {
      -        "additionalProperties": {
      -          "type": "string"
      -        },
      -        "description": "{ \"image_url_v9y4k1\": \"https://…\" }",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "values"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "op": {
      -        "const": "sectionSurface",
      -        "type": "string"
      -      },
      -      "overlay": {
      -        "enum": [
      -          "black",
      -          "off",
      -          "reset"
      -        ],
      -        "type": "string"
      -      },
      -      "overlayOpacity": {
      -        "maximum": 0.9,
      -        "minimum": 0.1,
      -        "type": "number"
      -      },
      -      "padding": {
      -        "description": "A multiplier of the section rhythm. 1 resets.",
      -        "maximum": 4,
      -        "minimum": 0.25,
      -        "type": "number"
      -      },
      -      "sectionKey": {
      -        "description": "A key from uichemy_list_section_backgrounds.",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "sectionKey"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "href": {
      -        "description": "https://…, /path, #anchor, mailto:, tel:, or \"\" to clear.",
      -        "type": "string"
      -      },
      -      "key": {
      -        "description": "A text_… or icon_url_… key, from uichemy_list_links.",
      -        "type": "string"
      -      },
      -      "newTab": {
      -        "type": "boolean"
      -      },
      -      "op": {
      -        "const": "link",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "key",
      -      "href"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "buttonKey": {
      -        "description": "A text_… or icon_url_… key, from uichemy_get_page.",
      -        "type": "string"
      -      },
      -      "op": {
      -        "const": "buttonRole",
      -        "type": "string"
      -      },
      -      "role": {
      -        "enum": [
      -          "primary",
      -          "secondary",
      -          "tertiary",
      -          "reset"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "buttonKey",
      -      "role"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "badgeKey": {
      -        "description": "A text_… key, from uichemy_get_page.",
      -        "type": "string"
      -      },
      -      "design": {
      -        "description": "1 Outline · 2 Solid · 3 Soft · 4 Dot · 5 Underline · 0 resets.",
      -        "maximum": 5,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "op": {
      -        "const": "badgeDesign",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "badgeKey",
      -      "design"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "op": {
      -        "const": "videos",
      -        "type": "string"
      -      },
      -      "values": {
      -        "additionalProperties": {
      -          "properties": {
      -            "poster": {
      -              "type": "string"
      -            },
      -            "src": {
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "src"
      -          ],
      -          "type": "object"
      -        },
      -        "description": "{ \"video_url_e6v0a3\": { \"src\": \"https://…/clip.mp4\" } }",
      -        "propertyNames": {
      -          "type": "string"
      -        },
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "values"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "align": {
      -        "enum": [
      -          "left",
      -          "center",
      -          "right"
      -        ],
      -        "type": "string"
      -      },
      -      "colorRole": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "properties": {
      -              "role": {
      -                "type": "string"
      -              },
      -              "step": {
      -                "maximum": 9,
      -                "minimum": 0,
      -                "type": "integer"
      -              }
      -            },
      -            "required": [
      -              "role",
      -              "step"
      -            ],
      -            "type": "object"
      -          }
      -        ],
      -        "description": "A role (\"primary\", \"titleLight\" …), { role, step } for a ramp shade, or \"#RRGGBB\"."
      -      },
      -      "hoverColorRole": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "properties": {
      -              "role": {
      -                "type": "string"
      -              },
      -              "step": {
      -                "maximum": 9,
      -                "minimum": 0,
      -                "type": "integer"
      -              }
      -            },
      -            "required": [
      -              "role",
      -              "step"
      -            ],
      -            "type": "object"
      -          }
      -        ]
      -      },
      -      "op": {
      -        "const": "textStyle",
      -        "type": "string"
      -      },
      -      "sizeKey": {
      -        "description": "heading-xs|sm|md|lg|xl|2xl|3xl|4xl|5xl, or body-sm|md|lg|xl.",
      -        "type": "string"
      -      },
      -      "tag": {
      -        "enum": [
      -          "h1",
      -          "h2",
      -          "h3",
      -          "h4",
      -          "h5",
      -          "h6",
      -          "p"
      -        ],
      -        "type": "string"
      -      },
      -      "textKey": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "textKey"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "alt": {
      -        "type": "string"
      -      },
      -      "op": {
      -        "const": "imageDisplay",
      -        "type": "string"
      -      },
      -      "overlay": {
      -        "enum": [
      -          "yes",
      -          "no"
      -        ],
      -        "type": "string"
      -      },
      -      "position": {
      -        "enum": [
      -          "center",
      -          "left",
      -          "right",
      -          "top",
      -          "bottom"
      -        ],
      -        "type": "string"
      -      },
      -      "ratio": {
      -        "enum": [
      -          "original",
      -          "1:1",
      -          "4:3",
      -          "16:9",
      -          "3:2"
      -        ],
      -        "type": "string"
      -      },
      -      "slot": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "slot"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "color": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "properties": {
      -              "role": {
      -                "type": "string"
      -              },
      -              "step": {
      -                "maximum": 9,
      -                "minimum": 0,
      -                "type": "integer"
      -              }
      -            },
      -            "required": [
      -              "role",
      -              "step"
      -            ],
      -            "type": "object"
      -          }
      -        ],
      -        "description": "A role, { role, step } on its ramp, or #hex."
      -      },
      -      "hex": {
      -        "type": "string"
      -      },
      -      "op": {
      -        "const": "sectionBackground",
      -        "type": "string"
      -      },
      -      "sectionKey": {
      -        "description": "A key from uichemy_list_section_backgrounds.",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "sectionKey"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "iconId": {
      -        "type": "string"
      -      },
      -      "op": {
      -        "const": "icon",
      -        "type": "string"
      -      },
      -      "value": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "iconId",
      -      "value"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "color": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "properties": {
      -              "role": {
      -                "type": "string"
      -              },
      -              "step": {
      -                "maximum": 9,
      -                "minimum": 0,
      -                "type": "integer"
      -              }
      -            },
      -            "required": [
      -              "role",
      -              "step"
      -            ],
      -            "type": "object"
      -          }
      -        ],
      -        "description": "A role, { role, step }, #hex, or \"auto\" to follow the section again."
      -      },
      -      "iconId": {
      -        "description": "An icon_url_… label or a key from uichemy_list_icon_overrides.",
      -        "type": "string"
      -      },
      -      "op": {
      -        "const": "iconColor",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "op",
      -      "iconId",
      -      "color"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "op": {
      +        "const": "text",
      +        "type": "string"
      +      },
      +      "values": {
      +        "additionalProperties": {
      +          "type": "string"
      +        },
      +        "description": "{ \"<a text_ token from uichemy_get_page>\": \"New headline\" } - never an invented token",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "values"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "op": {
      +        "const": "images",
      +        "type": "string"
      +      },
      +      "values": {
      +        "additionalProperties": {
      +          "type": "string"
      +        },
      +        "description": "{ \"image_url_v9y4k1\": \"https://…\" }",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "values"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "op": {
      +        "const": "sectionSurface",
      +        "type": "string"
      +      },
      +      "overlay": {
      +        "enum": [
      +          "black",
      +          "off",
      +          "reset"
      +        ],
      +        "type": "string"
      +      },
      +      "overlayOpacity": {
      +        "maximum": 0.9,
      +        "minimum": 0.1,
      +        "type": "number"
      +      },
      +      "padding": {
      +        "description": "A multiplier of the section rhythm. 1 resets.",
      +        "maximum": 4,
      +        "minimum": 0.25,
      +        "type": "number"
      +      },
      +      "sectionKey": {
      +        "description": "A key from uichemy_list_section_backgrounds.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "sectionKey"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "href": {
      +        "description": "https://…, /path, #anchor, mailto:, tel:, or \"\" to clear.",
      +        "type": "string"
      +      },
      +      "key": {
      +        "description": "A text_… or icon_url_… key, from uichemy_list_links.",
      +        "type": "string"
      +      },
      +      "newTab": {
      +        "type": "boolean"
      +      },
      +      "op": {
      +        "const": "link",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "key",
      +      "href"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "buttonKey": {
      +        "description": "A text_… or icon_url_… key, from uichemy_get_page.",
      +        "type": "string"
      +      },
      +      "op": {
      +        "const": "buttonRole",
      +        "type": "string"
      +      },
      +      "role": {
      +        "enum": [
      +          "primary",
      +          "secondary",
      +          "tertiary",
      +          "reset"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "buttonKey",
      +      "role"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "badgeKey": {
      +        "description": "A text_… key, from uichemy_get_page.",
      +        "type": "string"
      +      },
      +      "design": {
      +        "description": "1 Outline · 2 Solid · 3 Soft · 4 Dot · 5 Underline · 0 resets.",
      +        "maximum": 5,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "op": {
      +        "const": "badgeDesign",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "badgeKey",
      +      "design"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "op": {
      +        "const": "videos",
      +        "type": "string"
      +      },
      +      "values": {
      +        "additionalProperties": {
      +          "properties": {
      +            "poster": {
      +              "type": "string"
      +            },
      +            "src": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "src"
      +          ],
      +          "type": "object"
      +        },
      +        "description": "{ \"video_url_e6v0a3\": { \"src\": \"https://…/clip.mp4\" } }",
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "values"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "align": {
      +        "enum": [
      +          "left",
      +          "center",
      +          "right"
      +        ],
      +        "type": "string"
      +      },
      +      "colorRole": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "properties": {
      +              "role": {
      +                "type": "string"
      +              },
      +              "step": {
      +                "maximum": 9,
      +                "minimum": 0,
      +                "type": "integer"
      +              }
      +            },
      +            "required": [
      +              "role",
      +              "step"
      +            ],
      +            "type": "object"
      +          }
      +        ],
      +        "description": "A role (\"primary\", \"titleLight\" …), { role, step } for a ramp shade, or \"#RRGGBB\"."
      +      },
      +      "hoverColorRole": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "properties": {
      +              "role": {
      +                "type": "string"
      +              },
      +              "step": {
      +                "maximum": 9,
      +                "minimum": 0,
      +                "type": "integer"
      +              }
      +            },
      +            "required": [
      +              "role",
      +              "step"
      +            ],
      +            "type": "object"
      +          }
      +        ]
      +      },
      +      "op": {
      +        "const": "textStyle",
      +        "type": "string"
      +      },
      +      "sizeKey": {
      +        "description": "heading-xs|sm|md|lg|xl|2xl|3xl|4xl|5xl, or body-sm|md|lg|xl.",
      +        "type": "string"
      +      },
      +      "tag": {
      +        "enum": [
      +          "h1",
      +          "h2",
      +          "h3",
      +          "h4",
      +          "h5",
      +          "h6",
      +          "p"
      +        ],
      +        "type": "string"
      +      },
      +      "textKey": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "textKey"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "alt": {
      +        "type": "string"
      +      },
      +      "op": {
      +        "const": "imageDisplay",
      +        "type": "string"
      +      },
      +      "overlay": {
      +        "enum": [
      +          "yes",
      +          "no"
      +        ],
      +        "type": "string"
      +      },
      +      "position": {
      +        "enum": [
      +          "center",
      +          "left",
      +          "right",
      +          "top",
      +          "bottom"
      +        ],
      +        "type": "string"
      +      },
      +      "ratio": {
      +        "enum": [
      +          "original",
      +          "1:1",
      +          "4:3",
      +          "16:9",
      +          "3:2"
      +        ],
      +        "type": "string"
      +      },
      +      "slot": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "slot"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "color": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "properties": {
      +              "role": {
      +                "type": "string"
      +              },
      +              "step": {
      +                "maximum": 9,
      +                "minimum": 0,
      +                "type": "integer"
      +              }
      +            },
      +            "required": [
      +              "role",
      +              "step"
      +            ],
      +            "type": "object"
      +          }
      +        ],
      +        "description": "A role, { role, step } on its ramp, or #hex."
      +      },
      +      "hex": {
      +        "type": "string"
      +      },
      +      "op": {
      +        "const": "sectionBackground",
      +        "type": "string"
      +      },
      +      "sectionKey": {
      +        "description": "A key from uichemy_list_section_backgrounds.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "sectionKey"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "iconId": {
      +        "type": "string"
      +      },
      +      "op": {
      +        "const": "icon",
      +        "type": "string"
      +      },
      +      "value": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "iconId",
      +      "value"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "color": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "properties": {
      +              "role": {
      +                "type": "string"
      +              },
      +              "step": {
      +                "maximum": 9,
      +                "minimum": 0,
      +                "type": "integer"
      +              }
      +            },
      +            "required": [
      +              "role",
      +              "step"
      +            ],
      +            "type": "object"
      +          }
      +        ],
      +        "description": "A role, { role, step }, #hex, or \"auto\" to follow the section again."
      +      },
      +      "iconId": {
      +        "description": "An icon_url_… label or a key from uichemy_list_icon_overrides.",
      +        "type": "string"
      +      },
      +      "op": {
      +        "const": "iconColor",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "op",
      +      "iconId",
      +      "color"
      +    ],
      +    "type": "object"
      +  }
      +]
  2. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=false and destructiveHint=true, and the description goes well beyond them: it discloses ALL-OR-NOTHING atomicity, that one invalid op rejects the entire batch with nothing written, that every problem is named so the batch can be resent, and that a mid-sequence failure in the non-batch path can leave partial state with no record of where it stopped. That is exactly the pre-call risk information an agent needs for a destructive mutation.

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 claim, then the rationale, then the atomicity guarantee, then a targeted note on the `link` op. The "fourteen changes applied and no record of where it stopped" phrasing is rhetorical but does concrete work by making the partial-write failure mode vivid. Slightly longer than strictly necessary.

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 batch mutation with no output schema, the description covers what an agent must know before calling: atomic failure semantics, error reporting shape (each problem named), coexistence with concurrent editors, and where op keys come from. The remaining gaps — batch size ceiling and projectId scoping — are visible in the schema and enums, so nothing critical is missing.

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?

Top-level coverage is nominally 0% (neither projectId nor ops is described), but the nested schema carries strong inline descriptions, enums and examples for the op variants. The description adds cross-field meaning the schema does not: it explains that `link` targets a text_…/icon_url_… key sourced from uichemy_list_links and is equivalent to uichemy_set_link. It does not address the 200-item batch cap or projectId scope, so it falls just short of full compensation.

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?

The opening line gives a specific verb and resource — "Many edits in ONE write" — then enumerates the edit families it covers (copy, pictures, video clips, text styles, button roles, badges, image display, section backgrounds, icons). It also names the single-op alternatives it replaces, so an agent can distinguish it from uichemy_set_text, uichemy_set_images, uichemy_set_link and the rest of the sibling set 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?

Explicitly instructs "Prefer this to calling the single tools thirty times" and gives the reason: per-call revisions raise collision risk with concurrent browser editors. It also routes a specific sub-case: the `link` op behaves like uichemy_set_link and keys come from uichemy_list_links. When-to-use and the alternative are both stated.

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