Best for
- Use when working with Maya, Blender, Houdini, 3ds Max, or any DCC MCP integration.
dcc-mcp/dcc-mcp-core/.agents/skills/dcc-mcp-core/SKILL.md
Foundation library for the DCC Model Context Protocol (MCP) ecosystem. Provides Rust-powered action management, skills system, IPC transport, MCP Streamable HTTP server (2025-03-26 spec, with 2025-06-18 and 2025-11-25 awareness), sandbox security, shared memory, screen capture, USD scene support, and telemetry for AI-assisted DCC workflows. Use when working with Maya, Blender, Houdini, 3ds Max, or any DCC MCP integration.
Decision brief
The foundational library enabling AI assistants to interact with Digital Content Creation (DCC) software through the Model Context Protocol (MCP).
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/dcc-mcp/dcc-mcp-core --skill ".agents/skills/dcc-mcp-core"Inspect the Agent Skill "dcc-mcp-core" from https://github.com/dcc-mcp/dcc-mcp-core/blob/874c7b52c12587529827990c497d2c8292e5d875/.agents/skills/dcc-mcp-core/SKILL.md at commit 874c7b52c12587529827990c497d2c8292e5d875. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
channel = IpcChannelAdapter.connect("dcc-mcp-maya-12345") try: Send a Call frame and receive the reply channel.sendframe(DccLinkFrame(msgtype=1, seq=1, body=b'{"method":"executepython","params":"cmds.sphere()"}')) reply = channel.recvframe() DccLinkFrame if reply.msgtype == 2: R…
Review the “Quick Decision Guide — Use the Right API” section in the pinned source before continuing.
Review the “What This Library Does” section in the pinned source before continuing.
For agent-side DCC control, install the published dcc-mcp Skill and use its CLI workflow; the Python package below is for adapters and embedded runtimes:
Review the “Direct ClawHub CLI:” section in the pinned source before continuing.
Permission review
The documentation asks the agent to run terminal commands or scripts.
npx --yes [email protected] install @loonghao/dcc-mcpThe documentation asks the agent to run terminal commands or scripts.
# Python 3.7-3.14, zero runtime dependenciesThe documentation asks the agent to create, modify, or delete local files.
# 1. Create directory structureEvidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 90/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 39 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
The foundational library enabling AI assistants to interact with Digital Content Creation (DCC) software through the Model Context Protocol (MCP).
| Task | Use this | Not this |
|---|---|---|
| Operate a live DCC from an agent | dcc-mcp + dcc-mcp-cli | embedding the Python API in the agent |
| Create or modernize a DCC-MCP adapter | dcc-mcp-creator | adapter-local copies of core wiring |
| Create a DCC-specific Skill package | dcc-mcp-skills-creator | a new adapter repository |
| Analyze or report a failed DCC call | dcc-mcp recovery flow: doctor, failure-filtered stats, dcc_feedback__report, public-safe issue report | raw unreviewed logs |
| Return action result | success_result() / error_result() | raw dicts |
| Load skills | scan_and_load() → (skills, skipped) | manual file scanning |
| One-call MCP server | create_skill_server("maya", McpHttpConfig(port=8765)) | manual wiring |
| Validate params | ToolValidator.from_schema_json() | isinstance checks |
| Connect to DCC | IpcChannelAdapter.connect(name) or SocketServerAdapter(path) | raw sockets |
| Define MCP tool | ToolDefinition + ToolAnnotations | raw JSON |
| Serve MCP over HTTP | McpHttpServer(registry, McpHttpConfig(port=8765)) | raw HTTP server |
| Build DCC adapter | DccServerOptions.from_env(...) + DccServerBase(options=opts) | legacy 17-parameter constructor |
| Main-thread DCC calls | HostExecutionBridge / dispatcher passed via DccServerOptions | private _core imports |
| Enable skill hot-reload | DccSkillHotReloader(dcc_name, server) | custom file watchers |
| Gateway failover | DccGatewayElection(dcc_name, server) | manual election logic |
| Write skill scripts | skill_entry + skill_success / skill_error | manual JSON output |
| Capability | Description |
|---|---|
| Action Management | Register, validate, dispatch, and execute actions with typed inputs/outputs |
| Skills System | Zero-code script registration (Python/MEL/Batch/Shell/JS) as MCP tools via SKILL.md |
| Transport Layer | High-performance IPC via ipckit with DccLink framing (IpcChannelAdapter, SocketServerAdapter) |
| MCP HTTP Server | MCP Streamable HTTP (2025-03-26 spec) powered by axum/Tokio, runs in background thread |
| Process Management | Launch, monitor, auto-recover DCC processes (Maya, Blender, Houdini, etc.) |
| Sandbox Security | Policy-based access control, input validation, audit logging |
| Shared Memory | LZ4-compressed inter-process data exchange for large scenes |
| Screen Capture | Cross-platform DCC viewport capture for visual feedback |
| USD Support | Read/write Universal Scene Description for pipeline integration |
| Telemetry | Structured tracing and recording for observability |
| MCP Protocol Types | Complete Tool/Resource/Prompt schema implementations |
| DCC Server Base | Reusable base class for DCC adapters (hot-reload, gateway election, lifecycle) |
| Gateway Failover | Automatic gateway election when primary gateway becomes unreachable |
| Skill Hot-Reload | File-watching auto-reload for live skill development |
For agent-side DCC control, install the published dcc-mcp Skill and use its
CLI workflow; the Python package below is for adapters and embedded runtimes:
openclaw skills install @loonghao/dcc-mcp
# Direct ClawHub CLI:
npx --yes [email protected] install @loonghao/dcc-mcp
Use dcc-mcp-creator
only for a complete adapter/runtime, and
dcc-mcp-skills-creator
only for a DCC-specific Skill package.
pip install dcc-mcp-core
# Python 3.7-3.14, zero runtime dependencies
Use the repository-pinned vx toolchain for Rust dependency refreshes and CI
parity:
vx --version # CI pins loonghao/[email protected]
vx cargo update
vx cargo tree -d
vx cargo build --workspace --all-targets --timings
Review duplicate dependency output before editing manifests, and keep generated lockfile changes only when they are part of the intended dependency refresh.
import os
from dcc_mcp_core import create_skill_server, McpHttpConfig
os.environ["DCC_MCP_MAYA_SKILL_PATHS"] = "/opt/my-skills"
# One call: creates registry + dispatcher + catalog + discovers skills + server
server = create_skill_server("maya", McpHttpConfig(port=8765))
handle = server.start()
print(f"Maya MCP server: {handle.mcp_url()}")
# Agents connect and use on-demand skill discovery:
# → search_tools(query="bevel") or search_skills(query="modeling")
# → get_skill_info(skill_name="maya-bevel") to inspect schemas
# → load_skill("maya-bevel") only when selected
# → tools/call maya_bevel__bevel to execute
# Do not treat the first tools/list page as complete; follow nextCursor if listing.
handle.shutdown()
from dcc_mcp_core import success_result, error_result, from_exception
# All actions should return ActionResultModel
def my_action(params):
try:
result = do_work(params)
return success_result(
f"Created {result['name']}",
prompt="Object created. You can now modify its properties.",
object_name=result["name"],
)
except Exception as e:
return from_exception(str(e), message="Action failed")
import json
from dcc_mcp_core import ToolValidator, error_result
schema = json.dumps({
"type": "object",
"required": ["name", "radius"],
"properties": {
"name": {"type": "string", "maxLength": 64},
"radius": {"type": "number", "minimum": 0.001},
},
})
validator = ToolValidator.from_schema_json(schema)
ok, errors = validator.validate(json.dumps(params))
if not ok:
return error_result("Invalid parameters", "; ".join(errors))
from dcc_mcp_core import DccLinkFrame, IpcChannelAdapter, success_result, error_result
# Connect to a DCC process via named pipe / Unix domain socket
channel = IpcChannelAdapter.connect("dcc-mcp-maya-12345")
try:
# Send a Call frame and receive the reply
channel.send_frame(DccLinkFrame(msg_type=1, seq=1, body=b'{"method":"execute_python","params":"cmds.sphere()"}'))
reply = channel.recv_frame() # DccLinkFrame
if reply.msg_type == 2: # Reply
return success_result(reply.body.decode())
else:
return error_result("DCC call failed", reply.body.decode())
finally:
channel.shutdown() if hasattr(channel, 'shutdown') else None
from pathlib import Path
from dcc_mcp_core import DccServerBase, DccServerOptions
class BlenderMcpServer(DccServerBase):
def __init__(self, port: int = 8765, **kwargs):
opts = DccServerOptions.from_env(
"blender",
Path(__file__).parent / "skills",
port=port,
**kwargs,
)
super().__init__(options=opts)
def _version_string(self) -> str:
import bpy
return bpy.app.version_string
# All skill methods, hot-reload, gateway are ready:
server = BlenderMcpServer(port=8765)
server.register_builtin_actions()
handle = server.start()
print(f"MCP: {handle.mcp_url()}")
from dcc_mcp_core import SkillWatcher
watcher = SkillWatcher(debounce_ms=300)
watcher.watch("/my/dev/skills") # immediate load + start watching
# Get always-up-to-date snapshot
current_skills = watcher.skills() # -> List[SkillMetadata]
import json
from dcc_mcp_core import ToolRegistry, ToolDispatcher
reg = ToolRegistry()
reg.register("create_sphere",
input_schema=json.dumps({"type": "object", "required": ["radius"],
"properties": {"radius": {"type": "number", "minimum": 0.0}}}))
dispatcher = ToolDispatcher(reg)
dispatcher.register_handler("create_sphere", lambda params: {"created": True, "r": params["radius"]})
# Introspect handlers
dispatcher.has_handler("create_sphere") # True
dispatcher.handler_count() # 1
dispatcher.handler_names() # ["create_sphere"]
dispatcher.remove_handler("create_sphere") # True
result = dispatcher.dispatch("create_sphere", json.dumps({"radius": 2.0}))
# result == {"action": "create_sphere", "output": {"created": True, "r": 2.0}, "validation_skipped": False}
Most DCC applications (Maya, Blender, Houdini) require scene API calls on their main thread.
For Python adapters, prefer the public host bridge/dispatcher stack and pass it through DccServerOptions before skills are loaded. Low-level DeferredExecutor details are covered in docs/guide/dcc-thread-safety.md.
from pathlib import Path
from dcc_mcp_core import DccServerBase, DccServerOptions, HostExecutionBridge, InProcessCallableDispatcher
dispatcher = InProcessCallableDispatcher() # replace with the DCC UI-thread dispatcher
bridge = HostExecutionBridge(dispatcher=dispatcher)
opts = DccServerOptions.from_env("maya", Path("skills"), execution_bridge=bridge)
server = DccServerBase(options=opts)
handle = server.start()
from dcc_mcp_core.skill import skill_entry, skill_success, skill_error, skill_exception
@skill_entry
def create_sphere(radius: float = 1.0, name: str = "sphere") -> dict:
import maya.cmds as cmds
obj = cmds.polySphere(r=radius, n=name)[0]
return skill_success(
f"Created sphere '{obj}' with radius {radius}",
prompt="You can now adjust properties or add materials.",
object_name=obj,
radius=radius,
)
Use child-only environment overrides instead of mutating os.environ when
multiple artist and automation sessions share a machine:
from dcc_mcp_core import PyDccLauncher
launcher = PyDccLauncher()
info = launcher.launch(
name="nuke-mcp",
executable="Nuke15.2",
args=["--disable-nuke-frameserver", "project.nk"],
environment={
"NUKE_DISABLE_FRAMESERVER": "1",
"DCC_MCP_NUKE_PORT": "0",
},
working_directory="/projects/solar-system",
)
# 1. Create directory structure
mkdir -p my-tool/scripts/
# 2. Write SKILL.md (name is required, follows agentskills.io spec)
cat > my-tool/SKILL.md << 'EOF'
---
name: my-tool
description: "My custom DCC automation tools. Use when automating scene setup or batch operations."
compatibility: "python>=3.7"
allowed-tools: "python"
metadata:
dcc-mcp:
dcc: maya
version: "1.0.0"
layer: example
tags: ["automation", "custom"]
tools: tools.yaml
---
# My Tool
Automation scripts for Maya workflow optimization.
EOF
# 3. Add the sibling tool declaration referenced by metadata.dcc-mcp.tools
cat > my-tool/tools.yaml << 'YEOF'
tools:
- name: list_selected
description: List selected objects in the Maya scene.
input_schema:
type: object
properties: {}
read_only: true
idempotent: true
source_file: scripts/list_selected.py
YEOF
# 4. Add a script
cat > my-tool/scripts/list_selected.py << 'PYEOF'
#!/usr/bin/env python3
"""List selected objects in the Maya scene."""
import json
result = {"selected": ["pSphere1", "pCube1"], "count": 2}
print(json.dumps(result))
PYEOF
# 5. Use it
export DCC_MCP_SKILL_PATHS="$(pwd)/my-tool"
python -c "
from dcc_mcp_core import scan_and_load
skills, _ = scan_and_load(dcc_name='maya')
print(f'Loaded: {[s.name for s in skills]}')
# Action: my_tool__list_selected
"
┌─────────────────────────────────────────────────────┐
│ Python Layer │
│ dcc_mcp_core/__init__.py → _core (PyO3 cdyll) │
│ 380+ public symbols re-exported from Rust core │
│ + Pure-Python: DccServerBase, DccServerOptions, │
│ gateway election, hot-reload, factory, helpers │
└──────────────────────┬──────────────────────────────┘
│ PyO3 bindings
┌──────────────────────▼──────────────────────────────┐
│ Rust Workspace (47 members total) │
│ 46 functional crates + workspace-hack │
│ naming → models → actions → skills → protocols │
│ gateway/http-types/http-server/http-py/http │
│ host → transport → process → sandbox → telemetry │
└─────────────────────────────────────────────────────┘
| Variable | Purpose |
|---|---|
DCC_MCP_SKILL_PATHS | Colon/semicolon-separated paths to scan for SKILL.md dirs |
DCC_MCP_{APP}_SKILL_PATHS | Per-app skill paths (e.g. DCC_MCP_MAYA_SKILL_PATHS) |
DCC_MCP_GATEWAY_PORT | Gateway port for multi-DCC setup |
DCC_MCP_REGISTRY_DIR | Directory for FileRegistry JSON |
MCP_LOG_LEVEL | Log level override (DEBUG, INFO, WARN) |
DCC_MCP_IPC_ADDRESS | IPC endpoint address (auto-set by register_diagnostic_handlers) |
DCC_MCP_GATEWAY_PROBE_INTERVAL | Seconds between gateway health probes (default 1) |
DCC_MCP_GATEWAY_PROBE_TIMEOUT | Timeout per probe in seconds (default 2) |
DCC_MCP_GATEWAY_PROBE_FAILURES | Consecutive failures before election (default 2) |
| File | Purpose |
|---|---|
AGENTS.md | AI agent navigation map — entry point, decision tables, top traps |
docs/guide/agents-reference.md | Detailed agent rules — traps, do/don't, code style, project-specific architecture |
llms.txt | Concise API reference for LLMs |
llms-full.txt | Comprehensive API reference with all examples |
python/dcc_mcp_core/__init__.py | Complete public API (380+ symbols, ground truth for imports) |
python/dcc_mcp_core/_core.pyi | Generated type stubs — authoritative parameter names after a dev/stub build |
examples/skills/ | 15 complete skill package examples |
tests/ | Python integration tests (executable usage examples) |
dcc: maya)dcc: blender)dcc: houdini)dcc: 3dsmax)dcc: python)The library currently implements MCP 2025-03-26 (Streamable HTTP). The ecosystem has since released:
| Version | Key Features | Status in dcc-mcp-core |
|---|---|---|
| 2025-03-26 | Streamable HTTP, Tool Annotations, OAuth 2.1 | Implemented |
| 2025-06-18 | Structured Tool Output, Elicitation, Resource Links, JSON-RPC batching removed, MCP-Protocol-Version header mandatory | Planned |
| 2025-11-25 | Icon metadata, Tasks (experimental), Sampling with tool calls, JSON Schema 2020-12, enhanced OAuth | Planned |
AI Agents: Do NOT implement draft features manually. Wait for dcc-mcp-core to expose them via McpHttpServer. Track progress at the GitHub repository.
scan_and_load returns (List[SkillMetadata], List[str]) — always unpack: skills, skipped = scan_and_load(...)HostExecutionBridge / dispatcher wiring; use DeferredExecutor only when following docs/guide/dcc-thread-safety.md low-level guidanceserver.start() — server reads from registry at startup onlyIpcChannelAdapter + DccLinkFrame for IPC (v0.14+) — FramedChannel/connect_ipc were removed in #251ToolDispatcher(registry) takes ONE arg — no validator= parameter{skill_name.replace('-','_')}__{script_stem} (double underscore)name must match parent directory name (agentskills.io spec)allowed-tools in SKILL.md is space-separated string, not a list (agentskills.io spec)DccServerBase provides all skill/lifecycle/gateway/hot-reload methods — don't reimplementMCP-Protocol-Version header is mandatory in 2025-06-18 — handled by McpHttpServer internallyAlternatives
K-Dense-AI/scientific-agent-skills
Distributed computing for larger-than-RAM pandas/NumPy workflows. Use when you need to scale existing pandas/NumPy code beyond memory or across clusters. Best for parallel file processing, distributed ML, integration with existing pandas code. For out-of-core analytics on single machine use vaex; for in-memory speed use polars.
K-Dense-AI/scientific-agent-skills
Medicinal chemistry filters for compound triage. Apply drug-likeness rules (Lipinski, Veber, CNS), structural alert catalogs (PAINS, NIBR, ChEMBL), complexity metrics, and the medchem query language for library filtering.
K-Dense-AI/scientific-agent-skills
Use NeuroKit2 to build or audit reproducible research workflows for physiological time-series preprocessing, event/interval analysis, multimodal alignment, variability, and complexity. Trigger when code imports neurokit2 or needs its current APIs, schemas, and method-aware validation—not for diagnosis or device validation.
trailofbits/skills
Detects timing side-channel vulnerabilities in cryptographic code. Use when implementing or reviewing crypto code, encountering division on secrets, secret-dependent branches, or constant-time programming questions in C, C++, Go, Rust, Swift, Java, Kotlin, C#, PHP, JavaScript, TypeScript, Python, or Ruby.