Skip to content

CLI Reference

This repository ships four operator-facing binaries. This page is the single source of truth for every flag, every environment variable, and the five deployment scenarios they cover. Flags on each binary map 1:1 onto an DCC_MCP_* environment variable, so any deployment manifest can drive the same configuration surface.

dcc-mcp-cli and dcc-mcp-server are published as raw GitHub Release assets on every release. The CLI can be installed directly from a URL:

bash
curl -fsSL https://raw.githubusercontent.com/dcc-mcp/dcc-mcp-core/main/scripts/install-cli.sh | bash

# Windows PowerShell
powershell -c "irm https://raw.githubusercontent.com/dcc-mcp/dcc-mcp-core/main/scripts/install-cli.ps1 | iex"

Pin a release by setting DCC_MCP_VERSION=v0.17.17 or passing --version v0.17.17 to the install script.

A standalone CLI-only ZIP (dcc-mcp-cli-<version>-<platform>.zip) is also published as a GitHub Release asset alongside the server bundle.

BinaryRoleSource
dcc-mcp-cliUser/CI control plane for local or remote DCC-MCP REST endpoints.crates/dcc-mcp-cli/
dcc-mcp-serverPer-DCC MCP + REST server and machine-wide gateway daemon.crates/dcc-mcp-server/
dcc-mcp-tunnel-relayPublic-facing WebSocket relay for the zero-config remote tunnel (#504).crates/dcc-mcp-tunnel-relay/
dcc-mcp-tunnel-agentLocal sidecar that registers with the relay and forwards MCP traffic.crates/dcc-mcp-tunnel-agent/

Development helper binaries (stub_gen) are documented in AGENTS.md.


dcc-mcp-cli

Client-side control plane for DCC-MCP. It is the primary operator and agent UX; it does not host skills and does not replace the runtime binary dcc-mcp-server.

dcc-mcp-cli has two gateway modes:

  • local (default): read the core default FileRegistry directly and use the selected DCC instance's MCP HTTP endpoint for search, describe, load-skill, call, wait-ready, and guarded stop-instance.
  • named remote profiles: route the same control workflow through the selected remote gateway base URL.

Register and select remote profiles with:

bash
dcc-mcp-cli gateway register https://workstation.example:19293 --name pcA
dcc-mcp-cli gateway list
dcc-mcp-cli gateway set pcA
dcc-mcp-cli gateway set local

--gateway <name> overrides the current profile for one command. --base-url and DCC_MCP_BASE_URL remain supported as direct endpoint overrides for legacy scripts and smoke checks.

In the default local profile, agent-control commands first ensure the machine-wide loopback gateway is healthy, then local list reads the FileRegistry and local search, describe, load-skill, call, wait-ready, and stop-instance resolve the target instance from that registry and talk to its advertised mcp_url / readyz / safe_stop_url directly. The gateway daemon is still kept available for Admin, health, update, and cross-instance control-plane routes. When the current profile is remote, or when --gateway pcA / --base-url ... is supplied, the same commands use the gateway /v1/* surfaces.

list is an inventory and diagnostics command: it keeps live booting rows and sidecar rows with dispatch_status=unavailable visible so operators can see startup failures. Local search, describe, load-skill, call, and reload-skills only route to direct MCP instances ready for local CLI control (status=available or busy, with dispatch_status=ready when that metadata is reported). A per-DCC sidecar row is locally routable once it reports dispatch_status=ready; before that it remains visible as startup diagnostics and is not used for tool calls. Use wait-ready or doctor when list shows a live instance that is not yet ready for direct local CLI control. Each local list row includes direct_control.recommended_next_action so agents can distinguish "route this local MCP row" from "wait for sidecar dispatch readiness". Local rows also include direct_control.diagnostics, which folds sidecar failure metadata into one stable place: failure_stage, failure_reason, host_rpc_*, gateway guardian/recovery fields, and stdout/stderr log paths when the DCC supervisor records them in the registry. doctor summarizes not-ready local rows under local.inventory.direct_control.not_ready_instances.

Agent-control commands (list, search, describe, load-skill, call, wait-ready, reload-skills, and stop-instance) and endpoint-level commands that need a local gateway (health, stats, update, and smoke without an explicit --url) auto-ensure only loopback HTTP targets (http://127.0.0.1:<port> or http://localhost:<port>). Disable this for one invocation with --no-auto-gateway. Commands that operate only on local files (install, marketplace, lint), explicit lifecycle commands (gateway ...), and smoke checks against an explicit --url do not auto-start the gateway. Use dcc-mcp-cli doctor when startup state is ambiguous: it reports the current profile config, selected mode, registry directory and inventory, local direct-control readiness counts, gateway daemon status, and server binary path/source/version without launching or downloading anything.

bash
dcc-mcp-cli list
dcc-mcp-cli list --gateway pcA
dcc-mcp-cli doctor
dcc-mcp-cli health
dcc-mcp-cli stats --range 7d --dcc-type houdini --skill houdini-render
dcc-mcp-cli stats --tool render_rop --status failure --session-id solar-session
dcc-mcp-cli --no-auto-gateway health
dcc-mcp-cli gateway register https://workstation.example:19293 --name pcA
dcc-mcp-cli gateway list
dcc-mcp-cli gateway set pcA
dcc-mcp-cli gateway set local
dcc-mcp-cli search --query sphere --dcc-type maya --instance-id abc12345
dcc-mcp-cli describe maya.abc12345.create_sphere
dcc-mcp-cli load-skill workflow --dcc-type 3dsmax --instance-id 80321760
dcc-mcp-cli call maya.abc12345.create_sphere --json '{"radius":2}'
dcc-mcp-cli call maya_scene__get_session_info --dcc-type maya --instance-id abc12345 --json '{}'
dcc-mcp-cli wait-ready --dcc-type maya --instance-id abc12345 --require skill_catalog,host_execution_bridge
dcc-mcp-cli stop-instance --dcc-type maya --instance-id abc12345 --expected-owner release-smoke-test
dcc-mcp-cli install --dcc-type maya --version 2026
dcc-mcp-cli install --dcc-type maya --version 2026 --python "C:/Program Files/Autodesk/Maya2026/bin/mayapy.exe"
dcc-mcp-cli install --dcc-type maya --version 2026 --python "C:/Program Files/Autodesk/Maya2026/bin/mayapy.exe" --execute
dcc-mcp-cli marketplace add dcc-mcp/marketplace
dcc-mcp-cli marketplace search --query hunyuan --dcc maya
dcc-mcp-cli marketplace inspect dcc-asset-hunyuan-download
dcc-mcp-cli marketplace install dcc-asset-hunyuan-download --dcc maya
dcc-mcp-cli reload-skills --dcc-type maya
dcc-mcp-cli marketplace list-installed --dcc maya
dcc-mcp-cli marketplace outdated --dcc maya
dcc-mcp-cli marketplace update dcc-mcp-maya-skills --dcc maya
dcc-mcp-cli reload-skills --dcc-type maya
dcc-mcp-cli marketplace update --all
dcc-mcp-cli marketplace pack path/to/skill --out dist/
dcc-mcp-cli marketplace publish path/to/skill --catalog marketplace.json --install-url https://example.com/skill.zip --sha256 sha256:<digest>
dcc-mcp-cli update check
dcc-mcp-cli update check --binary dcc-mcp-server --current-version 0.18.16
dcc-mcp-cli update apply
dcc-mcp-cli gateway daemon start
dcc-mcp-cli gateway daemon restart
dcc-mcp-cli gateway daemon stop
dcc-mcp-cli gateway daemon status
dcc-mcp-cli lint path/to/skills

Commands

CommandREST/API contractMeaning
healthGET /v1/healthzCheck the configured endpoint.
stats [--range 1h|24h|7d|all] [--dcc-type <dcc>] [--skill <name>] [--tool <name>] [--status success|failure] [--instance-id <id>] [--session-id <id>]GET /v1/debug/statsQuery persisted tool-call counts, success/failure, latency, tokens, and top dimensions after applying all supplied filters. JSON is the default output for agent use.
doctor [--registry-dir <path>] [--gateway-port <port>]local filesystem + gateway probeReport profile config/current selection, local registry path/inventory, direct-control readiness counts and not-ready diagnostics, gateway daemon status, and server binary diagnostics without auto-starting or downloading services.
list [--gateway <profile>]local FileRegistry or GET /v1/instancesList live DCC instances. Defaults to local FileRegistry after ensuring the loopback gateway; remote profiles use the selected gateway.
search [--instance-id <id>]local MCP search_tools or remote POST /v1/searchSearch callable capabilities, optionally scoped to a full UUID or unique prefix.
describe <tool-slug>local MCP tools/list or remote POST /v1/describeInspect a capability before calling it.
load-skill <skill-name> [--dcc-type <dcc>] [--instance-id <id>]local MCP tools/call load_skill or remote POST /v1/load_skillActivate a progressive skill and print its registered tools.
call <tool-slug> --json <object>local MCP tools/call or remote POST /v1/callInvoke one capability.
call <backend-tool> --dcc-type <dcc> --instance-id <id> --json <object>local MCP tools/call or remote POST /v1/dcc/{dcc}/instances/{id}/callInvoke a backend tool without constructing a dotted gateway slug.
wait-ready [--dcc-type <dcc>] [--instance-id <id>] [--require <bits>]local registry + per-instance /v1/readyz, or remote gateway inventory + /v1/readyzWait for smoke-test readiness bits such as skill_catalog or host_execution_bridge.
reload-skills [--dcc-type <dcc>] [--instance-id <id>]local MCP tools/call dcc_admin__reload_skills, or remote POST /v1/dcc/{dcc}/instances/{id}/callAsk running adapters to re-scan skill search paths after marketplace installs or path changes.
stop-instance --dcc-type <dcc> --instance-id <id>local safe_stop_url or remote POST /v1/dcc/{dcc}/instances/{id}/stopForward a guarded safe-stop request to instances that advertise safe_stop_url.
install --dcc-type <dcc> [--version <v>] [--python <path>] [--execute]catalog-backed local plan / executorResolve the matching adapter and emit an auditable install plan; with --execute, run package-install steps with consent, rollback, and package/path verification. Live DCC checks stay in the emitted next_steps.
marketplace add <source>local source registryRegister a marketplace source (dcc-mcp/marketplace, a GitHub owner/repo, raw JSON URL, or local catalog file).
marketplace listlocal source registryList the built-in, configured, and environment-provided marketplace sources.
marketplace search [--query <q>] [--dcc <dcc>] [--source <source>]marketplace catalog JSON/YAMLSearch skill package entries across configured or explicit sources.
marketplace inspect <name> [--source <source>]marketplace catalog JSON/YAMLPrint exact entry metadata including version and install fields.
marketplace install <name> [--dcc <dcc>] [--source <source>] [--force]marketplace catalog + local filesystem/gitInstall a skill package to ~/.dcc-mcp/marketplace/<dcc>/<name>/.
marketplace list-installed [--dcc <dcc>]local installed-state fileList locally installed marketplace packages and their versions/paths.
marketplace uninstall <name> --dcc <dcc>local installed-state file + filesystemRemove an installed marketplace package.
marketplace outdated [NAME...] [--dcc <dcc>]marketplace catalog + local installed stateCompare installed versions against latest catalog entries and list packages with newer versions available.
marketplace update [<name>] [--all] [--dcc <dcc>]marketplace catalog + git/filesystem + local installed stateUpgrade installed packages to the latest catalog version. For git installs, fetches the new ref in place; for other types, re-installs from the catalog. Use --all to update every outdated package.
marketplace pack <path> [--out <path>]local filesystem + zipBuild a release zip for a marketplace package and print its SHA-256 digest.
marketplace publish <path> --catalog <file> --install-url <url>local marketplace catalog fileBuild or update a marketplace.json entry from SKILL.md metadata and CLI overrides.
update check [--binary <name>] [--current-version <version>]GET /v1/update/checkCheck the gateway update manifest. Defaults to the CLI binary/version; pass --binary dcc-mcp-server plus a server version when checking an instance shown in Admin.
update applyGET /v1/update/check + download URLDownload and stage the CLI binary for the next CLI launch. It does not update running server instances; use Admin's instance update button or dcc-mcp-server update apply in the server environment.
gateway register <url> --name <profile>local profile configPersist a named remote gateway profile.
gateway listlocal profile configShow configured remote profiles and the active local/remote selection.
gateway set <profile|local>local profile configSelect the active gateway profile.
gateway daemon start [--port <port>]local processStart the local machine-wide gateway daemon. Defaults to --gateway-idle-timeout-secs 0, so an explicitly managed daemon stays alive with no backends.
gateway daemon restart [--port <port>]local processStop the pidfile-tracked daemon, then start it again. The restart's start phase uses the same persistent default as daemon start.
gateway daemon stop [--port <port>]local processStop a running gateway daemon by PID file and verify exit.
gateway daemon status [--port <port>]local processReport gateway daemon health, PID, process liveness, registry dir, PID file, health URL, and CLI version.
gateway ensure/start/stop/statuslocal processBackward-compatible aliases for older scripts; prefer gateway daemon ... in user-facing docs.
lint [PATH ...]local filesystem validatorRecursively validate SKILL.md packages two levels below each path by default.

gateway daemon start and gateway daemon restart are the durable operator paths. Their default --gateway-idle-timeout-secs 0 disables idle shutdown; pass a non-zero timeout only when a script intentionally wants a short-lived daemon. Automatic loopback gateway ensure applies to the agent-control path and endpoint commands; it can be disabled per invocation with --no-auto-gateway.

install defaults to a planning contract: it resolves catalog entries and spells out the adapter package / host-plugin / verification steps without silently modifying DCC plugin folders. The JSON plan also includes machine-readable next_steps: first a read-install-instructions step pointing at the adapter-maintained raw install.md runbook when the catalog or GitHub repo URL provides one, then command arrays for doctor, list, wait-ready, search, marketplace skill search/inspect/install, and reload-skills, plus the manual host-plugin start step. Pass --python (or DCC_MCP_INSTALL_PYTHON) when a pip-based adapter must be installed into a DCC interpreter such as mayapy, hython, or Blender's bundled Python. Pass --execute to prompt for consent and run executable package-install steps. Execution rolls back completed steps when a later step fails, uses <python> -m pip for pip installs, verifies pip installs with pip show, and verifies git/zip/path installs by checking that their target path exists and is not an empty directory. A DCC is considered online only after its host plugin or sidecar starts, remains alive, and appears in dcc-mcp-cli list; the CLI does not fake gateway registration during install.

Studios with dedicated deployment pipelines can disable automatic install execution by setting DCC_MCP_INSTALL_DISABLED=1. The plan still returns the adapter metadata and next_steps, but install_policy.auto_install_enabled is false, --execute is skipped, and the agent-facing prompt comes from DCC_MCP_INSTALL_DISABLED_PROMPT (supports {adapter}, {dcc_type}, and {version} placeholders). Use this for messages such as "Automatic install is unavailable; contact Pipeline TD to deploy {adapter} for {dcc_type}."

marketplace is the CLI-first discovery surface for official and private skill package catalogs. The built-in source is https://raw.githubusercontent.com/dcc-mcp/marketplace/main/marketplace.json. Additional sources are persisted under ~/.dcc-mcp/marketplace/sources.json, overridden with DCC_MCP_MARKETPLACE_SOURCES_FILE, or supplied ephemerally with DCC_MCP_MARKETPLACE_SOURCES (comma-separated). Installs land in ~/.dcc-mcp/marketplace/<dcc>/<name>/, with DCC_MCP_MARKETPLACE_INSTALL_ROOT overriding the root. The current installer supports install.type: git, install.type: path, and install.type: zip. Archive installs verify install.sha256 when present and reject entries that escape the install root. DCC adapters include ~/.dcc-mcp/marketplace/<dcc> in their skill search paths, so installed skills are discovered on adapter startup or the next dcc-mcp-cli reload-skills --dcc-type <dcc>. After a reload, run dcc-mcp-cli load-skill <skill-name> --dcc-type <dcc> --instance-id <id> when the adapter has not auto-loaded that skill yet.

update compares each installed package version against the latest catalog entry. For git-type installs, if a .git directory already exists the command runs git fetch && git checkout <ref> in place; otherwise it re-clones. The local installed-state file is updated with the new version metadata. Installed packages with no matching catalog entry (e.g. the source was removed) are silently skipped.

dcc-mcp-cli update is for binary updates exposed by the gateway update manifest configured with DCC_MCP_UPDATE_MANIFEST_URL (or GatewayConfig.update_manifest_url). update check is safe for both humans and agents because it only reads /v1/update/check; the CLI auto-ensures the local gateway before the request. update apply stages only the CLI binary. For server instances, prefer the Admin Instances panel update button, which calls POST /admin/api/instances/{instance_id}/update and stages dcc-mcp-server with restart-required status. When operating from the server host itself, use dcc-mcp-server update apply instead.

lint reuses the production dcc-mcp-skills validator, so local checks and runtime loading fail for the same structural problems. CI runs the same command with explicit repository skill roots via just lint-skills.

CLI installation assets

The installer scripts download one of these GitHub Release assets:

PlatformAsset
Linux x86_64dcc-mcp-cli-linux-x86_64
Windows x86_64dcc-mcp-cli-windows-x86_64.exe
macOS universal2dcc-mcp-cli-macos-universal2

Default install locations are ~/.local/bin on Linux/macOS and %LOCALAPPDATA%\dcc-mcp\bin on Windows. Override with DCC_MCP_INSTALL_DIR or --install-dir.


dcc-mcp-server

Runtime binary for adapters, sidecars, bridges, and the machine-wide gateway daemon. It remains scriptable for CI and operations, but the primary user and agent UX is dcc-mcp-cli.

Invoking dcc-mcp-server with no subcommand behaves like dcc-mcp-server auto: it ensures a local gateway daemon exists, registers the per-DCC server as a backend, and keeps a lightweight guardian while the backend is alive so the daemon can be re-ensured after a crash.

Run modes

CommandRoleGateway behavior
dcc-mcp-serverImplicit auto.Ensures the standalone gateway daemon, then registers as a backend.
dcc-mcp-server autoExplicit form of the default behavior.Same as the no-subcommand path.
dcc-mcp-server servePer-DCC MCP server.Ensures the standalone gateway daemon, then registers as a backend.
dcc-mcp-server serve --no-auto-gatewayPer-DCC MCP server only.Registers/serves tools but never ensures or binds the gateway port.
dcc-mcp-server auto --legacy-gateway-electionLegacy embedded gateway mode.The per-DCC process competes for the gateway port directly.
dcc-mcp-server sidecarPer-DCC sidecar worker.Ensures the standalone gateway daemon, registers a per-dcc-sidecar row, and dispatches through host RPC. Runtime is implemented by dcc-mcp-sidecar.
dcc-mcp-server translateExternal stdio MCP bridge.Ensures the standalone gateway daemon and registers the bridge as a backend unless --no-register is set.
dcc-mcp-server gatewayMachine-wide gateway daemon.Hosts discovery, routing, resources/prompts, admin, and audit without running DCC tools inline.
dcc-mcp-server update check/applyServer binary update helper.Reads the gateway update manifest on 127.0.0.1:<gateway-port> and stages dcc-mcp-server for the next server launch.

auto and serve share the server flags below. gateway has its own smaller flag surface and rejects server-only flags such as --app.

Core flags

FlagEnvDefaultMeaning
--mcp-portDCC_MCP_MCP_PORT0MCP Streamable HTTP port. 0 = OS-assigned.
--ws-portDCC_MCP_WS_PORT9001WebSocket bridge port for non-Python DCC plugins.
--appDCC_MCP_APP""App tag ("maya", "blender", "photoshop", …). Feeds skill discovery + the registry row.
--skill-paths[]Additional skill search paths (repeatable).
--server-nameDCC_MCP_SERVER_NAME"dcc-mcp-server"Server name advertised to MCP clients.
--no-bridgefalseDisable the WebSocket bridge; MCP HTTP only.
--host127.0.0.1Host to bind to.
--pid-fileWrite the server PID to this file while running.
--forcefalseOverwrite an existing PID file even if it points at a live process.
--shutdown-timeout-secsDCC_MCP_SHUTDOWN_TIMEOUT_SECS10Graceful shutdown deadline.

Auto-gateway flags (auto / serve)

FlagEnvDefaultMeaning
--gateway-portDCC_MCP_GATEWAY_PORT9765Well-known gateway port to ensure/register with. 0 disables gateway ensure/election for this process.
--no-ensure-gatewayfalseDo not auto-launch the standalone gateway daemon before backend registration.
--legacy-gateway-electionDCC_MCP_LEGACY_GATEWAY_ELECTIONfalseRestore the old embedded first-wins election path.
--no-adminDCC_MCP_NO_ADMINfalseDisable the Admin UI on the elected gateway. Admin is enabled by default when a process wins the gateway role.
--admin-pathDCC_MCP_ADMIN_PATH/adminURL prefix for the Admin UI and its JSON APIs.
--registry-dirDCC_MCP_REGISTRY_DIR<temp>/dcc-mcp-registryshared FileRegistry directory used by CLI local mode, sidecars, and gateway runners.
--stale-timeout-secsDCC_MCP_STALE_TIMEOUT30Seconds without heartbeat before an instance is considered stale.
--app-versionDCC_MCP_APP_VERSIONApp version (e.g., "2024.2"); recorded in the registry.
--sceneDCC_MCP_SCENECurrently-open scene / document; recorded in the registry, used by multi-instance disambiguation.
--heartbeat-secsDCC_MCP_HEARTBEAT_INTERVAL5Heartbeat cadence in seconds. 0 disables.

Admin audit/trace persistence is configured by environment only: set DCC_MCP_GATEWAY_AUDIT_DIR to a writable directory to persist /admin/api/calls rows in audit.jsonl and dispatch traces in traces.jsonl; set DCC_MCP_GATEWAY_AUDIT_MAX_ROWS (default 5000) to cap each file.

Removed--gateway-tool-exposure / DCC_MCP_GATEWAY_TOOL_EXPOSURE are gone. The gateway surface is now unconditionally minimal (see docs/guide/rest-api-surface.md).

Removed--gateway-cursor-safe-tool-names / DCC_MCP_GATEWAY_CURSOR_SAFE_TOOL_NAMES. Aggregated gateway prompts/list always emits the cursor-safe i_<id8>__<escaped> wire form (#656).

Standalone gateway flags (gateway)

FlagEnvDefaultMeaning
--daemonDCC_MCP_DAEMONfalseRespawn the current executable as a detached gateway child and exit the parent. Unix children start in a new session; Windows children use detached process flags. Respawn failures fail before the parent exits.
--restartfalseRestart a running gateway daemon. Reads the PID from --pidfile, gracefully stops the old process, waits for exit (up to 15 s), then spawns a fresh detached gateway and polls /health until ready. Requires --pidfile. Handles stale pidfiles (dead process): prints a warning, removes the stale pidfile, and spawns a fresh gateway.
--pidfile PATHDCC_MCP_PIDFILEImplies daemon mode. The pidfile records the detached child PID and is removed when that child exits cleanly. Pidfile write failures fail before the parent exits.
--gateway-persistDCC_MCP_GATEWAY_PERSISTfalseKeep the gateway daemon alive with no registered backends.
--gateway-idle-timeout-secsDCC_MCP_GATEWAY_IDLE_TIMEOUT_SECS30Seconds to wait after the last backend disappears before shutdown. 0 disables idle shutdown.

Daemon auto-ensure paths pass a bounded idle timeout by default unless DCC_MCP_GATEWAY_IDLE_TIMEOUT_SECS is set. The user-facing dcc-mcp-cli gateway daemon start wrapper passes 0 by default so the explicitly managed machine-wide daemon does not exit just because no DCC is currently registered.

File-logging flags

FlagEnvDefaultMeaning
--no-log-fileDCC_MCP_NO_LOG_FILEfalseDisable the rotating file logger (stderr logging stays on).
--log-dirDCC_MCP_LOG_DIRplatform defaultLog file directory.
--log-max-sizeDCC_MCP_LOG_MAX_SIZE10 MiBMax bytes per log file before size-triggered rotation.
--log-max-filesDCC_MCP_LOG_MAX_FILES7How many rolled files to retain.
--log-rotationDCC_MCP_LOG_ROTATION"both"Rotation policy: size, daily, both.
--log-file-prefixDCC_MCP_LOG_FILE_PREFIX"dcc-mcp"Filename prefix. Full filename: <prefix>.<pid>.<YYYYMMDD>.log.
--log-retention-daysDCC_MCP_LOG_RETENTION_DAYS7Age-based retention. 0 disables.
--log-max-total-size-mbDCC_MCP_LOG_MAX_TOTAL_SIZE_MB100Total directory cap in MiB. 0 disables.

Capture replay/diff

dcc-mcp-server capture works on offline traffic capture files produced by DCC_MCP_TRAFFIC_CAPTURE=jsonl:<path> or DCC_MCP_TRAFFIC_CONFIG=<yaml>. It never enables capture itself and does not need a live DCC unless you use replay.

If the YAML config includes an admin_live sink, the retained in-memory window can be downloaded as JSONL from /admin/api/traffic/export (or the stable mirror /v1/debug/traffic/export) and then passed to capture replay or capture diff like any other capture file.

bash
# Replay recorded client -> gateway requests against a live gateway MCP endpoint.
dcc-mcp-server capture replay ./captures/run.sqlite \
    --target http://127.0.0.1:9765/mcp \
    --session sess_01HQX \
    --assert outputs-compatible

# Compare two captures frame-by-frame.
dcc-mcp-server capture diff ./captures/before.sqlite ./captures/after.sqlite \
    --before-session sess_before \
    --after-session sess_after

Replay assertion modes:

ModeContract
outputs-compatibleHTTP status and JSON-RPC result/error shape must match the recorded response.
outputs-equalHTTP status and response JSON must match exactly.
outputs-ignoredRequests are sent and counted, but response bodies are not compared.

Use --format jsonl or --format sqlite when the filename extension is not enough for auto-detection. --rebind-instance-id <id> rewrites captured gateway tool slugs such as maya.old.tool plus instance_id fields so a recording can be replayed against the current live instance.

Typical invocations

bash
# 1) Backwards-compatible auto mode (same as: dcc-mcp-server auto --app maya).
dcc-mcp-server --app maya

# 2) Per-DCC server only, never competing for the shared gateway port.
dcc-mcp-server serve --no-auto-gateway --app maya

# 3) Daemon-backed backend on a workstation with multiple DCCs.
#    Each process ensures the same gateway daemon and registers as a backend.
dcc-mcp-server auto --app maya --server-name maya-shotgun-alpha \
               --scene /shots/ep101/sh0200/shot.ma \
               --log-dir /var/log/dcc-mcp

# 4) Workstation-wide gateway daemon.
dcc-mcp-server gateway --host 127.0.0.1 --port 9765 \
                       --registry-dir /var/lib/dcc-mcp

# 4b) Same gateway as an explicit detached daemon.
dcc-mcp-server gateway --host 127.0.0.1 --port 9765 \
                       --registry-dir /var/lib/dcc-mcp \
                       --daemon --pidfile /var/run/dcc-mcp-gateway.pid

# 5) Bridge an external stdio MCP server behind the same daemon gateway.
dcc-mcp-server translate --stdio "uvx mcp-server-git" \
                         --app-type git --port 0

dcc-mcp-tunnel-relay

Public-facing WebSocket relay that accepts registrations from local tunnel agents and forwards multiplexed MCP sessions from remote AI assistants.

Build with cargo build --bin dcc-mcp-tunnel-relay --features bin.

FlagEnvDefaultMeaning
--jwt-secret-fileDCC_MCP_TUNNEL_RELAY_JWT_SECRET_FILErequiredPath to a file containing the HS256 JWT secret. ≥32 bytes in production (openssl rand -base64 48). The file is read so the bytes never appear in ps output.
--public-hostDCC_MCP_TUNNEL_RELAY_PUBLIC_HOSTlocalhostPublic hostname embedded in minted tunnel URLs (ends up in the JWT iss claim).
--base-urlDCC_MCP_TUNNEL_RELAY_BASE_URLws://localhost:9870WebSocket base URL; prepended to per-tunnel paths in RegisterAck.public_url.
--agent-bindDCC_MCP_TUNNEL_RELAY_AGENT_BIND0.0.0.0:9870TCP bind for the agent control plane.
--frontend-bindDCC_MCP_TUNNEL_RELAY_FRONTEND_BIND0.0.0.0:9871TCP bind for the remote-client frontend.
--ws-frontend-bindDCC_MCP_TUNNEL_RELAY_WS_FRONTEND_BINDOptional WebSocket frontend bind (/tunnel/<id> upgrade). Omit to disable.
--admin-bindDCC_MCP_TUNNEL_RELAY_ADMIN_BINDOptional read-only admin endpoint bind (GET /tunnels, GET /healthz). Omit to disable.
--stale-timeout-secsDCC_MCP_TUNNEL_RELAY_STALE_TIMEOUT_SECS30Seconds without heartbeat before a tunnel is evicted from the registry.
--max-tunnelsDCC_MCP_TUNNEL_RELAY_MAX_TUNNELS0Hard cap on simultaneously-registered tunnels. 0 disables the cap.

Shutdown: SIGINT / SIGTERM (or Ctrl+C on Windows) drains the accept loops and waits for live sessions to close.

bash
dcc-mcp-tunnel-relay \
    --jwt-secret-file /etc/dcc-mcp/tunnel-secret \
    --public-host relay.example.com \
    --base-url wss://relay.example.com \
    --agent-bind 0.0.0.0:9870 \
    --frontend-bind 0.0.0.0:9871 \
    --ws-frontend-bind 0.0.0.0:9880 \
    --admin-bind 127.0.0.1:9877

dcc-mcp-tunnel-agent

Local sidecar that registers with a relay and bridges per-session traffic to a local DCC MCP server. Keeps the connection alive across transient failures with a configurable reconnect policy.

Build with cargo build --bin dcc-mcp-tunnel-agent --features bin.

FlagEnvDefaultMeaning
--relay-urlDCC_MCP_TUNNEL_AGENT_RELAY_URLrequiredRelay WebSocket URL (wss://relay.example.com).
--token-fileDCC_MCP_TUNNEL_AGENT_TOKEN_FILErequiredPath to the bearer JWT file (minted by dcc_mcp_tunnel_protocol::auth::issue).
--dccDCC_MCP_TUNNEL_AGENT_DCCrequiredDCC tag this agent identifies with; must be in the JWT's allowed_dcc list.
--local-targetDCC_MCP_TUNNEL_AGENT_LOCAL_TARGETrequiredLocal MCP HTTP server address (host:port) to bridge to.
--heartbeat-secsDCC_MCP_TUNNEL_AGENT_HEARTBEAT_SECS10Heartbeat cadence. Stay comfortably under the relay's --stale-timeout-secs.
--reconnect-policyDCC_MCP_TUNNEL_AGENT_RECONNECT_POLICYexponentialconstant or exponential.
--reconnect-initial-secsDCC_MCP_TUNNEL_AGENT_RECONNECT_INITIAL_SECS2Exponential: first-retry delay.
--reconnect-max-secsDCC_MCP_TUNNEL_AGENT_RECONNECT_MAX_SECS60Exponential: hard cap on retry delay.
--reconnect-constant-secsDCC_MCP_TUNNEL_AGENT_RECONNECT_CONSTANT_SECS5Constant: flat delay.
--capabilitiesDCC_MCP_TUNNEL_AGENT_CAPABILITIES[]Comma-separated capability tags forwarded to remote clients via /tunnels.

A non-retryable Rejected error (bad JWT, DCC-type mismatch) exits the process with a non-zero code so supervisors don't restart-loop on a misconfiguration.

bash
dcc-mcp-tunnel-agent \
    --relay-url wss://relay.example.com \
    --token-file ~/.config/dcc-mcp/tunnel.jwt \
    --dcc maya \
    --local-target 127.0.0.1:8765 \
    --heartbeat-secs 10 \
    --reconnect-policy exponential \
    --reconnect-initial-secs 2 \
    --reconnect-max-secs 60

Deployment scenarios

Scenario 1 — Embedded in a DCC host

The Maya / Blender / Houdini plug-in loads dcc_mcp_core into the host's Python interpreter and calls create_skill_server() directly. No external binary involved. Most end-user deployments look like this.

See examples/host_adapter_template.py for the plug-in skeleton.

Scenario 2 — Standalone per-DCC server

One dcc-mcp-server process per workstation launched by the DCC supervisor or by a user autostart. Covers headless studios running things like mayapy batch or a Python-only renderer that still wants to expose capabilities via MCP + REST.

bash
dcc-mcp-server --app maya --scene /shots/ep101/sh0200/shot.ma

Scenario 3 — Gateway aggregating multiple DCC servers

Multiple dcc-mcp-server processes on the same workstation. The first one binds the gateway port 9765 and indexes the others. Clients connect to 127.0.0.1:9765/mcp (or /v1/*), use MCP search / describe for discovery, then execute through REST /v1/call or /v1/call_batch to reach any DCC through one endpoint.

Example manifests: examples/compose/gateway-ha/ and examples/k8s/gateway-ha/.

Scenario 4 — Remote relay + tunnel agent

The public relay runs on an operator-owned host; each artist workstation runs an agent that registers with it. SaaS AI clients (Claude.ai, Cursor desktop behind an enterprise firewall, etc.) connect to the relay's frontend and get forwarded to the workstation's local MCP server.

bash
# On the relay host (public internet):
dcc-mcp-tunnel-relay \
    --jwt-secret-file /etc/dcc-mcp/tunnel-secret \
    --public-host relay.example.com \
    --base-url wss://relay.example.com

# On the artist's workstation:
dcc-mcp-tunnel-agent \
    --relay-url wss://relay.example.com \
    --token-file ~/.config/dcc-mcp/tunnel.jwt \
    --dcc maya --local-target 127.0.0.1:8765

Mint JWTs with dcc_mcp_tunnel_protocol::auth::issue; scope them per artist / per DCC via the allowed_dcc claim.

Scenario 5 — CI / test harness

Integration tests spin up an in-process McpHttpServer and hit its /v1/* endpoints directly. No external binary; no gateway.

See crates/dcc-mcp-skill-rest/src/tests.rs and crates/dcc-mcp-http/tests/http/ for reference patterns.


Released under the MIT License.