Skip to main content
Glama

capture

Idempotent

Take viewport, camera, quad, flipbook, sheet, or movie images of a Houdini scene to visually verify node results before reporting a task is done.

Instructions

Make a picture of the scene and look at it.

Use it to confirm your own work: numbers in a node do not tell you that the
result looks wrong. Use it before you report that a task is done.

Do not use it for a final picture: render does that through a ROP.

The view goes back to where the user left it when the picture is written.
Nothing here changes the scene for good.

mode:
    "viewport" — the viewport as it is now.
    "quad"     — four pictures: top, front, right and perspective.
    "camera"   — through the camera node at `camera`.
    "flipbook" — a sequence over `frame_range` [start, end]. Returns the
                 path of the files, not a picture.
    "sheet"    — `node` at many frames on one picture, a tile for each
                 frame with its number, all from one camera that does not
                 move. Frames: `frames`, or `count` frames from `start`
                 (the current frame) at `step` (1). A step over 2 hides
                 movement and gives a warning: look at a short range at
                 step 1. `reference` is a picture to put first, to
                 compare. `columns`, `tile_width` set the grid. The
                 frames cook in order, forward, and the result gives
                 the cook seconds of each one.
    "movie"    — `node` over `frames` or `frame_range` (the playbar
                 range) as an MP4 at `fps`, `resolution` [width] wide.
                 Returns the path; open it in a player.
    Both draw with an OpenGL ROP, with or without a window, over a flat
    grey `background`. To see where a point attribute lives, use
    "sheet" with one frame and `color_by`, with `contour`, `slab` or
    `vectors`.

A Houdini with no window has no viewport, and there an OpenGL ROP draws the
same picture from the same arguments over a grey background. It runs in a
new hython, so the scene gets no camera and no ROP.

There is no picture of the network editor: every Houdini pane is a native
GL drawable, and Qt draws nothing into it. Read the graph with node_inspect.

Aim the view with `frame` and `fill`, with `target`, `look_from` and
`radius`, with `direction`, with `azimuth` and `elevation`, or with
`camera`.

Returns the picture, plus JSON with the state of the window: the frame, the
open file, the selection, the network in front, and which nodes carry the
display, the render and the template flag. A picture that does not change
after an edit is almost always a display flag on another node.

Houdini without a GUI has no viewport: then the result says so and names
the next action.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
fpsNomovie: frames per second.
fillNoHow much of the picture the framed thing takes: 0.9 leaves air around it, 1.0 fills it.
modeNoOne of "viewport", "quad", "camera", "flipbook", "sheet", "movie".viewport
nodeNoThe node to look at. It gets the display flag for the picture, and the flag goes back after. The viewer shows its network, and goes back after. Without `frame`, the view also frames it.
slabNo[axis, thickness], for example ["z", 0.1]: draw only the points in a thin cut through the middle, so the inside of a solid cloud shows.
stepNosheet: the frames between tiles. Over 2 hides movement and gives a warning.
countNosheet: how many tiles, when frames is not given.
frameNoWhat to frame the view on: "selection", "all", or a node path (the box of what that node cooked).
startNosheet: the first frame. Without it, the current frame.
cameraNocamera mode: the camera node to look through. On a LOP network with `renderer`, a USD camera prim.
framesNoOne frame, a list, or {"start": 1, "end": 10, "step": 2}: one picture for each. sheet: the frames of the tiles. The playbar goes back after. A picture that holds only the background is an error.
outputNoThe file to write. Without it, a temporary file.
radiusNoThe distance between target and look_from.
settleNoSeconds that a renderer such as Karma draws before each picture. Karma starts from noise: 20 to 30 gives a clean frame. With frames or in flipbook mode it renders a sequence through the viewport, with no husk and no render license.
targetNo[x, y, z]: the point that the view turns around.
azimuthNoDegrees around the up axis, around what the view frames. 0 looks from the front. Nothing is added to the scene.
columnsNosheet: tiles in each row.
contourNosheet: a step. Colour by the fraction of the value over the step, so the lines of equal value show, for example the shells of a distance field.
shadingNoOne of "smooth", "smooth_wire", "flat", "wireframe".
vectorsNosheet: a scale. Draw a line along the color_by vector from up to about 3000 points. An empty result is an error.
color_byNosheet and movie: colour the points by this attribute, blue at the low end of color_range and red at the high end. A vector uses its length.
rendererNoThe Hydra renderer of a viewer on a LOP network, for example "Karma CPU". An unknown name lists the ones available.
directionNoThe view axis: "top", "front", "left", "right", "back", "bottom" or "persp".
elevationNoDegrees above the ground, with azimuth. 30 with azimuth 45 is a three-quarter view.
look_fromNo[x, y, z]: the point that the view looks from.
referenceNosheet: a picture file to put in the first tile, to compare.
backgroundNosheet and movie: the grey of the background, 0-255. Smoke reads best on mid grey.
resolutionNo[width, height] in pixels. The height follows the shape of the viewport, so the picture is not stretched.
tile_widthNosheet: the width of each tile in pixels.
color_rangeNo[low, high] for color_by. Without it, [0, 1].
frame_rangeNoflipbook and movie: [start, end].

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed154 schema fields changedv0.7.3
    • removedInput schema / properties / azimuth / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedInput schema / properties / azimuth / default
      Removed value: -null
    • addedInput schema / properties / azimuth / description
      Added value: +"Degrees around the up axis, around what the view frames. 0 looks from the front. Nothing is added to the scene."
    • removedInput schema / properties / azimuth / title
      Removed value: -"Azimuth"
    • addedInput schema / properties / azimuth / type
      Added value: +"number"
    • removedInput schema / properties / background / anyOf
      Removed value: -[
      -  {
      -    "type": "integer"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / background / description
      Added value: +"sheet and movie: the grey of the background, 0-255. Smoke reads best on mid grey."
    • removedInput schema / properties / background / title
      Removed value: -"Background"
    • addedInput schema / properties / background / type
      Added value: +"integer"
    • removedInput schema / properties / camera / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedInput schema / properties / camera / default
      Removed value: -null
    • addedInput schema / properties / camera / description
      Added value: +"camera mode: the camera node to look through. On a LOP network with `renderer`, a USD camera prim."
    • removedInput schema / properties / camera / title
      Removed value: -"Camera"
    • addedInput schema / properties / camera / type
      Added value: +"string"
    • removedInput schema / properties / color_by / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedInput schema / properties / color_by / default
      Removed value: -null
    • addedInput schema / properties / color_by / description
      Added value: +"sheet and movie: colour the points by this attribute, blue at the low end of color_range and red at the high end. A vector uses its length."
    • removedInput schema / properties / color_by / title
      Removed value: -"Color By"
    • addedInput schema / properties / color_by / type
      Added value: +"string"
    • removedInput schema / properties / color_range / anyOf
      Removed value: -[
      -  {
      -    "items": {
      -      "type": "number"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedInput schema / properties / color_range / default
      Removed value: -null
    • addedInput schema / properties / color_range / description
      Added value: +"[low, high] for color_by. Without it, [0, 1]."
    • addedInput schema / properties / color_range / items
      Added value: +{
      +  "type": "number"
      +}
    • removedInput schema / properties / color_range / title
      Removed value: -"Color Range"
    • addedInput schema / properties / color_range / type
      Added value: +"array"
    • removedInput schema / properties / columns / anyOf
      Removed value: -[
      -  {
      -    "type": "integer"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedInput schema / properties / columns / default
      Removed value: -null
    • addedInput schema / properties / columns / description
      Added value: +"sheet: tiles in each row."
    • removedInput schema / properties / columns / title
      Removed value: -"Columns"
    • addedInput schema / properties / columns / type
      Added value: +"integer"
    • removedInput schema / properties / contour / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedInput schema / properties / contour / default
      Removed value: -null
    • addedInput schema / properties / contour / description
      Added value: +"sheet: a step. Colour by the fraction of the value over the step, so the lines of equal value show, for example the shells of a distance field."
    • removedInput schema / properties / contour / title
      Removed value: -"Contour"
    • addedInput schema / properties / contour / type
      Added value: +"number"
    • removedInput schema / properties / count / anyOf
      Removed value: -[
      -  {
      -    "type": "integer"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / count / description
      Added value: +"sheet: how many tiles, when frames is not given."
    • removedInput schema / properties / count / title
      Removed value: -"Count"
    • addedInput schema / properties / count / type
      Added value: +"integer"
    • removedInput schema / properties / direction / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedInput schema / properties / direction / default
      Removed value: -null
    • addedInput schema / properties / direction / description
      Added value: +"The view axis: \"top\", \"front\", \"left\", \"right\", \"back\", \"bottom\" or \"persp\"."
    • removedInput schema / properties / direction / title
      Removed value: -"Direction"
    • addedInput schema / properties / direction / type
      Added value: +"string"
    • removedInput schema / properties / elevation / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedInput schema / properties / elevation / default
      Removed value: -null
    • addedInput schema / properties / elevation / description
      Added value: +"Degrees above the ground, with azimuth. 30 with azimuth 45 is a three-quarter view."
    • removedInput schema / properties / elevation / title
      Removed value: -"Elevation"
    • addedInput schema / properties / elevation / type
      Added value: +"number"
    • removedInput schema / properties / fill / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / fill / description
      Added value: +"How much of the picture the framed thing takes: 0.9 leaves air around it, 1.0 fills it."
    • removedInput schema / properties / fill / title
      Removed value: -"Fill"
    • addedInput schema / properties / fill / type
      Added value: +"number"
    • removedInput schema / properties / fps / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / fps / description
      Added value: +"movie: frames per second."
    • removedInput schema / properties / fps / title
      Removed value: -"Fps"
    • addedInput schema / properties / fps / type
      Added value: +"number"
    • removedInput schema / properties / frame / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedInput schema / properties / frame / default
      Removed value: -null
    • addedInput schema / properties / frame / description
      Added value: +"What to frame the view on: \"selection\", \"all\", or a node path (the box of what that node cooked)."
    • removedInput schema / properties / frame / title
      Removed value: -"Frame"
    • addedInput schema / properties / frame / type
      Added value: +"string"
    • removedInput schema / properties / frame_range / anyOf
      Removed value: -[
      -  {
      -    "items": {
      -      "type": "number"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedInput schema / properties / frame_range / default
      Removed value: -null
    • addedInput schema / properties / frame_range / description
      Added value: +"flipbook and movie: [start, end]."
    • addedInput schema / properties / frame_range / items
      Added value: +{
      +  "type": "number"
      +}
    • removedInput schema / properties / frame_range / title
      Removed value: -"Frame Range"
    • addedInput schema / properties / frame_range / type
      Added value: +"array"
    • changedInput schema / properties / frames / anyOf
      Previous value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "items": {
      -      "type": "number"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "additionalProperties": {
      -      "type": "number"
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "type": "number"
      +  },
      +  {
      +    "items": {
      +      "type": "number"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "additionalProperties": {
      +      "type": "number"
      +    },
      +    "type": "object"
      +  }
      +]
    • removedInput schema / properties / frames / default
      Removed value: -null
    • addedInput schema / properties / frames / description
      Added value: +"One frame, a list, or {\"start\": 1, \"end\": 10, \"step\": 2}: one picture for each. sheet: the frames of the tiles. The playbar goes back after. A picture that holds only the background is an error."
    • removedInput schema / properties / frames / title
      Removed value: -"Frames"
    • removedInput schema / properties / look_from / anyOf
      Removed value: -[
      -  {
      -    "items": {
      -      "type": "number"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedInput schema / properties / look_from / default
      Removed value: -null
    • addedInput schema / properties / look_from / description
      Added value: +"[x, y, z]: the point that the view looks from."
    • addedInput schema / properties / look_from / items
      Added value: +{
      +  "type": "number"
      +}
    • removedInput schema / properties / look_from / title
      Removed value: -"Look From"
    • addedInput schema / properties / look_from / type
      Added value: +"array"
    • removedInput schema / properties / mode / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / mode / description
      Added value: +"One of \"viewport\", \"quad\", \"camera\", \"flipbook\", \"sheet\", \"movie\"."
    • removedInput schema / properties / mode / title
      Removed value: -"Mode"
    • addedInput schema / properties / mode / type
      Added value: +"string"
    • removedInput schema / properties / node / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedInput schema / properties / node / default
      Removed value: -null
    • addedInput schema / properties / node / description
      Added value: +"The node to look at. It gets the display flag for the picture, and the flag goes back after. The viewer shows its network, and goes back after. Without `frame`, the view also frames it."
    • removedInput schema / properties / node / title
      Removed value: -"Node"
    • addedInput schema / properties / node / type
      Added value: +"string"
    • removedInput schema / properties / output / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedInput schema / properties / output / default
      Removed value: -null
    • addedInput schema / properties / output / description
      Added value: +"The file to write. Without it, a temporary file."
    • removedInput schema / properties / output / title
      Removed value: -"Output"
    • addedInput schema / properties / output / type
      Added value: +"string"
    • removedInput schema / properties / radius / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedInput schema / properties / radius / default
      Removed value: -null
    • addedInput schema / properties / radius / description
      Added value: +"The distance between target and look_from."
    • removedInput schema / properties / radius / title
      Removed value: -"Radius"
    • addedInput schema / properties / radius / type
      Added value: +"number"
    • removedInput schema / properties / reference / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedInput schema / properties / reference / default
      Removed value: -null
    • addedInput schema / properties / reference / description
      Added value: +"sheet: a picture file to put in the first tile, to compare."
    • removedInput schema / properties / reference / title
      Removed value: -"Reference"
    • addedInput schema / properties / reference / type
      Added value: +"string"
    • removedInput schema / properties / renderer / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedInput schema / properties / renderer / default
      Removed value: -null
    • addedInput schema / properties / renderer / description
      Added value: +"The Hydra renderer of a viewer on a LOP network, for example \"Karma CPU\". An unknown name lists the ones available."
    • removedInput schema / properties / renderer / title
      Removed value: -"Renderer"
    • addedInput schema / properties / renderer / type
      Added value: +"string"
    • removedInput schema / properties / resolution / anyOf
      Removed value: -[
      -  {
      -    "items": {
      -      "type": "integer"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedInput schema / properties / resolution / default
      Removed value: -null
    • addedInput schema / properties / resolution / description
      Added value: +"[width, height] in pixels. The height follows the shape of the viewport, so the picture is not stretched."
    • addedInput schema / properties / resolution / items
      Added value: +{
      +  "type": "integer"
      +}
    • removedInput schema / properties / resolution / title
      Removed value: -"Resolution"
    • addedInput schema / properties / resolution / type
      Added value: +"array"
    • removedInput schema / properties / settle / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedInput schema / properties / settle / default
      Removed value: -null
    • addedInput schema / properties / settle / description
      Added value: +"Seconds that a renderer such as Karma draws before each picture. Karma starts from noise: 20 to 30 gives a clean frame. With frames or in flipbook mode it renders a sequence through the viewport, with no husk and no render license."
    • removedInput schema / properties / settle / title
      Removed value: -"Settle"
    • addedInput schema / properties / settle / type
      Added value: +"number"
    • removedInput schema / properties / shading / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedInput schema / properties / shading / default
      Removed value: -null
    • addedInput schema / properties / shading / description
      Added value: +"One of \"smooth\", \"smooth_wire\", \"flat\", \"wireframe\"."
    • removedInput schema / properties / shading / title
      Removed value: -"Shading"
    • addedInput schema / properties / shading / type
      Added value: +"string"
    • removedInput schema / properties / slab / anyOf
      Removed value: -[
      -  {
      -    "items": {
      -      "anyOf": [
      -        {
      -          "type": "string"
      -        },
      -        {
      -          "type": "number"
      -        }
      -      ]
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedInput schema / properties / slab / default
      Removed value: -null
    • addedInput schema / properties / slab / description
      Added value: +"[axis, thickness], for example [\"z\", 0.1]: draw only the points in a thin cut through the middle, so the inside of a solid cloud shows."
    • addedInput schema / properties / slab / items
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "number"
      +    }
      +  ]
      +}
    • removedInput schema / properties / slab / title
      Removed value: -"Slab"
    • addedInput schema / properties / slab / type
      Added value: +"array"
    • removedInput schema / properties / start / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedInput schema / properties / start / default
      Removed value: -null
    • addedInput schema / properties / start / description
      Added value: +"sheet: the first frame. Without it, the current frame."
    • removedInput schema / properties / start / title
      Removed value: -"Start"
    • addedInput schema / properties / start / type
      Added value: +"number"
    • removedInput schema / properties / step / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / step / description
      Added value: +"sheet: the frames between tiles. Over 2 hides movement and gives a warning."
    • removedInput schema / properties / step / title
      Removed value: -"Step"
    • addedInput schema / properties / step / type
      Added value: +"number"
    • removedInput schema / properties / target / anyOf
      Removed value: -[
      -  {
      -    "items": {
      -      "type": "number"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedInput schema / properties / target / default
      Removed value: -null
    • addedInput schema / properties / target / description
      Added value: +"[x, y, z]: the point that the view turns around."
    • addedInput schema / properties / target / items
      Added value: +{
      +  "type": "number"
      +}
    • removedInput schema / properties / target / title
      Removed value: -"Target"
    • addedInput schema / properties / target / type
      Added value: +"array"
    • removedInput schema / properties / tile_width / anyOf
      Removed value: -[
      -  {
      -    "type": "integer"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / tile_width / description
      Added value: +"sheet: the width of each tile in pixels."
    • removedInput schema / properties / tile_width / title
      Removed value: -"Tile Width"
    • addedInput schema / properties / tile_width / type
      Added value: +"integer"
    • removedInput schema / properties / vectors / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedInput schema / properties / vectors / default
      Removed value: -null
    • addedInput schema / properties / vectors / description
      Added value: +"sheet: a scale. Draw a line along the color_by vector from up to about 3000 points. An empty result is an error."
    • removedInput schema / properties / vectors / title
      Removed value: -"Vectors"
    • addedInput schema / properties / vectors / type
      Added value: +"number"
    • removedInput schema / title
      Removed value: -"toolArguments"
  2. Addedv0.1.1

TDQS

A4.7/5.0
Behavior5/5

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

Goes well beyond the annotations: it discloses that the view and display flag are restored afterward ('Nothing here changes the scene for good'), that headless Houdini has no viewport and runs in a new hython with no camera or ROP, that flipbook/movie return paths rather than pictures, that frames cook in order, and that certain inputs emit warnings. This is exactly the temporary-mutation nuance that the readOnlyHint=false/destructiveHint=false annotations only hint at.

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

Conciseness3/5

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

Front-loaded purpose and mode list are good, but the prose is long and stylistically loose, and the headless 'no window has no viewport' point is made twice (once in the mode block, once later), which is wasted space for a 31-parameter tool.

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?

No output schema exists, yet the description explains the return (the picture plus JSON with frame, open file, selection, visible network, and display/render/template flags) and the headless failure path that names the next action. For a zero-required-parameter tool with 100% schema coverage, the agent has what it needs.

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 baseline would be 3, but the description adds real cross-parameter routing the schema lacks: which parameters each mode consumes (sheet uses count/start/step/columns/tile_width, movie uses fps/frame_range/resolution), that step>2 hides movement and warns, and the aiming-equivalents among frame/fill/target/azimuth/elevation/camera. It stops short of documenting every parameter, so not a 5.

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 concrete verb+resource ('Make a picture of the scene and look at it') and immediately distinguishes itself from the sibling that would otherwise be confusable, render, plus node_inspect for graph reading. An agent can pick this over render without opening either 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 explicit when-to-use ('confirm your own work', 'before you report that a task is done'), an explicit when-not ('Do not use it for a final picture: render does that through a ROP'), and names the alternative for the network-editor case. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.