Skip to main content
Glama

generate_license_plate_frame

Creates a custom US or EU license plate frame with debossed text and mount slots, then opens an interactive 3D preview for orbit and zoom.

Instructions

Generate a license plate frame for a US or EU plate. Opens Kiln's interactive inline 3D stage on the result (orbit/zoom panel in MCP Apps hosts; hosted sessions add a browser stage link). MAKE DOORS: design_session, Kiln's front door for making an object, is not installed here (signed in to Kiln it runs on Kiln's servers). On this install compile_scad IS the make → preview → iterate loop: make it, show the preview, iterate.

INLINE 3D STAGE: on success this tool opens Kiln's interactive 3D stage — an inline viewer panel the user can orbit, zoom, and turn over — in hosts that render MCP Apps panels (Kiln's hosted connection attaches a browser stage link for hosts that don't). Oversized meshes are decimated automatically for the stage; the PNG preview is the floor, not the whole experience.

Tool call template

This tool declares no required parameters. Add optional parameters from the input schema as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {},
    "name": "generate_license_plate_frame"
  }
}

Input Schema

NameRequiredDescriptionDefault
fontNoOpenSCAD font spec. Default: "Liberation Sans:style=Bold".
sizeNoSize preset — ``"us_standard"`` (default), ``"eu_standard"`` (520x110mm) or ``"eu_tall"`` (340x200mm). The preset fills in only what you left alone, so an explicit argument always wins. Default: "".
brief_idNoOptional saved-goal id from ``design_session``. When supplied, the produced mesh gets a ``design_brief:<id>`` intent sidecar so the audit's "matches what you asked for" gate, the brief failure_history wiring, and the ``compare_design_versions`` intent diff all light up against the saved goal. Omit to skip — REST callers without a goal still get an auto-inferred brief at dispatch time. Default: "".
materialNoMaterial (default ASA). Default: "ASA".
top_textNoDebossed text on the top rail (empty = none). Default: "".
width_mmNoFrame outer width (default 317.5). Default: 317.5.
height_mmNoFrame outer height (default 165.1). Default: 165.1.
body_colorNoBody color (default black). Default: "black".
bottom_textNoDebossed text on the bottom rail (empty = none). Default: "".
include_stepNoAlso emit a CAD-exact STEP file. The STEP is REAL analytic B-rep built from the same typed parameters as the mesh — true planes and cylinders a machine shop's CAD opens clean, never a tessellated conversion. On success the response gains a ``step`` block with ``step_path``; both text bands carry the exact fitted sizes the mesh used. The mesh outputs are always unaffected. Default: false.
plate_lip_mmNoHow far the frame reaches over the plate's face, on a plate with no mounting holes of its own (the EU presets). 0 (default) derives it as the mid-point between the overlap needed to retain the plate and the plate's own blank margin, past which a frame covers printed legend. Ignored where the plate's studs already fix the rails. Default: 0.0.
text_size_mmNoFont size in mm; 0 = auto-fit to band. Default: 0.0.
thickness_mmNoFrame thickness (default 5). Default: 5.0.
plate_width_mmNoWidth of the plate to hold (default 304.8 — SAE J686). The window is derived from this. Default: 304.8.
color_overridesNoJSON dict mapping role → color. Default: "".
plate_height_mmNoHeight of the plate to hold (default 152.4 — SAE J686). Default: 152.4.
corner_radius_mmNoOuter corner radius (default 6). Default: 6.0.
mount_hole_spacing_mmNoSlot spacing (default 177.8 — US). An EU preset resets it to 0, which cuts no slots at all; pass your vehicle's own spacing to get them. Default: 177.8.
mount_hole_diameter_mmNoSlot width (default 7, resized for the material). Default: 7.0.
mount_hole_inset_top_mmNoSlot centre below the top edge; 0 (default) derives it — from the plate's stud where there is one, otherwise centred in the frame standing beyond the plate's edge. Default: 0.0.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed20 schema fields changedv1.5.1
    • changedInput schema / properties / body_color / description
      Previous value: -"Default: \"black\"."New value: +"Body color (default black). Default: \"black\"."
    • changedInput schema / properties / bottom_text / description
      Previous value: -"Default: \"\"."New value: +"Debossed text on the bottom rail (empty = none). Default: \"\"."
    • changedInput schema / properties / brief_id / description
      Previous value: -"Default: \"\"."New value: +"Optional saved-goal id from ``design_session``. When supplied, the produced mesh gets a ``design_brief:<id>`` intent sidecar so the audit's \"matches what you asked for\" gate, the brief failure_history wiring, and the ``compare_design_versions`` intent diff all light up against the saved goal.  Omit to skip — REST callers without a goal still get an auto-inferred brief at dispatch time. Default: \"\"."
    • changedInput schema / properties / color_overrides / description
      Previous value: -"Default: \"\"."New value: +"JSON dict mapping role → color. Default: \"\"."
    • changedInput schema / properties / corner_radius_mm / description
      Previous value: -"Default: 6.0."New value: +"Outer corner radius (default 6). Default: 6.0."
    • changedInput schema / properties / font / description
      Previous value: -"Default: \"Liberation Sans:style=Bold\"."New value: +"OpenSCAD font spec. Default: \"Liberation Sans:style=Bold\"."
    • changedInput schema / properties / height_mm / description
      Previous value: -"Default: 165.1."New value: +"Frame outer height (default 165.1). Default: 165.1."
    • changedInput schema / properties / include_step / description
      Previous value: -"Default: false."New value: +"Also emit a CAD-exact STEP file.  The STEP is REAL analytic B-rep built from the same typed parameters as the mesh — true planes and cylinders a machine shop's CAD opens clean, never a tessellated conversion.  On success the response gains a ``step`` block with ``step_path``; both text bands carry the exact fitted sizes the mesh used.  The mesh outputs are always unaffected. Default: false."
    • changedInput schema / properties / material / description
      Previous value: -"Default: \"ASA\"."New value: +"Material (default ASA). Default: \"ASA\"."
    • changedInput schema / properties / mount_hole_diameter_mm / description
      Previous value: -"Default: 7.0."New value: +"Slot width (default 7, resized for the material). Default: 7.0."
    • changedInput schema / properties / mount_hole_inset_top_mm / description
      Previous value: -"Default: 0.0."New value: +"Slot centre below the top edge; 0 (default) derives it — from the plate's stud where there is one, otherwise centred in the frame standing beyond the plate's edge. Default: 0.0."
    • changedInput schema / properties / mount_hole_spacing_mm / description
      Previous value: -"Default: 177.8."New value: +"Slot spacing (default 177.8 — US).  An EU preset resets it to 0, which cuts no slots at all; pass your vehicle's own spacing to get them. Default: 177.8."
    • changedInput schema / properties / plate_height_mm / description
      Previous value: -"Default: 152.4."New value: +"Height of the plate to hold (default 152.4 — SAE J686). Default: 152.4."
    • changedInput schema / properties / plate_lip_mm / description
      Previous value: -"Default: 0.0."New value: +"How far the frame reaches over the plate's face, on a plate with no mounting holes of its own (the EU presets).  0 (default) derives it as the mid-point between the overlap needed to retain the plate and the plate's own blank margin, past which a frame covers printed legend.  Ignored where the plate's studs already fix the rails. Default: 0.0."
    • changedInput schema / properties / plate_width_mm / description
      Previous value: -"Default: 304.8."New value: +"Width of the plate to hold (default 304.8 — SAE J686).  The window is derived from this. Default: 304.8."
    • changedInput schema / properties / size / description
      Previous value: -"Default: \"\"."New value: +"Size preset — ``\"us_standard\"`` (default), ``\"eu_standard\"`` (520x110mm) or ``\"eu_tall\"`` (340x200mm).  The preset fills in only what you left alone, so an explicit argument always wins. Default: \"\"."
    • changedInput schema / properties / text_size_mm / description
      Previous value: -"Default: 0.0."New value: +"Font size in mm; 0 = auto-fit to band. Default: 0.0."
    • changedInput schema / properties / thickness_mm / description
      Previous value: -"Default: 5.0."New value: +"Frame thickness (default 5). Default: 5.0."
    • changedInput schema / properties / top_text / description
      Previous value: -"Default: \"\"."New value: +"Debossed text on the top rail (empty = none). Default: \"\"."
    • changedInput schema / properties / width_mm / description
      Previous value: -"Default: 317.5."New value: +"Frame outer width (default 317.5). Default: 317.5."
  2. Addedv1.5.0

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false and openWorldHint=false, and the description adds real context beyond them: the tool opens an inline orbit/zoom stage on success, falls back to a browser stage link for hosts without MCP Apps, and automatically decimates oversized meshes. It stops short of saying where the generated mesh/preview files land or how long the stage session persists.

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

Conciseness2/5

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

The inline 3D stage is described twice in near-identical terms (once in sentence two, again in the final INLINE 3D STAGE paragraph), and the uppercase "MAKE DOORS" digression about design_session and compile_scad consumes roughly half the text without describing this tool. The genuinely useful content is buried behind meta-commentary.

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 20-parameter generator with no output schema, the description does cover the output experience (stage, PNG floor, decimation), but it omits practical constraints an agent needs: where the mesh is written, whether the call is expensive/slow, and any limits on debossed text length. Space that could have carried that is spent repeating stage information.

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% across 20 params, so the schema already carries the semantics (size presets, plate dimensions, mount hole derivation). The description adds only a weak pointer to brief_id's relationship with design_session, which the schema itself also explains, so this is the baseline 3.

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 first sentence names a specific verb and resource ("Generate a license plate frame") and bounds the scope ("for a US or EU plate"), which is enough to distinguish it from the other object generators in the sibling list such as generate_nameplate or generate_coaster.

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?

The "MAKE DOORS" paragraph explains that design_session is unavailable here and that compile_scad is the make → preview → iterate loop, but that is routing advice about a different tool rather than guidance on when to pick this generator over its siblings. It also never states when a user should not use it (e.g., non-US/EU plates) even though the tool's own header restricts scope to US or EU.

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