vangard-daz-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| DAZ_HOST | No | DazScriptServer hostname | localhost |
| DAZ_PORT | No | DazScriptServer port | 18811 |
| DAZ_TIMEOUT | No | Request timeout in seconds (increase for long renders) | 30.0 |
| DAZ_API_TOKEN | No | API token for authentication (overrides token file at ~/.daz3d/dazscriptserver_token.txt) |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| daz_statusA | Check DAZ Studio connectivity. Returns server status and version. |
| daz_executeA | Execute inline DazScript code in DAZ Studio. Scripts run in the DAZ Studio JavaScript environment. Global objects: Scene (DzScene), App (DzApp), MainWindow. ⚠️ CRITICAL GOTCHAS - READ BEFORE WRITING SCRIPTS:
For detailed examples and documentation, use the daz_script_help tool first. Args:
script: DazScript (JavaScript) source code to execute.
args: Optional JSON object accessible in script as Returns: Object with keys: success, result, output (list of print() lines), error. |
| daz_execute_fileA | Execute a DazScript file on disk inside DAZ Studio. Args:
script_file: Absolute path to the .dsa/.ds script file on the DAZ Studio machine.
args: Optional JSON-serialisable object accessible inside the script as Returns: Object with keys: success, result, output (list of print() lines), error. |
| daz_script_helpA | Get DazScript documentation, examples, and best practices. Use this tool BEFORE writing DazScript to learn correct patterns and avoid common mistakes. Topics cover critical gotchas, working examples, and detailed API references. Available topics:
Args: topic: Documentation topic to retrieve (default: "overview") Returns: Formatted documentation with examples for the requested topic. |
| daz_scene_infoA | Return a snapshot of the current DAZ Studio scene. Returns figures (characters + clothing), cameras, lights, and the primary selection. Does not enumerate every scene node — use daz_execute for finer-grained queries. Returns a dict with:
|
| daz_get_nodeA | Return all numeric properties of a scene node by its label or internal name. Useful for reading transforms (X Translate, Y Translate, Z Translate, X Rotate, Y Rotate, Z Rotate, Scale), morph dials, and any other numeric property on the node. Args: node_label: The display label or internal name of the node (e.g. "Genesis 9"). Label is matched first; internal name is the fallback. Returns a dict with:
|
| daz_set_propertyA | Set a numeric property on a scene node. Works for transforms (e.g. "X Translate", "Y Rotate"), morphs (e.g. "Head Size"), and any other numeric dial. Use daz_get_node first to discover available property names. DAZ Studio units: centimetres for translation, degrees for rotation, 0–1 (or percentage) for most morphs. Args: node_label: Display label or internal name of the target node. property_name: Display label or internal name of the property to set. value: New numeric value. Returns:
|
| daz_renderA | Trigger a render in DAZ Studio using the current render settings. Render dimensions, format, and other options are whatever is currently configured in DAZ Studio's Render Settings panel. Args: output_path: Optional absolute path for the output image (e.g. "C:/renders/scene.png"). If omitted, DAZ Studio uses its currently configured output path. Returns:
|
| daz_load_fileA | Load a DAZ Studio file into the current scene. Args: file_path: Absolute path to the file on the DAZ Studio machine (.duf, .daz, .obj, .fbx, etc.). merge: If True (default), merge the file into the existing scene. If False, replace the current scene entirely. Returns:
|
| daz_list_morphsA | List all morphs (numeric properties) on a node. Returns all numeric properties on a node, which includes morphs (body shapes, facial expressions), transforms, and other numeric dials. Useful for discovering what morphs are available on a figure. Args: node_label: Display label or internal name of the node (e.g., "Genesis 9"). include_zero: If True, return all morphs including those set to 0. If False (default), only return morphs with non-zero values (currently active morphs). Returns:
Example: # List only active morphs on Genesis 9 result = daz_list_morphs("Genesis 9", include_zero=False) # result["morphs"] = [ # {"label": "Height", "name": "Height", "value": 1.05, "path": "Morphs/Body"}, # {"label": "Head Size", "name": "HeadSize", "value": 0.9, "path": "Morphs/Head"} # ] |
| daz_search_morphsA | Search for morphs matching a name pattern. Search through all numeric properties (morphs) on a node for those matching a substring pattern. Useful for finding specific morphs like all facial expressions, body morphs, or morphs for a specific body part. Args: node_label: Display label or internal name of the node (e.g., "Genesis 9"). pattern: Substring to search for in morph label or name (case-insensitive). Examples: "smile", "head", "muscle", "express" include_zero: If True, return all matching morphs including zero values. If False (default), only return matching morphs that are active. Returns:
Example: # Find all smile-related morphs result = daz_search_morphs("Genesis 9", "smile", include_zero=True) # result["morphs"] might include: "Smile", "Smile Open", "Smile Closed", etc. |
| daz_get_node_hierarchyA | Get complete hierarchy tree for a node with all descendants. Returns the full hierarchical structure of a node, including all children, grandchildren, etc. Useful for understanding skeleton structure, bone relationships, and complex scene hierarchies. Args: node_label: Display label or internal name of the root node. max_depth: Maximum recursion depth (default 10, 0 = unlimited). Use to limit deep hierarchies (e.g., Genesis 9 skeleton has 100+ bones). Returns:
Example: # Get skeleton hierarchy with depth limit result = daz_get_node_hierarchy("Genesis 9", max_depth=3) # Returns nested structure: hip -> abdomen -> chest -> ... |
| daz_list_childrenA | List direct children of a node. Returns only the immediate children (not grandchildren). Useful for exploring hierarchy one level at a time or checking if a node has children. Args: node_label: Display label or internal name of the parent node. Returns:
Example: # List children of Genesis 9 root result = daz_list_children("Genesis 9") # Returns: [{"label": "hip", "name": "hip", "type": "DzBone"}] |
| daz_get_parentA | Get parent node of a node. Returns the immediate parent of a node, or null if the node is a root node (no parent). Useful for traversing hierarchy upward. Args: node_label: Display label or internal name of the child node. Returns:
Example: # Get parent of a bone result = daz_get_parent("lHand") # Returns: {"parent": {"label": "lForearmBend", "name": "lForearmBend", ...}} |
| daz_set_parentA | Set parent of a node (parenting operation). Changes the parent of a node, effectively moving it in the scene hierarchy. Commonly used to attach props to figures (e.g., weapon to hand) or reorganize scene structure. Args: node_label: Display label or internal name of node to parent. parent_label: Display label or internal name of new parent. maintain_world_transform: If True (default), adjust local transform to maintain the same world-space position/rotation. If False, keep local transform (node will move in world space). Returns:
Example: # Attach sword to right hand (maintain position) result = daz_set_parent("Sword", "rHand", maintain_world_transform=True) # Sword stays in place, now follows hand movements Note: When maintain_world_transform=True, the node's world position is preserved, but its local transform values (X/Y/Z Translate, Rotate) will change to account for the new parent's transform. |
| daz_look_at_pointA | Make character look at a world-space point with configurable body involvement. This helper uses cascading rotations from eyes through the body to create natural-looking character attention. Different modes control how much of the body participates in the look direction. Args: character_label: Display label or internal name of the character figure. target_x: World X coordinate (cm) to look at. target_y: World Y coordinate (cm) to look at. target_z: World Z coordinate (cm) to look at. mode: How much body to involve in the look. Options: - "eyes": Only rotate eyes - "head": Eyes + head rotation (default) - "neck": Eyes + head + neck - "torso": Eyes + head + neck + chest - "full": Complete body rotation including hip Returns:
Example: # Character looks at point in front of them at eye level daz_look_at_point("Genesis 9", 0, 160, 200, mode="head") |
| daz_look_at_characterA | Make one character look at another character's face. Automatically finds the target character's head position and rotates the source character to look at it using cascading body rotations. Args: source_label: Display label of the character who will look. target_label: Display label of the character to look at. mode: How much body to involve. Options: - "eyes": Only rotate eyes - "head": Eyes + head rotation (default) - "neck": Eyes + head + neck - "torso": Eyes + head + neck + chest - "full": Complete body rotation including hip Returns:
Example: # Alice looks at Bob with head turn daz_look_at_character("Alice", "Bob", mode="head") |
| daz_reach_towardA | Position character's arm to reach toward a world-space point. Uses pseudo-IK approximation to calculate shoulder and elbow rotations that position the hand near the target point. Automatically adjusts elbow bend based on target distance. Args: character_label: Display label or internal name of the character. side: Which arm to use: "left" or "right". target_x: World X coordinate (cm) to reach toward. target_y: World Y coordinate (cm) to reach toward. target_z: World Z coordinate (cm) to reach toward. Returns:
Example: # Reach right hand toward point in front at chest height daz_reach_toward("Genesis 9", "right", 50, 130, 80) Note: This uses simplified IK approximation. For precise hand positioning or complex reaching, load an artist-created pose preset instead. |
| daz_interactive_poseA | Coordinate two characters for interactive poses. Applies complementary poses to two characters for common interaction scenarios. Handles both positioning and pose application. Args: char1_label: Display label of first character. char2_label: Display label of second character. interaction_type: Type of interaction. Options: - "face-each-other": Position and rotate to face each other (default) - "hug": Both characters hug with arms around each other - "shoulder-arm": Char1 puts arm around char2's shoulders - "handshake": Both extend right hands for handshake distance: Optional spacing between characters in cm (default varies by type: face=100, hug=40, shoulder-arm=30, handshake=60). Returns:
Example: # Position characters facing each other at conversation distance daz_interactive_pose("Alice", "Bob", "face-each-other", distance=120) Note: These are simplified interaction poses. For natural-looking results, you may need to fine-tune positions and rotations using daz_set_property or load artist-created pose presets. |
| daz_batch_set_propertiesA | Set multiple properties on one or more nodes in a single call. Executes multiple property-setting operations with individual error handling. Failed operations don't abort the entire batch - each operation returns success status and error details. Args: operations: List of operation objects, each containing: - nodeLabel (str): Display label of the node - propertyName (str): Property label or internal name - value (float): New value for the property Returns:
Example: # Set multiple properties on different nodes daz_batch_set_properties([ {"nodeLabel": "Genesis 9", "propertyName": "XTranslate", "value": 100}, {"nodeLabel": "Genesis 9", "propertyName": "YRotate", "value": 45}, {"nodeLabel": "Camera 1", "propertyName": "ZTranslate", "value": 300} ]) Note: This is significantly more efficient than calling daz_set_property individually for each operation. All operations execute in a single script call to DAZ Studio. |
| daz_batch_transformA | Apply the same transform properties to multiple nodes. Useful for moving, rotating, or scaling multiple objects by the same amount. Only properties that exist on each node are applied (missing properties are silently skipped). Args: node_labels: List of node display labels to transform. transforms: Dictionary of property names to values (e.g., {"XTranslate": 50, "YRotate": 45}). Returns:
Example: # Move multiple props to the right daz_batch_transform( ["Prop1", "Prop2", "Prop3"], {"XTranslate": 100} ) Note: Transform properties include: XTranslate, YTranslate, ZTranslate, XRotate, YRotate, ZRotate, Scale, XScale, YScale, ZScale. |
| daz_batch_visibilityA | Show or hide multiple nodes in the viewport and renders. Args: node_labels: List of node display labels to modify. visible: True to show nodes, False to hide them (default: True). Returns:
Example: # Hide all cameras daz_batch_visibility(["Camera 1", "Camera 2", "Camera 3"], visible=False) Note: Hidden nodes are not visible in the viewport or renders, but remain in the scene. Use this for scene management, testing different configurations, or optimizing render times. |
| daz_batch_selectA | Select multiple nodes in the DAZ Studio scene. Args: node_labels: List of node display labels to select. add_to_selection: If True, add to current selection; if False, replace current selection (default: False). Returns:
Example: # Select multiple characters daz_batch_select(["Genesis 9", "Genesis 8 Female"]) Note: Selection affects which nodes appear in the Scene/Parameters panes in DAZ Studio. Some operations apply to the current selection. Nodes that don't exist are silently skipped. |
| daz_set_active_cameraA | Set which camera is active in the DAZ Studio viewport. Changes the active viewport camera to show the scene from the specified camera's perspective. The previous active camera is returned for reference. Args: camera_label: Display label of the camera to activate. Returns:
Example: # Switch to a specific camera daz_set_active_camera("Camera 1") Note: The camera must exist in the scene. Use daz_scene_info() to list available cameras. The viewport updates immediately to show the camera's current view. |
| daz_orbit_camera_aroundA | Position camera orbiting around a target node at specified angle and distance. Uses spherical coordinates to position the camera at a specific angle around a target object. The camera is automatically aimed at the target after positioning. Args: camera_label: Display label of the camera to position. target_label: Display label of the target node to orbit around. distance: Distance from target in centimeters (default: 200). angle_horizontal: Horizontal angle in degrees, 0=front/+Z, 90=right/+X (default: 45). angle_vertical: Vertical angle in degrees, positive=above, negative=below (default: 15). Returns:
Example: # Position camera at 45° to the right, slightly above, 200cm away daz_orbit_camera_around("Camera 1", "Genesis 9", distance=200, angle_horizontal=45, angle_vertical=15) Note: Angles use spherical coordinates: - Horizontal: 0°=front(+Z), 90°=right(+X), 180°=back(-Z), -90°=left(-X) - Vertical: positive=above horizon, negative=below |
| daz_frame_camera_to_nodeA | Frame camera to show a node by positioning at calculated distance. Positions the camera to frame the specified node in view. Calculates the node's bounding box and positions the camera at an appropriate distance to show the entire object. Camera is positioned in front (+Z) and aimed at the node's center. Args: camera_label: Display label of the camera to position. node_label: Display label of the node to frame. distance: Optional distance from node center in cm. If not specified, calculated as 2.5x the largest dimension of the node's bounding box. Returns:
Example: # Frame a character (auto distance) daz_frame_camera_to_node("Camera 1", "Genesis 9") Note: - Auto-calculated distance is 2.5x the largest bounding box dimension - Camera is positioned in front of the node (+Z direction) - Camera is aimed at the center of the node's bounding box - Useful for automatically framing objects of varying sizes |
| daz_save_camera_presetA | Save camera position and rotation as preset data. Captures the current transform properties of a camera (position, rotation, scale) and returns them as preset data. This data can be saved by the client and later restored using daz_load_camera_preset(). Args: camera_label: Display label of the camera to save. Returns:
Example: # Save camera position preset = daz_save_camera_preset("Camera 1") Note: - Preset data is a plain dictionary that can be serialized (JSON, etc.) - Includes all transform properties (position, rotation, scale) - Does not include camera-specific settings (focal length, DOF, etc.) - Preset data can be applied to any camera, not just the original |
| daz_load_camera_presetA | Restore camera position and rotation from preset data. Applies saved preset data (from daz_save_camera_preset()) to a camera, restoring its position, rotation, and scale. Args: camera_label: Display label of the camera to modify. preset: Preset dictionary from daz_save_camera_preset(), containing: - transforms: Dictionary of property names to values Returns:
Example: # Load previously saved preset with open("my_camera_preset.json") as f: preset = json.load(f) Note: - Preset can be applied to any camera, not just the original - Only properties present in the preset are modified - Useful for saving/loading camera positions across sessions - Can be used to synchronize multiple cameras |
| daz_set_keyframeA | Set a keyframe on a property at specified frame. Creates or updates a keyframe for a numeric property at the given frame number. This is the fundamental operation for creating property animations. Args: node_label: Display label of the node. property_name: Property label or internal name. frame: Frame number (integer, typically 0-based). value: Value to set at this frame. Returns:
Example: # Animate character moving right (0 to 100cm over 30 frames) daz_set_keyframe("Genesis 9", "XTranslate", frame=0, value=0) daz_set_keyframe("Genesis 9", "XTranslate", frame=30, value=100) Note: - DAZ Studio interpolates between keyframes automatically - Setting a keyframe at an existing frame updates the value - Frames are typically 0-based integers - Use daz_set_frame_range() to define the animation length first |
| daz_get_keyframesA | Get all keyframes for a property. Returns all keyframes currently set on a property, including frame numbers and values. Useful for inspecting existing animations or copying keyframes. Args: node_label: Display label of the node. property_name: Property label or internal name. Returns:
Example: # Get keyframes for a property result = daz_get_keyframes("Genesis 9", "XTranslate") print(f"Found {result['count']} keyframes:") for kf in result['keyframes']: print(f" Frame {kf['frame']}: {kf['value']}") Note: - Returns empty array if property has no keyframes - Keyframes are returned in frame order - Frame numbers are integers, values are floats |
| daz_remove_keyframeA | Remove a keyframe at specified frame. Deletes a single keyframe from a property at the given frame number. Other keyframes on the property remain unchanged. Args: node_label: Display label of the node. property_name: Property label or internal name. frame: Frame number of keyframe to remove. Returns:
Example: # Remove specific keyframe daz_remove_keyframe("Genesis 9", "XTranslate", frame=15) Note: - If no keyframe exists at the frame, removed=false (not an error) - Other keyframes remain unchanged - Use daz_clear_animation() to remove all keyframes at once |
| daz_clear_animationA | Remove all keyframes from a property. Clears all animation data from a property, returning it to a static (non-animated) state. More efficient than removing keyframes individually. Args: node_label: Display label of the node. property_name: Property label or internal name. Returns:
Example: # Clear animation from a property result = daz_clear_animation("Genesis 9", "XTranslate") print(f"Removed {result['removed']} keyframes") Note: - Removes all keyframes in a single operation - More efficient than calling daz_remove_keyframe() repeatedly - Property retains its current value after clearing - Returns count of keyframes that were removed |
| daz_set_frameA | Set current animation frame. Moves the timeline to the specified frame. This updates the scene to show the state at that frame, evaluating all animated properties. Args: frame: Frame number to move to (integer). Returns:
Example: # Jump to specific frame daz_set_frame(30) Note: - Scene updates to show animated state at the frame - All animated properties evaluate at the new frame - Frame numbers are typically 0-based integers - Use with daz_render() to export animation frames |
| daz_set_frame_rangeA | Set animation frame range (start and end). Defines the playback range for the animation timeline. This determines which frames are included when playing or exporting animation. Args: start_frame: First frame of animation (typically 0). end_frame: Last frame of animation. Returns:
Example: # Set 120-frame animation (4 seconds at 30fps) daz_set_frame_range(0, 119) Note: - Frame range is inclusive (both start and end frames are included) - Default FPS in DAZ Studio is typically 30 - Duration in seconds = (end - start + 1) / fps - Example: frames 0-29 at 30fps = 1 second (30 frames) |
| daz_get_animation_infoA | Get animation timeline info (current frame, range, fps). Returns information about the current animation timeline state, including the current frame, frame range, and frames per second. Returns:
Example: # Get timeline info info = daz_get_animation_info() print(f"Current frame: {info['currentFrame']}") print(f"Range: {info['startFrame']}-{info['endFrame']}") print(f"Duration: {info['durationSeconds']} seconds") print(f"FPS: {info['fps']}") Note: - FPS is typically 30 in DAZ Studio - Frame range is inclusive (both start and end are included) - totalFrames includes both start and end frames - Use before rendering animation to know frame count |
| daz_render_with_cameraA | Render from specific camera without changing active viewport camera. Renders the scene from the specified camera's viewpoint. The viewport camera remains unchanged, making this ideal for multi-camera renders without disrupting the user's viewport. Args: camera_label: Display label of the camera to render from. output_path: Optional output file path. If not specified, renders to viewport. Returns:
Example: # Render from specific camera daz_render_with_camera("Camera 1", output_path="/path/to/render.png") Note: - Viewport camera remains unchanged after render - Previous render camera is restored automatically - Use for multi-camera batch renders - Combine with daz_orbit_camera_around() to set up camera first |
| daz_get_render_settingsA | Get current render settings and configuration. Returns information about the current render configuration, including render target, output path, aspect ratio, and render camera. Returns:
Example: # Check render settings settings = daz_get_render_settings() print(f"Render camera: {settings['currentCamera']}") print(f"Output: {settings['outputPath']}") print(f"Aspect: {settings['aspectWidth']}x{settings['aspectHeight']}") Note: - Aspect ratio determines render dimensions relative to each other - Pixel dimensions cannot be set reliably via DazScript - currentCamera may be null if using active viewport camera |
| daz_batch_render_camerasA | Render from multiple cameras in sequence. Renders the same scene from multiple camera angles in a single operation. Each camera generates a separate output file with the camera name appended. Args: cameras: List of camera labels to render from. output_dir: Output directory for rendered images. base_filename: Base filename (default: "render"). Camera name is appended automatically. Returns:
Example: # Render from multiple preset cameras daz_batch_render_cameras( cameras=["Front", "Side", "Top", "Perspective"], output_dir="/path/to/renders", base_filename="character" ) # Generates: character_Front.png, character_Side.png, etc. Note: - Camera names in filenames have non-alphanumeric chars replaced with underscores - All renders use current scene state (same lighting, poses, etc.) - Previous render camera is restored after batch completes - Cameras that don't exist are skipped |
| daz_render_animationA | Render animation frame range as image sequence. Renders each frame of an animation to separate image files. Automatically advances through frames and generates zero-padded filenames for proper sorting. This is the recommended way to export animations. Args: output_dir: Output directory for rendered frames. start_frame: First frame to render (default: animation range start). end_frame: Last frame to render (default: animation range end). filename_pattern: Filename pattern (default: "frame"). Frame number is appended. camera: Optional camera label to render from (default: current render camera). Returns:
Example: # Render entire animation daz_render_animation(output_dir="/path/to/animation") # Generates: frame_0000.png, frame_0001.png, ..., frame_0119.png Note: - Frame numbers are zero-padded to 4 digits (0000, 0001, etc.) - Current timeline frame is restored after render completes - If camera is specified, render camera is restored after completion - Use daz_get_animation_info() to get default frame range - Convert to video: ffmpeg -framerate 30 -i frame_%04d.png output.mp4 |
| daz_get_world_positionA | Get world-space position, local position, rotation, and scale of a node. Useful for understanding where nodes are in 3D space before making relative positioning decisions. Args: node_label: Display label of the node (e.g. "Genesis 9", "Camera 1") Returns: { "node": "Genesis 9", "world_position": {"x": 0.0, "y": 0.0, "z": 0.0}, "local_position": {"x": 0.0, "y": 0.0, "z": 0.0}, "rotation": {"x": 0.0, "y": 0.0, "z": 0.0}, "scale": {"x": 1.0, "y": 1.0, "z": 1.0} } |
| daz_get_bounding_boxA | Get the axis-aligned bounding box of a node. Returns min/max corners, center point, and dimensions. Use this to auto-calculate camera distance, detect collisions, or anchor lights relative to a character's actual size. Args: node_label: Display label of the node Returns: { "node": "Genesis 9", "min": {"x": -30.0, "y": 0.0, "z": -15.0}, "max": {"x": 30.0, "y": 175.0, "z": 15.0}, "center": {"x": 0.0, "y": 87.5, "z": 0.0}, "width": 60.0, "height": 175.0, "depth": 30.0 } |
| daz_calculate_distanceA | Calculate the distance between two nodes. Returns total distance, horizontal distance, vertical distance, and the direction vector. All distances in centimeters. Args: node1_label: Display label of the first node node2_label: Display label of the second node Returns: { "node1": "Genesis 9", "node2": "Camera 1", "distance": 250.5, "vector": {"dx": 0.0, "dy": 50.0, "dz": 245.0}, "horizontal_distance": 245.0, "vertical_distance": 50.0 } |
| daz_get_spatial_relationshipA | Get the spatial relationship between two nodes in natural language. Returns direction (front, back, left, right, above, below), angles, distance, and whether their bounding boxes overlap. Horizontal angle uses DAZ coordinate system: 0°=front(+Z for Genesis figures), 90°=right(+X), 180°=back(-Z), -90°=left(-X). Args: node1_label: The reference node (e.g. "Genesis 9") node2_label: The target node to describe relative to node1 (e.g. "Camera 1") Returns: { "node1": "Genesis 9", "node2": "Camera 1", "distance": 250.5, "direction": "front", "angle_horizontal": 5.0, "angle_vertical": 12.0, "relative_position": "Camera 1 is front above of Genesis 9 (250 cm away)", "overlapping": false } |
| daz_check_overlapA | Check if two nodes have overlapping bounding boxes (collision detection). Uses axis-aligned bounding box (AABB) intersection. Returns whether they overlap, the penetration depth, and a suggestion for resolving the collision. Args: node1_label: Display label of the first node node2_label: Display label of the second node Returns: { "node1": "Alice", "node2": "Bob", "overlapping": true, "penetration_depth": 15.0, "suggestion": "Move Bob 20 cm in +X direction to resolve collision" } |
| daz_inspect_propertiesA | List all properties on a node with their types, values, and constraints. Use this to discover what properties are available on a node before using daz_set_property. Much more reliable than guessing property names. Args: node_label: Display label of the node property_type: Filter type — one of: "all" - all properties "numeric" - all numeric (float/bool) properties "transform" - XTranslate/YTranslate/ZTranslate/XRotate/YRotate/ZRotate/Scale "morph" - numeric properties that are not transforms "bool" - boolean properties only "string" - string properties only Returns: { "node": "Spotlight 1", "properties": [ { "label": "Luminous Flux (Lumen)", "name": "Flux", "type": "DzFloatProperty", "value": 1500.0, "min": 0.0, "max": 100000.0, "path": "Light/Photometrics", "is_animatable": true } ], "count": 45 } |
| daz_get_property_metadataA | Get detailed metadata for a single named property on a node. Accepts either the display label (e.g. "Luminous Flux (Lumen)") or the internal name (e.g. "Flux"). Use this to validate a value is within min/max range before setting it. Args: node_label: Display label of the node property_name: Property label or internal name Returns: { "label": "Luminous Flux (Lumen)", "name": "Flux", "type": "DzFloatProperty", "current_value": 1500.0, "default_value": 1500.0, "min": 0.0, "max": 100000.0, "is_animatable": true, "path": "Light/Photometrics", "node": "Spotlight 1" } |
| daz_validate_scriptA | Check a DazScript string for known anti-patterns before execution. Performs static analysis only — no script is sent to DAZ Studio. Returns errors for known crash/timeout patterns and warnings for deprecated or error-prone usage. Args: script: DazScript (JavaScript) source code to validate Returns: { "valid": false, "errors": [ { "line": 3, "pattern": "DzNewCameraAction", "message": "Action classes pop modal dialogs and cause timeouts", "suggestion": "Use: var cam = new DzBasicCamera(); Scene.addNode(cam);" } ], "warnings": [...], "suggestions": [...] } |
| daz_apply_lighting_presetA | Create a professional photography lighting setup in one command. Removes any existing lights with the same names, creates new lights at positions calculated relative to the subject's bounding box, aims each light at the subject's face height, and sets the environment to scene-lights-only mode (disables the dome). Available presets: three-point - Key (front-right) + Fill (front-left) + Rim (back). The most versatile general-purpose lighting setup. rembrandt - Key (45° side, high) + dim Fill. Creates triangle of light under opposite eye. Dramatic portrait lighting. butterfly - Key directly in front, high. Glamour/beauty lighting. Creates butterfly shadow under the nose. split - Key directly to one side (90°). Half face lit, half in shadow. Moody, high-contrast. loop - Key (35° side) + Fill + Rim. Natural-looking portrait. Small loop shadow on opposite cheek. Args: preset: Lighting preset name (see above) subject_label: Optional node label to anchor lights around. If omitted, lights are placed relative to scene origin at 170cm height. Returns: { "preset": "three-point", "subject": "Genesis 9", "lights_created": [ {"label": "Key Light", "type": "DzSpotLight", "position": {"x": 150, "y": 180, "z": 150}, "flux": 2000} ], "environment_mode": "Scene Only (3)" } |
| daz_validate_sceneA | Validate the current scene for common issues before rendering. Checks:
Returns a score (0-100) and breakdown by category, plus actionable suggestions for any issues found. Returns: { "valid": true, "issues": [ { "type": "collision", "severity": "high", "nodes": ["Alice", "Bob"], "description": "Alice and Bob bounding boxes overlap by ~15 cm", "suggestion": "Move one character away to resolve interpenetration" } ], "warnings": [...], "score": 75, "score_breakdown": { "lighting": 100, "collision": 30, "camera": 100, "figures": 100 }, "summary": { "figures": 2, "cameras": 1, "lights": 3, "environment_lighting": false } } |
| daz_render_asyncA | Start a render asynchronously — returns immediately with a request_id. Use daz_get_request_status() to poll progress and daz_get_request_result() to retrieve the final result. IMPORTANT: The scene is locked while the render runs. Do not modify the scene until the request status is "completed", "failed", or "cancelled". Args: output_path: Optional file path for the rendered image. Returns: {"request_id": "script-XXXXXXXX", "status": "queued", "submitted_at": "..."} |
| daz_render_with_camera_asyncA | Start a camera-specific render asynchronously — returns immediately with a request_id. Renders from the specified camera without changing the active viewport camera. Use daz_get_request_status() to poll and daz_get_request_result() for the result. Args: camera_label: Display label of the camera to render from. output_path: Optional file path for the rendered image. Returns: {"request_id": "script-XXXXXXXX", "status": "queued", "submitted_at": "..."} |
| daz_batch_render_cameras_asyncA | Queue renders from multiple cameras — each becomes its own async request. Submits one async render per camera and returns all request IDs immediately. Renders execute serially (DAZ is single-threaded), so they queue behind any already-running request. Each camera render is independently cancellable. Args: cameras: List of camera display labels. output_dir: Directory where rendered images are saved. base_filename: Filename prefix. Output is _.png. Returns: { "request_ids": ["script-XXXXXXXX", ...], "total": 3, "cameras": ["Cam_0", "Cam_45", "Cam_90"] } Example: batch = await daz_batch_render_cameras_async( cameras=["Cam_0", "Cam_45", "Cam_90"], output_dir="/renders/turntable" ) # Monitor all renders for req_id in batch["request_ids"]: result = await daz_get_request_result(req_id, wait=True) |
| daz_render_animation_asyncA | Start an animation render asynchronously — returns immediately with a request_id. Queues a full animation render (all frames as an image sequence). This can take hours; use daz_get_request_status() to monitor progress and daz_get_request_result() to confirm completion. Args: output_dir: Directory where frame images are saved. start_frame: First frame (default: animation range start). end_frame: Last frame (default: animation range end). filename_pattern: Filename prefix (default: "frame"). Frame number appended. camera: Optional camera label (default: current render camera). Returns: {"request_id": "script-XXXXXXXX", "status": "queued", "submitted_at": "..."} |
| daz_get_request_statusA | Get the current status of an async request (non-blocking, always fast). Safe to call frequently — reads directly from the server's in-memory map without executing any DazScript. Args: request_id: Request ID returned by an async submission tool. Returns: { "request_id": "script-XXXXXXXX", "status": "running", # queued | running | completed | failed | cancelled "progress": 0.0, # 0.0 while running (DAZ single-frame renders have no # mid-frame progress), 1.0 when complete "elapsed_ms": 45000, # present while running "queue_position": 2 # present while queued } |
| daz_get_request_resultA | Get the result of a completed async request. Args: request_id: Request ID returned by an async submission tool. wait: If True (default), block until the request finishes (up to timeout). If False, return immediately with current status even if not done. timeout_seconds: Max seconds to wait when wait=True (default 3600 = 1 hour). Returns when complete: { "request_id": "script-XXXXXXXX", "status": "completed", "success": true, "result": {...}, # same as sync tool result "output": [...], # captured DazScript print() output "error": null, "duration_ms": 267000, "completed_at": "2026-04-08T..." } Raises ToolError if the request failed. |
| daz_cancel_requestA | Cancel a queued or running async request. For queued requests: cancellation is immediate. For running renders: sends a killRender() signal; may take a few seconds to take effect. Args: request_id: Request ID returned by an async submission tool. Returns: {"request_id": "...", "status": "cancelled", "cancelled_at": "..."} Raises ToolError if the request is already finished (completed/failed/cancelled) or not found. |
| daz_list_requestsA | List all tracked async requests and their current statuses. Args: status_filter: Optional filter — one of "queued", "running", "completed", "failed", "cancelled". Returns all if omitted. Returns: { "requests": [ {"request_id": "...", "status": "...", "progress": 0.0, "submitted_at": "..."}, ... ], "total": 5, "queued": 2, "running": 1, "completed": 2, "failed": 0, "cancelled": 0 } |
| daz_set_render_qualityA | Set the Iray render quality preset. Adjusts Max Samples and Render Quality on the active renderer, trading speed for quality. Use "draft" for quick composition checks and "final" for production renders. Presets: draft - Very fast (seconds–2 min). Low quality. For quick checks. preview - Fast (2–5 min). Moderate quality. For composition review. good - Slow (10–20 min). Good quality. For client review. final - Very slow (30 min–2 hr). Maximum quality. For final output. Args: preset: One of "draft", "preview", "good", "final". Returns: { "preset": "draft", "propertiesSet": [ {"property": "Max Samples", "value": 100}, {"property": "Render Quality", "value": 0.5} ], "note": "..." # present only if some properties were not found } Example: # Quick test render daz_set_render_quality("draft") daz_render("/test.png") |
| daz_set_emotionA | Apply an emotional expression to a character using morph candidates + body adjustment. Args: character_label: Node label of the character to affect. emotion: One of: happy, sad, angry, surprised, fearful, disgusted, neutral, excited, bored, confident, shy, loving, contemptuous. intensity: Scale factor 0.0–1.0 applied to all morph and body values (default 0.7). Returns: Dict with applied_morphs, body_adjustments, and not_found lists. Notes: Morph candidates are tried in order; first match per slot wins. Not-found morphs are reported but do not raise errors — figures vary in available morphs. |
| daz_list_categoriesA | List content library category subdirectories under a parent path. Searches across all configured DAZ content directories and deduplicates by name. Args: parent_path: Relative path within content directories to list (e.g. "People/Genesis 9"). Leave empty to list top-level categories. Returns: Dict with parent, categories (list of {name, path, duf_count}), and count. Example: daz_list_categories() # top-level: People, Props, Environments... daz_list_categories("People/Genesis 9") # sub-folders: Characters, Clothing, Hair... |
| daz_browse_categoryA | List .duf content files in a content library category path. Searches all configured DAZ content directories and deduplicates by filename. Args: category_path: Relative path within content directories (e.g. "People/Genesis 9/Hair"). sort_by: Sort order — only "name" is currently supported (alphabetical). Returns: Dict with category, items (list of {name, filename, full_path}), and count. Example: daz_browse_category("People/Genesis 9/Hair") daz_browse_category("Props/Furniture") |
| daz_get_content_infoA | Read metadata from a .duf content file without loading it into the scene. Parses the JSON structure of a .duf file to extract name, type, contributor, and other available metadata fields. Args: file_path: Absolute path to a .duf file on disk. Returns: Dict with name, type, file_version, contributor, revision, modified, and any scene-level asset info found in the file. Raises: ToolError: If the file does not exist, is not readable, or is not valid JSON. |
| daz_apply_composition_ruleA | Position camera so subject is framed according to a photography composition rule. The camera maintains approximately its current horizontal distance from the subject while adjusting position and aim to satisfy the chosen rule. Args: camera_label: Node label of the camera to reposition. subject_label: Node label of the subject to frame. rule: One of: - "rule-of-thirds" — Subject on right vertical third at eye level (default) - "golden-ratio" — Subject at the golden section (1.618 proportion) - "center-frame" — Subject centred, symmetric framing - "leading-lines" — Low angle with diagonal offset toward subject Returns: Dict with camera, subject, rule, camera_position, and explanation string. |
| daz_frame_shotA | Frame camera to subject using a standard cinematic shot type. Calculates camera distance and height from the subject's bounding box, then positions and aims the camera accordingly. Genesis figures face +Z, so the camera is placed in front (positive Z direction). Args: camera_label: Node label of the camera to reposition. subject_label: Node label of the subject to frame. shot_type: One of: - "extreme-close-up" — Eyes/mouth detail (~25 cm) - "close-up" — Face and head (~50 cm) - "medium-close-up" — Head and shoulders (~90 cm) - "medium-shot" — Waist up (~140 cm) - "medium-full" — Knees up (~200 cm) - "full-shot" — Entire body (~400 cm) - "wide-shot" — Body within environment (~700 cm) Returns: Dict with camera, subject, shot_type, distance, camera_height, and framing description. |
| daz_apply_camera_angleA | Apply a standard camera angle preset relative to a subject. Maintains the camera's current horizontal distance from the subject while adjusting vertical position and aim to achieve the specified angle. If the camera is closer than 50 cm it defaults to 250 cm. Args: camera_label: Node label of the camera to reposition. subject_label: Node label of the subject. angle: One of: - "eye-level" — Camera at subject's eye height (neutral, default) - "high-angle" — Camera above subject (~1.5× head height), looking down - "low-angle" — Camera at shin level, looking up (powerful/dominant) - "dutch-angle" — Eye level with 15° Z-roll (unsettling, tense) - "overhead" — Camera directly above (bird's-eye view) - "worms-eye" — Camera at ground level looking straight up - "over-shoulder" — Camera behind and to one side of subject Returns: Dict with camera, subject, angle, camera_position, and descriptive note. |
| daz_save_scene_stateA | Save current scene state as a named in-memory checkpoint. Captures transforms (position, rotation, scale), active morphs, and light properties for all skeletons, cameras, and lights in the scene. Use this before experimental changes so you can restore with daz_restore_scene_state. Args: checkpoint_name: Unique name for this checkpoint (e.g. "before_lighting_test"). Overwrites any existing checkpoint with the same name. Returns: Dict with checkpoint_name, node_count, and saved_at (ISO timestamp). Notes: Checkpoints are stored in the MCP server process memory and are lost if the server is restarted. They do not save materials, geometry, or HDR domes. |
| daz_restore_scene_stateA | Restore scene state from a previously saved checkpoint. Applies the transforms, morphs, and light properties captured by daz_save_scene_state back to the scene. Nodes that no longer exist are skipped and reported in the errors list. Args: checkpoint_name: Name of the checkpoint to restore. Returns: Dict with checkpoint_name, restored (list of node labels), and errors. Raises: ToolError: If no checkpoint with the given name exists. |
| daz_list_checkpointsA | List all saved scene state checkpoints in the current session. Returns: Dict with checkpoints (list of {name, node_count, saved_at}) and count. Notes: Checkpoints are in-process memory; they are cleared when the server restarts. |
| daz_get_scene_layoutA | Get a spatial map of all scene nodes with positions and bounding boxes. Provides a bird's-eye view of where everything is positioned in the scene, useful for reasoning about character spacing, prop placement, and camera coverage. Args: include_types: List of node type strings to include. Defaults to all types. Valid values: "figures", "cameras", "lights", "props". Returns: Dict with nodes (list of {label, type, position, bounds?}) and count. Example: daz_get_scene_layout() # everything daz_get_scene_layout(["figures", "cameras"]) # characters + cameras only daz_get_scene_layout(["lights"]) # just lights with flux values |
| daz_find_nearby_nodesA | Find all scene nodes within a specified radius of a target node. Uses world-space positions to calculate distances. Returns nodes sorted nearest-first with cardinal direction labels. Args: node_label: Label of the centre node to search around. radius: Search radius in centimetres (default 100 cm). include_types: Filter by type — "figures", "cameras", "lights", "props". None means return all types within radius. Returns: Dict with center_node, radius, nearby_nodes (list of {label, type, distance, direction}), and count. Example: daz_find_nearby_nodes("Genesis 9", radius=150) # everything within 1.5 m daz_find_nearby_nodes("Chair", radius=80, include_types=["figures"]) # people near chair |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/bluemoonfoundry/daz-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server