Skip to main content
Glama

cook

Destructive

Force Houdini node evaluations over frames, write parameters, manage caches and simulation steps, and report per-frame timings, errors, warnings, and geometry counts.

Instructions

Force work to happen, and report what the work said and what it cost.

Use it to run a test: write a few parameters, cook a range of frames, and
read the seconds for each frame. That is one call, and it is the loop that
every look iteration needs.

Do not use it to read the result: geometry_inspect does that, and it cooks
the node as well.

mode:
    "cook"        — cook the nodes and return the errors, the warnings and
                    the time. `frames` or `frame_range` cooks over more
                    than one frame; the playbar goes back to where it was.
    "cache_write" — write the file cache of the node. frame_range is
                    [start, end]; without it the node writes its own range.
    "cache_clear" — remove the cached files of the node.
    "sim_step"    — step a DOP network num_steps frames.
    "sim_reset"   — clear the cache of a simulation, so that the next cook
                    runs it again. It accepts a DOP network and a solver
                    SOP such as a Pyro, FLIP, Vellum or RBD solver. After
                    you change anything inside a solver, reset it: the node
                    gives its old result back with no error and no warning.
                    On a solver SOP it cooks the sources first, cooks the
                    start frame after the reset, and reports the
                    primitives there. It fails when the result is empty
                    while the sources are not: that simulation stays
                    empty on every frame.

Returns JSON: the seconds in total, for each frame, and the slowest frame,
with the errors and the warnings of every node. Each frame also gives the
point count, the primitive count and the bounds of each SOP: one call
checks that a result moves or grows over a range. `ok` is false when a
node failed to cook, and `failed` then names each node upstream of it or
inside it that holds an error, with the text: the node that broke is
often another node than the one you cooked. A cook can take minutes:
the call waits, and a timeout does not stop the cook. Cook a long range in
parts of a few seconds, so that one call does not block Houdini past the
timeout.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
modeNoOne of "cook", "cache_write", "cache_clear", "sim_step", "sim_reset". The description says what each one does.cook
forceNoCook even when Houdini thinks the node is up to date.
pathsYesThe node to cook, or a list of nodes.
framesNoOne frame, a list of frames, or {"start": 1001, "end": 1010, "step": 2}. For cook. The playbar goes back after.
num_stepsNoHow many frames sim_step steps the DOP network.
parametersNoValues to write before the cook, as {"/obj/geo1/pyro": {"divsize": 0.05}}. The result says which writes changed nothing.
frame_rangeNo[start, end]: every frame between. For cook and cache_write.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
resultYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed31 schema fields changedv0.7.3
    • removedInput schema / properties / force / anyOf
      Removed value: -[
      -  {
      -    "type": "boolean"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / force / description
      Added value: +"Cook even when Houdini thinks the node is up to date."
    • removedInput schema / properties / force / title
      Removed value: -"Force"
    • addedInput schema / properties / force / type
      Added value: +"boolean"
    • 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: +"[start, end]: every frame between. For cook and cache_write."
    • 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 of frames, or {\"start\": 1001, \"end\": 1010, \"step\": 2}. For cook. The playbar goes back after."
    • removedInput schema / properties / frames / title
      Removed value: -"Frames"
    • removedInput schema / properties / mode / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / mode / description
      Added value: +"One of \"cook\", \"cache_write\", \"cache_clear\", \"sim_step\", \"sim_reset\". The description says what each one does."
    • removedInput schema / properties / mode / title
      Removed value: -"Mode"
    • addedInput schema / properties / mode / type
      Added value: +"string"
    • removedInput schema / properties / num_steps / anyOf
      Removed value: -[
      -  {
      -    "type": "integer"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedInput schema / properties / num_steps / description
      Added value: +"How many frames sim_step steps the DOP network."
    • removedInput schema / properties / num_steps / title
      Removed value: -"Num Steps"
    • addedInput schema / properties / num_steps / type
      Added value: +"integer"
    • addedInput schema / properties / parameters / additionalProperties
      Added value: +{
      +  "additionalProperties": true,
      +  "type": "object"
      +}
    • removedInput schema / properties / parameters / anyOf
      Removed value: -[
      -  {
      -    "additionalProperties": {
      -      "additionalProperties": true,
      -      "type": "object"
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedInput schema / properties / parameters / default
      Removed value: -null
    • addedInput schema / properties / parameters / description
      Added value: +"Values to write before the cook, as {\"/obj/geo1/pyro\": {\"divsize\": 0.05}}. The result says which writes changed nothing."
    • removedInput schema / properties / parameters / title
      Removed value: -"Parameters"
    • addedInput schema / properties / parameters / type
      Added value: +"object"
    • addedInput schema / properties / paths / description
      Added value: +"The node to cook, or a list of nodes."
    • removedInput schema / properties / paths / title
      Removed value: -"Paths"
    • removedInput schema / title
      Removed value: -"toolArguments"
  2. Addedv0.1.1

TDQS

A4.8/5.0
Behavior5/5

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

Annotations declare a destructive, non-idempotent mutation, and the description goes well beyond them: it explains playbar restoration, sim_reset's silent-stale-result failure mode, that a timeout does not stop the cook, and that a long cook should be split into parts. It also discloses the `ok`/`failed` upstream-error reporting and empty-simulation failure condition.

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 a one-line summary, then usage, then a mode table, then returns; each section is purposeful. It is dense and occasionally restates schema text (playbar restoration, frame_range semantics), which keeps it from a 5.

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 complex seven-parameter, multi-mode, destructive tool, the description covers every mode's behavior, the return contract, failure semantics, and timeout guidance. Nothing needed to invoke it correctly is missing, even though an output schema already exists.

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, but the description adds real meaning: it explains how mode selects the meaning of frames vs frame_range, that parameters writes report which changes had no effect, and the default range behavior for cache_write. This is above the schema-only 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?

States a specific verb and resource ('Force work to happen, and report what the work said and what it cost') and enumerates the five modes with distinct semantics. It explicitly differentiates itself from the sibling geometry_inspect, so an agent can select it 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 a concrete use case ('run a test: write a few parameters, cook a range of frames, and read the seconds'), and an explicit exclusion ('Do not use it to read the result: geometry_inspect does that, and it cooks the node as well'). When-to-use, when-not, and the alternative are all named.

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