nuke-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| NUKE_HOST | No | Host for the Nuke addon TCP server | localhost |
| NUKE_PORT | No | Port for the Nuke addon TCP server | 9876 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| read_compA | Read the node graph (or a subtree). Returns nodes with type, connections, non-default knob values, and error state. For large comps (200+ nodes), use summary=True for a compact overview (names and types only, no knobs), or use offset/limit to paginate. Args: root: read children of this node only (e.g. a Group name). omit for entire script. depth: how many levels deep to recurse into groups. default 999. summary: if True, return only name/type/connections per node, skip knobs. faster for large comps. type: filter to only this node class (e.g. 'Grade', 'Read'). offset: skip this many nodes (for pagination). default 0. limit: max nodes to return. 0 means all. use with offset to page through large comps. |
| read_node_detailA | Deep inspection of a single node. Returns all non-default knobs, input/output connections, expressions, animation state, and error info. For Groups/Gizmos, also shows internal node structure. Args: name: node name to inspect. |
| snapshot_compA | Take a snapshot of the current comp state. Returns a snapshot_id you can pass to diff_comp later to see what changed. Snapshots are stored server-side (max 5). Use before making changes. |
| diff_compA | Compare the current comp to a previous snapshot. Shows nodes added, removed, and knobs changed. Call snapshot_comp first. Args: snapshot_id: ID from a previous snapshot_comp call. |
| create_nodeB | Create a node and optionally wire it to an existing node. Args: type: Nuke node class (Grade, Blur, Merge2, Read, Write, etc.) name: optional name. Nuke auto-names if omitted. connect_to: name of a node to connect as input 0. for Merge nodes, connects to B pipe. |
| delete_nodeA | Delete a node from the script. Args: name: node to delete. confirm: must be True to actually delete. call with False first to preview. |
| find_nodesC | Search for nodes by type, name pattern, or error state. Args: type: filter by node class (e.g. 'Grade', 'Read'). pattern: filter by name substring (case-insensitive). errors_only: if True, only return nodes with errors. |
| list_nodesA | List all nodes in the script, or children of a Group node. Args: root: optional Group node name to list children of. |
| connect_nodesA | Connect two nodes. For Merge nodes, defaults to B pipe (input 1). Args: from_node: source node (output). to_node: target node (input). input_index: which input on the target. defaults to 0, or 1 for Merge nodes. |
| auto_layoutB | Auto-arrange the node graph layout. Args: selected_only: if True, only arrange selected nodes. |
| modify_nodeA | Rename a node. Checks for expressions that reference this node and optionally updates them to use the new name. Args: name: current node name. new_name: new name to set. update_expressions: auto-fix expressions referencing the old name. default True. |
| disconnect_node_inputC | Disconnect a specific input on a node. Args: node: node name. input_index: which input to disconnect (0-based). |
| set_node_positionB | Set x/y positions for one or more nodes in the DAG. Use for manual layout control -- position the main pipe vertically and branch side chains to the right. Args: positions: JSON array of {node, x, y} objects. example: '[{"node":"Grade1","x":0,"y":200},{"node":"Blur1","x":200,"y":200}]' |
| get_knobC | Read a knob value from a node. Args: node: node name. knob: knob name (e.g. 'size', 'mix', 'file', 'channels'). |
| set_knobB | Set a knob value on a node. Args: node: node name. knob: knob name. value: value to set. type depends on the knob. |
| get_script_infoA | Get current script metadata: path, frame range, fps, format, colorspace, node count. |
| save_scriptB | Save the script. If path is given, saves as a new file. Args: path: optional file path for save-as. omit to save in place. |
| load_scriptB | Open a Nuke script. Replaces current script. Args: path: .nk file to open. confirm: must be True to proceed. call with False first to preview. |
| set_frame_rangeB | Set the timeline frame range and/or current frame. Args: first: first frame number. last: last frame number. current: jump to this frame. |
| setup_writeA | Create a Write node connected to input_node with production defaults. A3: typed dispatch -- the addon validates Args: input_node: node to connect as input. path: output file path (use #### for frame padding). file_type: exr, tiff, png, jpeg, mov, or dpx. colorspace: output colorspace. |
| render_framesA | Render frames through a Write node. By default this returns immediately with a Pass Args:
write_node: name of Write node. uses first Write in script if omitted.
first_frame: start frame. uses script range if omitted.
last_frame: end frame. uses script range if omitted.
confirm: must be True to render. call with False to preview.
synchronous: block until done and return |
| setup_precompA | Set up a precomp: creates a Write node for the source, and a Read node that reads the rendered output back in. Downstream nodes get rewired to the Read. The Write path is auto-generated from the script name and precomp name if not specified. Args: source_node: node whose output to precomp. name: label for the precomp (used in file path). defaults to source node name. path: explicit output path. auto-generated if omitted. |
| list_precompsB | Find all precomp Write/Read pairs in the script. |
| list_channelsB | List all channels/layers available at a node's output, grouped by layer. Args: node: node name to inspect channels of. |
| shuffle_channelsC | Create a Shuffle node to move channels between layers. Args: input_node: source node. from_layer: source layer (e.g. 'diffuse', 'specular', 'depth'). to_layer: target layer. defaults to 'rgba'. |
| view_nodeA | Set the viewer to display a specific node's output. Args: node: name of the node to view. |
| set_viewer_lutA | Switch the viewer's display LUT/colorspace. Args: lut: LUT or colorspace name (e.g. 'sRGB', 'Cineon', 'None'). |
| setup_mergeB | Merge foreground over background. Auto-connects fg to B pipe. Args: fg: foreground node name. bg: background node name. operation: merge operation (over, plus, multiply, screen, etc.) |
| setup_transformC | Create a transform node. Args: input_node: node to transform. operation: Transform, CornerPin2D, Reformat, or Tracker4. |
| setup_denoiseC | Create a Denoise node with production defaults. Args: input_node: node to denoise. |
| set_expressionA | Set a TCL expression on a knob. The expression is evaluated per-frame. Common expressions: frame, frame/24.0, sin(frame*0.1), [value other_node.knob] A regex pre-flight rejects expressions that wrap forbidden Python
calls in Args: node: node name. knob: knob name to set expression on. expression: Nuke TCL expression string. |
| clear_expressionA | Remove an expression or animation from a knob, leaving it at its current value. Args: node: node name. knob: knob name to clear. |
| set_keyframeB | Set a keyframe on a knob at a specific frame. Creates animation if the knob is not already animated. Args: node: node name. knob: knob name. frame: frame number. value: value at that frame. |
| list_keyframesB | List all keyframes on a knob. Returns frame/value pairs. Args: node: node name. knob: knob name to inspect. |
| create_rotoB | Create a Roto or RotoPaint node connected to the input. Args: input_node: node to roto on top of. roto_type: Roto or RotoPaint. |
| list_roto_shapesB | List all shapes and strokes in a Roto or RotoPaint node. Args: node: name of a Roto or RotoPaint node. |
| scene_digestA | Compact fingerprint of the script: counts by class, errors, warnings, selection, active viewer, display node, plus an md5 hex[:8] hash for delta comparison. Stable across no-op turns -- pair with |
| scene_deltaA | Compare current scene state against a previous hash. If unchanged, returns Args:
prev_hash: the |
| tasks_listB | List recent tasks, newest first. |
| tasks_getB | Fetch a single task by id. |
| tasks_cancelA | Cancel an in-flight task. Sets |
| tasks_resumeA | Resume a task that's awaiting input. TODO(B2c): wired up once a tool actually parks in
|
| list_profilesA | List every skill profile with its description, tool count, and current-loaded state. Pass the returned |
| load_profileA | Surface every tool in profile Emits Args:
name: profile name (call |
| unload_profileA | Disable every tool in profile Args: name: profile name to disable. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| audit_acescct_consistency_guide | Guides the model through running the ACEScct consistency audit and interpreting findings (Read colorspaces, Write colorspaces, working space, OCIO config). |
| build_3d_camera_track_project | Walks through a 3D camera track, scene-solve, and projection-onto-card workflow for matchmove or set-extension comp work. |
| build_aov_relight_pipeline | Walks through constructing a Karma EXR AOV reconstruction + relight pipeline from a Read of multi-layer EXR output. |
| build_copycat_dehaze | Walks through training a CopyCat dehaze model from inverse-pair frames (hazy plate + clean reference). |
| build_deep_holdout_chain | Walks through a DeepRead -> DeepRecolor -> DeepHoldout(2) -> DeepMerge -> deep_to_image deep compositing chain. |
| build_planar_track_clean_plate | Walks through a planar track + clean-plate procedural so a single painted patch can be projected onto a tracked surface across the shot. |
| build_smartvector_paint_propagate | Walks through a SmartVector + IDistort paint-propagation chain so a single painted frame can be warped to every frame in the range. |
| build_stmap_distortion_envelope | Walks through caching a lens-distortion envelope to STMap so downstream comp work happens in a linear, undistorted plate. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 45 tools
Tools mostly target distinct operations, with clear parameter descriptions. Some overlap exists between read_comp/list_nodes/find_nodes and between snapshot_comp/scene_digest, but descriptions distinguish them well.
All tool names use snake_case with predictable verb_noun or noun_verb patterns (list_*, read_*, set_*, setup_*, tasks_*). No mixed conventions.
45 tools is excessive for the domain's core needs, and at least one tool (tasks_resume) is an explicit stub with no current function, indicating some tools don't earn their place.
Core CRUD for nodes, knobs, expressions, keyframes, rendering, and precomps is present. Minor gaps exist (e.g., roto shape editing, node enable/disable, grouping), but most workflows are covered.