Install
$ agentstack add mcp-bluemoonfoundry-daz-mcp-server Open-source listing, not yet scanned by AgentStack. Follow the source repository for install instructions.
Security review
⚠ Flagged1 finding(s); flagged for manual review. · v0.1.0 How review works →
- • Prompt-injection patterns
- • Secret / credential exfiltration
- • Dangerous shell & filesystem operations
- • Untrusted network calls
- • Known-malicious package signatures
- high Pipes remote content directly into a shell (remote code execution).
What it can access
- ● Network access Used
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
vangard-daz-mcp
Version 0.4.0 | MCP Server for DAZ Studio
A Model Context Protocol (MCP) server that exposes DAZ Studio operations to Claude and other MCP clients. Built on FastMCP and wraps the DazScriptServer HTTP plugin.
What Is This?
This MCP server allows Claude (via Claude Desktop or other MCP clients) to control DAZ Studio directly:
- Query scene information (figures, cameras, lights, spatial positions)
- Read and modify node properties (transforms, morphs)
- Discover and apply morphs, including searching by name pattern
- Traverse and manipulate scene hierarchies (parent/child, skeleton)
- Apply emotional expressions to characters
- Coordinate multi-character interactions (look-at, reach-toward, hug, handshake)
- Execute batch operations (set multiple properties in one call, 5-10x faster)
- Control cameras and viewport (orbit, frame, presets)
- Create keyframe animations and export as image sequences
- Trigger synchronous or asynchronous renders with cancellation support
- Apply professional lighting presets and cinematography composition rules
- Browse and query the DAZ content library
- Save and restore named scene checkpoints
- Generate complete scenes from natural language descriptions
- Create multi-camera shot sequences (orbit, push-in, shot-reverse-shot)
- Choreograph animated conversations with dialogue beats
- Record and replay operation macros for workflow automation
- Execute arbitrary DazScript code
- Access comprehensive DazScript documentation and examples
The server acts as a bridge: MCP Client ↔ vangard-daz-mcp ↔ DazScriptServer plugin ↔ DAZ Studio 4.5+ or 6.25+
Prerequisites
Before using this server, you need:
- DAZ Studio installed and running — compatible with:
- DAZ Studio 4.5+ (legacy/classic versions)
- DAZ Studio 6.25+ (current versions)
- DazScriptServer plugin — must match your DAZ Studio version:
- Download from: https://github.com/bluemoonfoundry/daz-script-server
- Install the DS4 build for DAZ Studio 4.x, or the DS6 build for DAZ Studio 6.x
- Plugin must be running on port 18811 (default)
- Authentication must be configured (API token auto-generated on first run)
- Python 3.11+ for running the MCP server
- uv package manager (recommended) or pip
Installation
1. Install uv (if you don't have it)
macOS / Linux:
curl -LsSf https://astral.sh/uv/install.sh | sh
Windows (PowerShell):
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
See uv installation docs for other options.
2. Clone and install
# Clone the repository
git clone https://github.com/bluemoonfoundry/daz-mcp-server.git
cd daz-mcp-server
# Install dependencies (creates .venv automatically)
uv sync
# Verify it works
uv run vangard-daz-mcp --help
Using pip (alternative)
git clone https://github.com/bluemoonfoundry/daz-mcp-server.git
cd daz-mcp-server
pip install .
# Run the server
vangard-daz-mcp
Configuration
Environment Variables
Configure the server via environment variables:
| Variable | Default | Description | |----------|---------|-------------| | DAZ_HOST | localhost | DazScriptServer hostname | | DAZ_PORT | 18811 | DazScriptServer port | | DAZ_TIMEOUT | 30.0 | Request timeout in seconds (increase for long renders) | | DAZ_API_TOKEN | (from file) | API token for authentication | | DAZ_CONTENT_BROWSER_URL | http://localhost:8080 | Content browser API URL (if using a separate content service) |
Authentication
The server automatically reads the API token from ~/.daz3d/dazscriptserver_token.txt (the file created by DazScriptServer).
Override with environment variable:
export DAZ_API_TOKEN="your-token-here"
Important: DazScriptServer must have authentication enabled (default). The MCP server cannot connect without a valid token.
MCP Client Configuration
Claude Desktop
Config file location:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
macOS / Linux:
{
"mcpServers": {
"vangard-daz-mcp": {
"command": "uv",
"args": [
"run",
"--project",
"/absolute/path/to/daz-mcp-server",
"vangard-daz-mcp"
],
"env": {
"DAZ_HOST": "localhost",
"DAZ_PORT": "18811"
}
}
}
}
Windows:
{
"mcpServers": {
"vangard-daz-mcp": {
"command": "uv",
"args": [
"run",
"--project",
"C:\\Users\\YourName\\daz-mcp-server",
"vangard-daz-mcp"
],
"env": {
"DAZ_HOST": "localhost",
"DAZ_PORT": "18811"
}
}
}
}
Replace the path with the actual location where you cloned the repo. Use --project (not --directory) so uv run picks up the project's .venv.
After saving the config, restart Claude Desktop. The DAZ Studio tools will appear in Claude's tool palette.
Cursor
Add to .cursor/mcp.json in your project, or ~/.cursor/mcp.json for global access:
{
"mcpServers": {
"vangard-daz-mcp": {
"command": "uv",
"args": [
"run",
"--project",
"/absolute/path/to/daz-mcp-server",
"vangard-daz-mcp"
],
"env": {
"DAZ_HOST": "localhost",
"DAZ_PORT": "18811"
}
}
}
}
VS Code (GitHub Copilot / MCP extension)
Add to .vscode/mcp.json in your workspace:
{
"servers": {
"vangard-daz-mcp": {
"type": "stdio",
"command": "uv",
"args": [
"run",
"--project",
"/absolute/path/to/daz-mcp-server",
"vangard-daz-mcp"
],
"env": {
"DAZ_HOST": "localhost",
"DAZ_PORT": "18811"
}
}
}
}
Verifying the connection
After configuration, ask your MCP client:
Check if DAZ Studio is running
Claude will call daz_status. A successful response looks like:
{ "running": true, "version": "1.3.0" }
If it fails, see the [Troubleshooting](#troubleshooting) section below.
Domain Reference Files (SKILL files)
The repository ships six SKILL files — curated knowledge documents that you can ask Claude (or any MCP client) to read before working in a particular area of DAZ Studio. They exist because LLMs have reasonable general knowledge about 3D software but will make confident, wrong assumptions about DAZ Studio specifics — inverted rotation signs, broken API methods, generation-specific bone names, and so on. Loading the right SKILL file before a task corrects those assumptions and produces dramatically better results.
How to use them
Ask Claude to read the relevant file at the start of a session or task:
Read the file SKILL_DAZ_STUDIO.md before we begin.
Before writing any DazScript code, read SKILL_DAZSCRIPT.md.
You can load more than one if your task spans domains:
Read SKILL_DAZ_STUDIO.md and SKILL_CINEMA.md — we're going to set up a portrait shot.
SKILL file reference
| File | Domain | Load when… | |------|--------|------------| | [SKILL_DAZ_STUDIO.md](SKILLDAZSTUDIO.md) | DAZ Studio conventions | Starting any session — covers coordinate system inversions, camera Y-rotation being backwards, bone rotation limits, and known tool limitations | | [SKILL_DAZSCRIPT.md](SKILLDAZSCRIPT.md) | DazScript API | Writing or debugging custom scripts via daz_execute — documents verified-working API patterns and a list of broken/wrong methods to avoid | | [SKILL_SCENE.md](SKILLSCENE.md) | Scene management | Working with scene hierarchy, content library, spatial layout, materials, or batch operations | | [SKILL_ACTORS.md](SKILLACTORS.md) | Characters & posing | Working with morphs, emotions, body language, gaze direction, wardrobe, or multi-character interactions | | [SKILL_CINEMA.md](SKILLCINEMA.md) | Cameras, lighting & rendering | Composing shots, setting up lighting rigs, animating cameras, or running renders | | [SKILL_DEVELOPMENT.md](SKILL_DEVELOPMENT.md) | MCP server internals | Modifying or extending the MCP server itself — module layout, how to add tools, the script registry |
When to load SKILL_DAZ_STUDIO.md
This is the most important file and the one most likely to save you from a frustrating session. Key things it corrects:
- Camera Y rotation is inverted — positive values turn the camera left, not right. Every other 3D application does this the other way.
daz_look_at_pointapplies rotations in the wrong direction — always verify in the viewport and correct manually.daz_orbit_camera_aroundaims at the figure's root (feet), not the face — use explicit world-space coordinates for portrait work instead.- Genesis 9 faces +Z by default — "in front of" a character is at a positive Z coordinate.
- Focal distance requires true 3D distance — using Z distance alone throws portrait shots out of focus.
Available Tools
📚 Documentation Tools
daz_script_help
Get DazScript documentation, examples, and best practices.
Arguments:
topic(string, default"overview"): Documentation topic to retrieve
Available Topics:
overview- DazScript environment basicsgotchas- Critical mistakes that cause timeouts or errorscamera- Camera creation, positioning, and aiminglight- Light creation, types, and three-point lightingenvironment- Iray environment settings and lighting modesscene- Scene management (new, save, load, selection)properties- Node properties, transforms, and morphscontent- Browsing and loading content from librarycoordinates- Coordinate system and positioning referenceposing- Figure posing, bone hierarchy, morphs vs poses, rotation gotchasmorphs- Morph discovery, searching, value ranges, and managementhierarchy- Scene hierarchy, parent-child relationships, parenting operationsinteraction- Multi-character interaction, look-at mechanics, world-space posingbatch- Batch operations patterns and performance optimizationviewport- Viewport and camera control, spherical positioning, presetsanimation- Keyframe animation, timeline control, image sequence exportrendering- Rendering workflows, multi-camera, batch render, animation export
Returns: Formatted documentation with examples
Use when: Before writing custom DazScript code to learn correct patterns and avoid common mistakes.
Example:
daz_script_help("camera") # Get camera documentation
daz_script_help("gotchas") # Learn critical gotchas
🔍 Inspection Tools
daz_status
Check DAZ Studio connectivity and version.
Returns:
{
"running": true,
"version": "1.3.0"
}
Use when: Verifying DAZ Studio is running and the connection works.
daz_scene_info
Get a snapshot of the current scene.
Returns:
{
"sceneFile": "/path/to/scene.duf",
"selectedNode": "Genesis 9",
"figures": [
{"name": "Genesis9", "label": "Genesis 9", "type": "DzFigure"}
],
"cameras": [
{"name": "Camera", "label": "Camera 1"}
],
"lights": [
{"name": "DistantLight", "label": "Distant Light", "type": "DzDistantLight"}
],
"totalNodes": 3247
}
Use when: You need an overview of what's in the scene (characters, cameras, lights).
Note: Does not enumerate all nodes (scenes can have 1000+ nodes). Use daz_execute for fine-grained queries.
daz_get_node
Read all numeric properties of a node by its label or internal name.
Arguments:
node_label(string): Display label or internal name (e.g., "Genesis 9")
Returns:
{
"name": "Genesis9",
"label": "Genesis 9",
"type": "DzFigure",
"properties": {
"X Translate": 0.0,
"Y Translate": 0.0,
"Z Translate": 0.0,
"X Rotate": 0.0,
"Y Rotate": 0.0,
"Z Rotate": 0.0,
"Scale": 100.0,
"Head Size": 0.5
}
}
Use when: You need to read transforms, morphs, or other numeric properties on a node.
daz_get_selected_nodes
Return the nodes currently selected in the DAZ Studio viewport.
Returns:
{
"count": 2,
"nodes": [
{"label": "Genesis 9", "name": "Genesis9"},
{"label": "Camera 1", "name": "Camera"}
]
}
Use when: The user has manually selected items in DAZ Studio and wants the AI to act on that selection.
🔬 Morph Discovery Tools
daz_list_morphs
List all morphs (numeric properties) on a node with their current values.
Arguments:
node_label(string): Node display label or internal nameinclude_zero(bool, defaultFalse): Include morphs with zero values
Returns:
{
"morphs": [
{"label": "Height", "name": "Height", "value": 1.05, "path": "Morphs/Body"},
{"label": "Head Size", "name": "HeadSize", "value": 0.9, "path": "Morphs/Head"}
],
"count": 2,
"nodeLabel": "Genesis 9"
}
Use when:
- Discovering what morphs are available on a figure
- Checking which morphs are currently active
- Building morph selection UIs
- Exploring character customization options
Example:
# List only active morphs (non-zero values)
daz_list_morphs("Genesis 9", include_zero=False)
# List ALL available morphs (warning: may return 500-1000+ morphs)
daz_list_morphs("Genesis 9", include_zero=True)
Note: Genesis figures can have 1000+ morphs. Use include_zero=False to see only active morphs, or use daz_search_morphs to filter by pattern.
daz_search_morphs
Search for morphs matching a name pattern.
Arguments:
node_label(string): Node display label or internal namepattern(string): Substring to search for (case-insensitive)include_zero(bool, defaultFalse): Include morphs with zero values
Returns:
{
"morphs": [
{"label": "Smile", "name": "Smile", "value": 0.0, "path": "Morphs/Expressions"},
{"label": "Smile Open", "name": "SmileOpen", "value": 0.0, "path": "Morphs/Expressions"}
],
"count": 2,
"pattern": "smile",
"nodeLabel": "Genesis 9"
}
Use when:
- Finding specific morphs (e.g., all smile morphs, head morphs)
- Discovering morphs by category or body part
- Building filtered morph lists
Example:
# Find all smile-related morphs
daz_search_morphs("Genesis 9", "smile", include_zero=True)
# Find active head morphs only
daz_search_morphs("Genesis 9", "head", include_zero=False)
# Find all facial expression morphs
daz_search_morphs("Genesis 9", "express", include_zero=True)
Common search patterns:
"smile","frown","express"- Facial expressions"head","face","nose"- Facial features"arm","leg","body"- Body parts"muscle","tone","fit"- Body definition"height","scale"- Size adjustments
🌳 Scene Hierarchy Tools
daz_get_node_hierarchy
Get complete hierarchy tree for a node with all descendants.
Arguments:
node_label(string): Root node display label or internal namemax_depth(int, default10): Maximum recursion depth (0 = unlimited)
Returns:
{
"node": "Genesis 9",
"hierarchy": {
"label": "Genesis 9",
"name": "Genesis9",
"type": "DzFigure",
"children": [
{
"label": "hip",
"name": "hip",
"type": "DzBone",
"children": [...]
}
]
},
"totalDescendants": 127
}
Use when:
- Understanding skeleton structure
- Exploring bone relationships
- Mapping complex scene hierarchies
- Finding all descendants of a no
…
Source & license
This open-source MCP server is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: bluemoonfoundry
- Source: bluemoonfoundry/daz-mcp-server
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.