nukebread has 32 tools with explicit JSON schemas and descriptions visible in src/nukebread/plugin/tool_registry.py. Most tools have proper naming (verb-noun pattern), clear descriptions (avg 120-180 chars), and typed input schemas. However, critical gaps exist: (1) Output schemas are completely undocumented, no tool declares what fields are returned, forcing LLMs to infer structure from execution; (2) Many parameters lack descriptions or use vague language ('value' in set_knob has no description of format/constraints); (3) Error handling is absent from all tool descriptions, users don't know what failures look like or how to recover; (4) High-risk tools like execute_python and delete_nodes lack confirmation/dry-run patterns; (5) No pagination support documented for list/search tools despite potential large result sets. Strengths: consistent schema format, good action-verb naming (read_*, create_*, set_*, etc.), adequate parameter typing. Overall quality is above median community server but falls short of production-grade due to missing output documentation and error guidance.
Start a named undo group. All subsequent operations become a single undo step.
Wire from_node's output into to_node's input at the given index.
Create a node. Optionally set knobs, connect to an existing node, or splice inline.
PREFERRED over create_node for multi-node setups. Batch-create nodes in a single call. Each dict: class_name, name, knobs, connect_from (name of earlier node in this list), input_index (0=B-pipe, 1=A-pipe), x, y. Auto-positions vertically when x/y omitted.
Delete the specified nodes with connection safety checks.
Disconnect a node's input. If input_index is None, disconnect all inputs.
Output schemas completely undocumented. No tool declares what fields are returned (structure, types, required vs optional fields). LLMs must execute blindly and infer structure, creating brittleness and token waste.
No error handling guidance in any tool description. LLMs don't know what errors are possible, which are retryable, or what to do next. Descriptions lack 'Raises' or 'Error cases' sections.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 65 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 55 | - | v1 |
Duplicate a node and everything upstream of it.
End the current undo group.
Execute raw Python code in Nuke's script interpreter. Use for bulk operations — e.g. setting multiple knobs, creating complex setups, anything that would otherwise need many individual tool calls. You have full access to the `nuke` module. Store output in a variable named `result` to return it.
Find all nodes of a given class (e.g. 'Merge2', 'Grade', 'Read').
Return all nodes that have errors, with their error messages.
List all available channels at a given node in the pipe.
Return the OCIO config path, working colorspace, and display/view transform.
Return script metadata: name, frame range, format, fps, color management.
Return the current viewer state: active node, channels, exposure, gain.
Render a before/after comparison. Mode: 'wipe', 'diff', or 'side_by_side'.
Render a frame and return it as base64-encoded PNG.
Grab multiple frames for temporal analysis.
Grab a rectangular region of a frame as a base64 image.
List all Read nodes with their file paths, frame ranges, and colorspace settings.
Return the complete node DAG as JSON. Filters out Viewer and BackdropNode noise by default.
Deep dump of every knob and its value on a specific node.
Sample RGBA pixel values at a specific coordinate.
Return currently selected nodes with their upstream and downstream connections.
Swap a node's class while optionally preserving its connections.
Save a timestamped backup of the current script.
Search the comp pattern library for relevant techniques. Use this before building comps to find proven recipes. Categories: color_correction, keying, merge_operations, transform_motion, blur_defocus, 3d_compositing, camera_lens, matte_refinement, tracking, general_recipe.
Set animation keyframes. Each keyframe: {frame, value, interpolation?}.
Write a Nuke expression (TCL or Python) on a knob.
Set any knob value on a node.
Follow the pipe chain from a node. Direction: 'upstream' or 'downstream'.
Undo the last action(s) in Nuke's undo stack.
set_knob parameter 'value' has no description of format, constraints, or allowed types. LLMs cannot infer whether to pass a number, string, list, or Nuke-specific object. Violates pattern:tool-description requirement that every parameter must be described.
High-risk destructive tools (delete_nodes, execute_python) lack dry-run, confirmation, or undo_group wrapping guidance. Agents can inadvertently destroy work without recovery options. Missing pattern:confirmation-request.
List/query tools (list_read_nodes, find_nodes_by_class, get_errors) lack pagination parameters (limit, offset) and result count documentation. Large node graphs could return unbounded results, exhausting context.
Parameter descriptions use vague language: 'Dict of knob_name -> value' (create_node) and 'The value to set (number, string, list, etc)' (set_knob) leave LLMs guessing about Nuke-specific semantics and valid formats.
execute_python tool accepts arbitrary code with full nuke module access, extreme privilege escalation risk. No input validation, sanitization, or audit trail documented. Missing pattern:permission-gate and pattern:audit-trail.
grab_frame, grab_roi, grab_comparison return base64-encoded PNG but output schema is undocumented. LLMs don't know the field name (is it 'image', 'data', 'png', 'base64'?) or whether metadata is included.