████████╗██████╗ ██████╗ ██╗██╗ ██████╗ ████████╗
╚══██╔══╝██╔══██╗██╔══██╗██║██║ ██╔═══██╗╚══██╔══╝
██║ ██║ ██║██████╔╝██║██║ ██║ ██║ ██║
██║ ██║ ██║██╔═══╝ ██║██║ ██║ ██║ ██║
██║ ██████╔╝██║ ██║███████╗╚██████╔╝ ██║
╚═╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚═╝
TDPilot Runtime is an MCP server for TouchDesigner. It lets an AI agent inspect, build, wire, optimize, and stabilize live TD networks with real tool calls — and now remember what works.
#tdpilot #touchdesigner #mcp #livepatch #audioreactive #realtime
- Production manual:
docs/MANUAL.md - New surface guide:
docs/MCP_1_1_SURFACE.md - Release notes:
CHANGELOG.md
- A practical control layer between AI agents and TouchDesigner.
- A structured toolset for scene edits, diagnostics, event monitoring, and recovery.
- A workflow-oriented MCP built for iterative patch development, not one-shot guessing.
- A technique memory system that learns from your projects and builds a reusable library.
- 63-tool runtime surface with job resources, memory, optimizer, safety, POPx inspection, project lifecycle control, and custom parameter authoring.
td_pop_inspectadds first-class POP metadata and attribute sampling instead of forcing POP debugging through SOP-shaped geometry reads.td_project_lifecycleadds save/load/undo/redo and undo-block control without falling back to ad hoc Python snippets.td_custom_parametersadds direct custom page/parameter authoring for COMPs.td_exec_pythonnow returns structured result payloads when possible instead of forcing everything throughstr(...).
Use this loop for every non-trivial task:
-
Inspect first — Read current state before touching anything. Start with
td_get_info,td_get_nodes,td_get_node_detail,td_get_params. -
Check memory — Before building from scratch, use
td_memory_recallto check if a similar technique already exists in the library. -
Build in small steps — Create or modify one chunk at a time. Prefer: create -> wire -> set params -> verify.
-
Learn and save — When you discover a reusable network pattern, use
td_memory_learnto extract the recipe andtd_memory_saveto persist it. -
Validate at the end — Always run
td_get_errorson the affected root. Report warnings/errors and fix before marking done. -
Control token cost — Prefer metadata checks over continuous image payloads. Ask the user before enabling high-token frame streaming.
Use for global context, playback control, save/load, and undo operations.
td_get_info,td_list_families,td_timeline,td_timeline_set,td_project_lifecycle
Use for creating, moving, renaming, connecting, and pruning structure.
td_get_nodes,td_get_node_detail,td_search_nodestd_create_node,td_delete_node,td_copy_node,td_rename_nodetd_connect_nodes,td_disconnect,td_get_connections
Use for patch logic, expressions, config tables, scripts, and trigger pulses.
td_get_params,td_set_params,td_pulse_paramtd_get_content,td_set_content,td_custom_parameters
Use for proving behavior instead of assuming behavior.
td_screenshot,td_chop_data,td_geometry_data,td_pop_inspecttd_cooking_info,td_get_errorstd_exec_python,td_python_help,td_python_classes
Structured exec note: td_exec_python now returns JSON-safe result, result_type, and result_is_structured fields. Use it for lightweight structured probes before reaching for stdout parsing.
Use for reactive and continuous workflows.
td_subscribe,td_unsubscribe,td_get_eventstd_capture_and_analyzetd_monitor_visual,td_stop_monitor_visualtd_stream_top,td_stop_stream_top
Token guidance: start with include_image=false for monitors/streams. Use image payloads only when visual detail is explicitly required. Prefer td_screenshot for single checks.
Use for quality passes and temporal behavior analysis.
td_optimize_visual— now accepts directobjective_weights(e.g.{"stability": 0.8, "complexity": 0.2})td_describe_dynamics
Use for guardrails, emergency control, and rollback confidence.
td_set_param_bounds,td_clear_param_boundstd_detect_instability,td_emergency_stabilizetd_snapshot_scene,td_list_snapshots,td_diff_snapshots,td_restore_snapshottd_get_state_vector,td_get_timescale_state
Use for learning, saving, and replaying reusable network patterns.
td_memory_learn— Analyze a live network subtree and extract a portable recipe. Auto-detects complexity: small/medium networks get full recipes with all params and expressions; large networks get structure summaries + key params.td_memory_save— Persist a technique to the project or global library.td_memory_recall— Search the library by text query and/or tags. Returns summaries.td_memory_replay— Rebuild a saved technique in a new location. Creates nodes, sets parameters and expressions, wires connections.td_memory_list— List all saved techniques with optional filtering.td_memory_favorite— Mark techniques as favorites and rate them (0-5).td_memory_promote— Copy a project-level technique to the global library for use across all projects.td_memory_preferences— Get/set user preferences (color palettes, default resolutions, naming conventions, etc.)
Memory storage lives at ~/.tdpilot/memory/ with per-project and global scopes:
~/.tdpilot/memory/
global/
techniques.json
preferences.json
projects/
{project_name}/
techniques.json
preferences.json
- Connect MCP client to TDPilot.
- Ask for current project state.
- Request a scoped patch goal.
- Let agent apply changes in batches.
- Require end-of-task
td_get_errorscheck. - Save snapshot at stable milestone.
- When you find something worth keeping: learn it, save it, rate it.
- Building and refactoring operator networks quickly.
- Inspecting modern POP systems with attribute-aware reads.
- Converting high-level creative goals into concrete TD graph operations.
- Audio-reactive/control-system patch scaffolding.
- Automated cleanup, relayout, and consistency passes.
- Diagnosing wiring/parameter/runtime errors with direct evidence.
- Remembering what works and reusing it across projects.
- Replacing artistic direction by itself.
- High-level show design without iterative user feedback.
- Unlimited always-on image streaming without token impact.
- Ignoring TD-specific context (operator families, cook behavior, timing model).
- "One shot perfect patch" generation in complex scenes.
When generating or reorganizing networks: use color coding by role, keep clean spacing and avoid overlaps, group nodes into functional clusters, preserve clear flow direction, name nodes by purpose, and run td_get_errors after edits.
Recommended runtime (no manual Python setup in client config):
npx -y tdpilotLocal development runtime:
git clone https://github.com/dreamrec/TDPilot.git
cd TDPilot
uv sync
uv run tdpilotTouchDesigner side component: td_component/mcp_server.tox
One-command setup helpers: macOS ./install.sh, Windows ./install.ps1
TDPilot ships a standard bundle in-repo:
mcp/manifest.jsonmcp/profiles/claude-desktop.json,cursor.json,generic.json
Auto-generate client config:
tdpilot init --client claude-desktop
tdpilot init --client cursor --output ./cursor_mcp_config.json
tdpilot init --client generic --print-onlyRun a final environment/runtime check:
tdpilot doctor
tdpilot doctor --jsonTD_MCP_HOST(default127.0.0.1)TD_MCP_PORT(default9981)TD_MCP_WS_PORT(default9982)TD_MCP_TRANSPORT(stdioorstreamable_http)TD_MCP_HTTP_PORT(default8765)TD_MCP_CAPTURE_QUALITY(default0.3)TD_MCP_STREAM_MAX_FPS(default15.0)TD_MCP_EXEC_MODE(off,restricted,full)TDPILOT_PROJECT_NAME(set to enable per-project technique memory)TDPILOT_MEMORY_DIR(override default~/.tdpilot/memory/path)
Run the test suite:
uv run --extra dev pytest tests/ -vTreat this as mandatory for every meaningful task: before edits inspect, during edits take small reversible steps, after edits run td_get_errors, before risky changes snapshot.
MIT
┌─────────────────────────────────────────────────────────────────────┐
│ dreamrec // TDPilot // live laugh love │
└─────────────────────────────────────────────────────────────────────┘