Skip to main content
Glama

HTML/CSS to Image API

Create a Template

create_template

Saves a reusable HTML/CSS image template for rendering multiple images with different values. Put Handlebars placeholders such as {{title}} in the HTML; substitutions are evaluated in HTML only. Returns item.template_id and item.template_version. Call create_templated_image with that ID and template_values to render an image. Use create_image for a single image from supplied HTML/CSS, or update_template to revise an existing template.

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": {
      "content": "<content>"
    },
    "name": "create_template"
  }
}

Input Schema

NameRequiredDescriptionDefault
contentYesTemplate HTML, optional CSS, name, description, and rendering defaults. Choose a recognizable name for later list_templates calls. Use content.selector to crop to a specific element and give that element explicit dimensions for fixed-size images. For an exact browser viewport, set both viewport_width and viewport_height; this disables automatic cropping.

Output Schema

NameRequiredDescriptionDefault
itemNoOperation result. Check success before using this value.
errorNoError details when the operation failed; null on success.
successNoWhether the operation succeeded. If false, inspect error before retrying.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedInput schema / properties / content / properties / pdf_options
      Added value: +{
      +  "description": "Options used when generating a PDF instead of an image. Page dimensions and margins must include supported PDF units; margins must contain either zero or four values; scale must be between 0.1 and 2.",
      +  "properties": {
      +    "margins": {
      +      "description": "Margins of the webpage rendering. Defaults to 0. 4 values must be supplied: top, right, bottom, left. Units are px, cm, in, mm, or pt.",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": [
      +        "array",
      +        "null"
      +      ]
      +    },
      +    "page_height": {
      +      "description": "Height of the page, with unit (px, in, cm, mm, pt)",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "page_width": {
      +      "description": "Width of the page, with unit (px, in, cm, mm, pt)",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "print_background": {
      +      "description": "Print background graphics.",
      +      "type": "boolean"
      +    },
      +    "scale": {
      +      "description": "Scale of the webpage rendering. Defaults to 1.",
      +      "maximum": 2,
      +      "minimum": 0.1,
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    }
      +  },
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
  2. Changed1 schema field changed
    • addedInput schema / properties / content / properties / request_overrides
      Added value: +{
      +  "description": "An array of request rules. Use `action: \"block\"` with a `url` wildcard pattern (using `*`) and/or `resource_types` as an array of resource names, such as `image`, `script`, or `xhr`. Both matchers must match when supplied together; any matching block rule blocks the request. Omitted, `null`, or `[]` adds no overrides. Requires a paid plan. Accepts a JSON array in JSON requests or a JSON-encoded array string in form requests. Maximum 100 rules and 512 characters per URL pattern. Each block rule requires a nonempty URL pattern or at least one resource type; supplied matchers cannot be empty.",
      +  "items": {
      +    "anyOf": [
      +      {
      +        "properties": {
      +          "action": {
      +            "const": "block"
      +          },
      +          "resource_types": {
      +            "description": "Resource types to match, supplied as an array of names, such as image, script, xhr, or fetch. Any listed type may match. When url is also supplied, it must match too.",
      +            "items": {
      +              "enum": [
      +                "beacon",
      +                "document",
      +                "stylesheet",
      +                "image",
      +                "image_set",
      +                "media",
      +                "font",
      +                "script",
      +                "text_track",
      +                "xhr",
      +                "fetch",
      +                "event_source",
      +                "manifest",
      +                "ping",
      +                "img",
      +                "other"
      +              ],
      +              "type": "string"
      +            },
      +            "type": [
      +              "array",
      +              "null"
      +            ]
      +          },
      +          "url": {
      +            "description": "URL wildcard pattern to match, using * for any sequence of characters. When resource_types is also supplied, both matchers must match.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          }
      +        }
      +      }
      +    ],
      +    "description": "A browser request override. The action discriminator selects the rule type; currently only block is supported.",
      +    "required": [
      +      "action"
      +    ],
      +    "type": "object"
      +  },
      +  "type": [
      +    "array",
      +    "null"
      +  ]
      +}
  3. Changed1 schema field changed
    • changedInput schema / properties / content / properties / disable_twemoji / description
      Previous value: -"Use native Linux emoji rendering instead of HCTI's consistent Twemoji images. Leave `disable_twemoji` unset unless native emoji rendering is specifically needed."New value: +"Twemoji is enabled by default for images rendered from the template. Set `disable_twemoji: true` to disable automatic emoji replacement. Omitted, `null`, or `false` keeps Twemoji enabled."
  4. Changed5 schema fields changed
    • changedInput schema / properties / content / description
      Previous value: -"Template HTML, CSS, render options, name, and metadata. For fixed-size templates, use selector and give the selected element explicit dimensions."New value: +"Template HTML, optional CSS, name, description, and rendering defaults. Choose a recognizable name for later list_templates calls. Use content.selector to crop to a specific element and give that element explicit dimensions for fixed-size images. For an exact browser viewport, set both viewport_width and viewport_height; this disables automatic cropping."
    • addedInput schema / properties / content / properties / selector
      Added value: +{
      +  "description": "Crop the image to the element matching this CSS selector. Prefer a unique, stable ID such as `#card` when possible.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / error / description
      Added value: +"Error details when the operation failed; null on success."
    • addedOutput schema / properties / item / description
      Added value: +"Operation result. Check success before using this value."
    • addedOutput schema / properties / success / description
      Added value: +"Whether the operation succeeded. If false, inspect error before retrying."
  5. First observed

TDQS

A4.5/5.0
Behavior4/5

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

Annotations cover the safety profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false), and the description adds useful non-annotation context: that new ids/versions are returned and that Handlebars substitution happens in HTML only. It doesn't discuss permissions or quota behavior, but for a non-destructive create the added context is solid.

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

Conciseness5/5

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

Four tight sentences that front-load what the tool does, then the placeholder behavior, return values, and sibling routing. No filler; each sentence earns its place.

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?

An output schema exists so return values needn't be fully explained, yet the description still names the key returned fields (item.template_id, item.template_version) and the follow-up call, completing the create-then-render workflow. Nothing needed to invoke this correctly is missing.

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 coverage is 100% and the single nested content object is thoroughly described in the schema itself. The description's mention of Handlebars placeholders and HTML-only evaluation largely restates guidance already present in the css/html field descriptions, so it adds little beyond the schema baseline.

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 description states a specific verb and resource ('Saves a reusable HTML/CSS image template for rendering multiple images with different values') and explicitly distinguishes itself from create_image (single image) and update_template (revise existing). An agent can identify this as the template-creation tool 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?

It gives explicit downstream routing: call create_templated_image with the returned ID and template_values to render, use create_image for a single image, and update_template to revise. Both when-to-use and the alternatives are named.

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.