tdmcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| TDMCP_BRIDGE_TOKEN | No | Optional token to authenticate bridge requests. | |
| TDMCP_BRIDGE_ALLOW_EXEC | No | Set to '0' to disable exec endpoints for security. |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
| completions | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_td_infoA | Read-only health check + TouchDesigner server info. Returns {connected, endpoint, touchdesigner version info, knowledge-base stats, bridge_stale?} and changes nothing. Use this first to confirm the bridge is reachable; it succeeds even when TD is offline, reporting connected:false with the reason. Also warns when the running Python bridge is older than this build (a common gotcha — editing td/ doesn't reload the running bridge), pointing you at reload_bridge. |
| create_td_nodeA | Create a single bare operator (node) inside a parent COMP — nothing is wired or laid out. Validates the operator type against the knowledge base and warns (without blocking) on unknown types. Returns {node, warnings[]} for the created node. This is the atomic primitive: for a complete wired+arranged network prefer the higher-level Layer-1 create_* tools (e.g. create_audio_reactive, create_feedback_network). |
| delete_td_nodeA | DESTRUCTIVE: permanently remove one node from the project by path (a COMP also takes its children with it); this cannot be undone via the API. Returns {deleted} with the path that was removed. Only call this when the user explicitly asks to delete a node. |
| update_td_node_parametersA | Modify an existing node by setting one or more of its parameters to constant values. The update is strict (not best-effort): an unknown parameter name fails the whole call atomically without changing anything, and a bad value (wrong type or out of range) returns an error naming which parameters applied and which failed. On success returns the updated {node}. To inspect valid parameter names/current values first use get_td_node_parameters; to make a parameter move over time use animate_parameter instead of a static value. |
| get_td_nodesA | Read-only: list the DIRECT child nodes of one COMP. Defaults to a compact summary (count + type breakdown + sample paths); pass detail_level:"full" or path_only:true for the complete list, and |
| get_td_node_parametersA | Read-only: read the current parameters (and inputs/outputs) of one node. Returns {path, type, name, parameters, inputs, outputs}. Pass |
| read_parameter_modesA | Read-only: for each parameter of a node, report its mode (CONSTANT / EXPRESSION / EXPORT / BIND), its evaluated value, and its raw expression / bind-expression / export-source strings. Use this to faithfully serialize a network for round-trip editing, diffing, or debugging — the evaluated value alone hides which parameters are driven by expressions or exports. Set |
| get_td_node_errorsA | Read-only: check one node (or, with recursive:true, its whole sub-network) for cook/compile errors and warnings. Pass |
| execute_python_scriptA | Escape hatch — run an arbitrary Python script inside the TouchDesigner process. Prefer the structured tools (find_td_nodes, get_td_node_parameters, update_td_node_parameters, summarize_td_errors, snapshot_td_graph, …); reach for this only when no structured tool can express the operation. Code runs in TD only, never on the local machine. |
| exec_node_methodA | Escape hatch — invoke an arbitrary Python method on a node (operator). Prefer structured tools where one exists; use this for operations they don't cover (e.g. .cook(), .copy(), .destroy()). |
| get_td_classesA | Read-only: list TouchDesigner Python API class names from the embedded knowledge base (works offline, never touches TD). Returns {classes[]} of name/displayName entries. Optionally filter by name. Use get_td_class_details or get_module_help to expand one class into its members and methods. |
| get_td_class_detailsA | Read-only: full STRUCTURED documentation for one TouchDesigner Python class (members + methods) from the embedded knowledge base (offline). Returns the class object, or {found:false, suggestions[]} of near-name matches if unknown. Use get_module_help instead when you want the same content as ready-to-read Markdown rather than structured JSON. |
| get_module_helpA | Read-only: human-readable Markdown help (description, members, method signatures) for a TouchDesigner Python class or module, from the embedded knowledge base (offline). Returns formatted text, or {found:false, suggestions[]} of near-name matches if unknown. Use get_td_class_details instead when you need the same information as structured JSON to process in code. |
| get_td_performanceA | Read-only: report cook times under a network (recursively by default, slowest node first) and warn about nodes that exceed the frame budget. Returns {targetFps, frameBudgetMs, totalCookMs, nodes[], warnings[]} and changes nothing. Use this to just measure; use optimize_performance when you want suggestions and the option to auto-shrink the slow TOPs. |
| get_td_topologyA | Read-only: return the nodes AND the connections (wiring) under a network root, flagging obvious structural issues. Returns {nodeCount, connectionCount, issues[], topology}. Use this when you need how nodes are wired together; use get_td_nodes/find_td_nodes when you only need the node list without connections, or snapshot_td_graph when you also want each node's parameters captured for diffing. |
| find_td_nodesA | Read-only: search a network for nodes by name pattern and/or operator type, recursively by default. Returns {count, truncated, matches/paths}. Prefer this over get_td_nodes when you are looking for specific nodes anywhere in a sub-tree (get_td_nodes only lists one COMP's direct children); use get_td_topology when you also need the wiring between them. |
| summarize_td_errorsA | Read-only: collect errors across a network and cluster them by message, type, or parent container, with the worst-offending nodes and a suggested order to investigate. Returns {total, groups[], suggestions[]}. Use this for network-wide triage instead of reading every node's errors one by one; use get_td_node_errors when you just want the raw error list for one node or sub-tree. |
| compare_td_nodesA | Read-only: diff the parameters of two nodes, returning only the values that differ (by default). Returns {type_match, differing_count, differing[], same_count}. Useful for aligning settings across similar operators; compares two live nodes, whereas diff_snapshots compares two whole-network snapshots over time. |
| snapshot_td_graphA | Read-only: capture a compact, serializable snapshot of a network — nodes, connections, structural issues, and optionally each node's parameters — for review, diffing, or documentation. Returns {nodeCount, connectionCount, issues[], nodes[], connections[]}. Set |
| reload_bridgeA | Hot-reload the bridge's Python inside the running TouchDesigner, so edits to the td/ modules take effect without reopening the project. Reimports every loaded mcp./utils. module in place and returns the list reloaded. Use after editing bridge code. |
| search_operatorsA | Search the embedded operator knowledge base (629 operators) by keyword — name, family or description — ranked by relevance, fully offline. Use it to discover the right operator before creating nodes instead of guessing a type (e.g. 'what sends DMX?', 'particle', 'corner pin'). Returns name, family and a one-line summary per hit. Pass semantic:true to re-rank by embedding similarity (needs an LLM endpoint; falls back to keyword). |
| manage_packagesA | Search, list, inspect, doctor, dry-run install, stage, and uninstall manifest-driven TouchDesigner community packages. Dry-run is the default. Installs stage packages under ~/.tdmcp/packages and only import into TouchDesigner when the bridge is reachable and the package has a safe .tox import path. This tool never runs third-party scripts, pip installs, model downloads, or external app setup. |
| document_networkA | Document an EXISTING network: read its nodes and connections and return a readable map — counts by operator family and type, plus a Mermaid flowchart of the data flow you can paste into docs. Unlike plan_visual (which plans from a description), this describes what's actually in the project. Use it to explain or hand off a patch. |
| diff_snapshotsA | Compare two network snapshots (from snapshot_td_graph) and return a readable diff: which nodes were added or removed, which connections changed, and which parameters changed (with before/after values). Snapshot before an edit and after to see exactly what changed, or to version a patch over time. Pure analysis — touches nothing in TouchDesigner. |
| optimize_performanceA | Scan a network for cook-time bottlenecks and (optionally) fix them. By default it reports the slowest nodes with a concrete suggestion each. With apply:true it lowers the resolution of the flagged TOPs by |
| render_outputA | Save a TOP to an image file at its native, full resolution (PNG/JPG/EXR/TIFF by extension) — for exporting a finished frame, unlike get_preview which only transfers a small inline thumbnail. The file is written by TouchDesigner on the TD machine; pass an absolute path. |
| record_movieA | Record a TOP to a movie file (.mov/.mp4) via a Movie File Out TOP — for exporting a clip or a loop, where render_output only saves a single frame. start begins recording (pass file, fps); pass |
| analyze_projectA | Diagnose a network for cleanup: report likely-dead operators (zero wired outputs, unreferenced, not displayed), broken external-file dependencies (file parameters pointing at missing files), orphan COMPs, and a dependency map of which operators reference which. Read-only and conservative — every flagged item carries a human-readable reason. Complements plan_visual (which plans a build) and snapshot_td_graph (which dumps structure). |
| generate_readmeA | Produce a Markdown project document for any COMP or project: family/type counts, custom-parameter table, inputs/outputs, child inventory, external file dependencies, and an optional preview thumbnail of the output TOP. Use |
| edit_dat_contentA | Surgically replace a substring inside a Text or Table DAT's |
| set_dat_contentA | Overwrite a Text or Table DAT's entire |
| set_parameter_expressionA | Set one or more parameters on a node to an expression, bind expression, or constant value without needing the raw-Python escape hatch. Supports three modes: 'expression' (par.expr = ...), 'bind' (par.bindExpr = ...), and 'constant' (par.val = ...). Multiple assignments are applied fail-forward — per-item failures accumulate as warnings so a partial batch still returns useful results. Use this instead of execute_python_script when TDMCP_RAW_PYTHON is off. |
| write_agent_guideA | Emit a project-local CLAUDE.md / AGENTS.md seeded with tdmcp operator conventions and TouchDesigner render-coordinate rules, so a future agent working on this project starts with the right mental model. A small dynamic header (project name, node count, top families) is prepended to a curated static body. Pass |
| disconnect_nodesA | Remove one or more input wires from a node in TouchDesigner. By default removes every incoming wire into to_path; narrow the scope with from_path (only wires from that upstream node) and/or to_input (only that input slot index). Returns the list of removed wires (input index + upstream node path), a probe of the Connector API attributes seen at runtime, and any per-wire warnings. Fatal only when to_path is not found — partial removals with per-wire warnings still succeed. The inverse of connect_nodes. |
| get_td_node_flagsA | Read-only: report each node's operator flags (bypass / render / display / lock / allowCooking / clone) plus index-aware input wiring, network position, color and comment — the signals that explain a black/blank output that a parameter dump hides. Scan one node or a subtree (recursive); set only_problems to surface just the ops whose flags or cook errors would suppress output. Returns structuredContent for code to process. |
| get_node_state_runtimeA | Read-only: inspect a single operator's runtime telemetry — cook time, cook count, last-cook frame, resolution (TOPs), channel/sample counts (CHOPs), GPU memory usage, cook errors, and optional Info CHOP channels via include_info_chop. Complements get_td_performance (which aggregates cook times across a network) by providing deep per-op detail for the 'why is it black / why is it slow' diagnostic loop. Returns {path, type, family, cook_time_ms, cook_count, last_cook_frame, resolution, num_chans, num_samples, gpu_memory, info_chop?, errors[], warnings[], extra}. Attribute names are flagged UNVERIFIED and vary by TD build; the |
| watch_nodeA | Read-only: sample one TouchDesigner operator over a short interval and return runtime state, readable parameter values, and CHOP channel values when available. Missing TD attributes/channels are reported as warnings instead of failing the watch. Returns {path, requested_samples, collected_samples, interval_ms, window_ms, warnings[], snapshots[]} where each snapshot has {sample_index, elapsed_ms, path, type, family, state, parameters, channels, warnings}. |
| get_bridge_logsA | Read-only: collect recent cook errors and warnings from the running TouchDesigner project for debugging. Walks the operator tree under |
| inspect_op_extensions_storageA | Read-only: inspect what a COMP exposes — its Python storage dict (keys + values), its extension class descriptors (name, promoted flag, public members), and its custom-parameter definitions (page/name/style/default). Closes the inspect side of the reusable-component loop: use after |
| serialize_networkA | Read-only: serialize a COMP's immediate children into a git-diffable JSON spec — each node's name, op type, parameters (with mode + expression, not just the evaluated value), input wires by source node name, and position — plus best-effort custom-parameter definitions. This is the serialize half of a round-trip pair: feed the output spec to rebuild_network to reconstruct the subtree. Use it to snapshot a network as text you can diff across edits or commit to version control. Returns {root, nodes[], truncated?, warnings[]}. |
| collect_project_assetsA | Scan a COMP subtree for every external file dependency (movie/image file pars, fonts, LUTs, externaltox links) and report each referenced file, the node+parameter that references it, and whether the file currently exists on disk. The TouchDesigner scan is read-only and copies/rewrites nothing in the network; when out_manifest is set, this tool writes that local JSON path and may overwrite an existing manifest. File-par detection uses par.style ('File'/'Folder') when readable, falling back to a suffix/exact name heuristic (file, fontfile, lut, externaltox, moviefile, imagefile) — both UNVERIFIED across TD builds; |
| project_documentation_siteA | Compose a one-folder handoff/portfolio documentation PACKAGE for a network: a README.md (title, node count, per-family summary, how-to-load note), a topology.md with a Mermaid graph of the connections, and - when include_thumbnails is set - preview PNGs of output TOPs under thumbs/ linked from gallery.md, all written into out_dir. Unlike generate_readme (a single file), this assembles a small multi-file site folder for sharing or archiving a project. |
| caption_topA | Read-only: render a TOP's preview and return a plain-text description of it — the headless 'is the output alive?' primitive. Two paths: (a) a configured vision LLM endpoint when available, (b) a DETERMINISTIC luma/colour-histogram fallback decoded from the preview PNG pixels (always works, no model needed). Reports dominant colours, mean luma, near-black fraction, a coarse classification ('black'/'very dark'/'dark'/'bright'/'colorful'/'mid'), and a friendly caption. Returns {node_path, width, height, source:'vision'|'histogram', caption, stats{...}, warnings}. Use it after a build to confirm the network is actually rendering instead of a black frame. The vision path is currently inert (no vision field on the tool context) and falls back to the histogram. |
| repair_networkA | Bounded, autonomous repair: scan cook errors under a subtree, classify each, and plan a safe fix, capped at max_steps so it can never run away. Defaults to dry_run (PLAN only, no changes). Set dry_run:false to apply the known-safe fixes — resetting a broken parameter expression to constant mode, and re-enabling a bypassed/display-off op — within the same bound; risky cases (DAT syntax errors, missing inputs, unclassified errors) are always PLAN-only. Re-checks errors after applying and stops at the bound or when errors clear. Returns {parent_path, dry_run, max_steps, errors_before, errors_after, steps[], remaining[], warnings, rolled_back}. Use it as the diagnostic 'try the obvious safe fixes' loop after a build; for raw triage use summarize_td_errors / get_td_node_errors instead. |
| lint_recipe_libraryA | Offline semantic linter for recipes/*.json. Checks schema, id/filename match, duplicate node names, unknown operator types, dangling connections, bad parents, render-outside-geometryCOMP, missing parameter nodes, unresolved control bind_to, GLSL uniforms on non-GLSL hosts, and hygiene (tags/description/preview_description). Returns a structured report; never calls TouchDesigner. |
| score_buildA | Read-only: score a built network 0–100 on a fixed rubric (palette/motion/complexity/errors/perf) and return per-criterion sub-scores plus deterministic improvement suggestions. Optional LLM critique when llmCritique=true and ctx.llm is configured. Composes existing bridge endpoints — creates nothing. |
| profile_cook_costA | Read-only: sample cook times over a window (N samples × intervalMs) and rank hotspot nodes by p95 cook time. Use this to diagnose intermittent stalls that a single get_td_performance snapshot misses. Returns {path, samples, intervalMs, targetFps, frameBudgetMs, windowMs, hotspots[], warnings[]}. |
| control_timeline_transportA | Drive the TouchDesigner project timeline: play, pause, seek to a frame, jump to a named cue, or set playback rate. Returns the timeline state after the action so a copilot can verify the change took effect. NOTE: pausing will freeze any downstream motion/feedback/frame-diff chain — expected behaviour, not a bug. |
| inspect_gpu_and_displaysA | Read-only: returns the host GPU info (name, driver, VRAM), attached monitor topology (resolution, refresh rate, primary flag, position), and whether the project is in Perform Mode. Use to plan output mapping, dome rigs, and multi-display shows without leaving the chat. Offline-safe — returns { connected: false, reason } when TD is unreachable. |
| manage_component_storageA | CRUD operations on a COMP operator's .storage dictionary. Actions: list (all keys+values), get (one key), set (write a key), delete (remove a key). No operators are created; the target COMP must already exist. |
| elicit_missing_argsA | Use the schema + LLM to propose values for a tool call's missing required args. |
| extract_paletteA | Sample dominant colors from a TOP by capturing its preview PNG and running deterministic k-means on the decoded RGB pixels. Returns |
| export_sop_to_svgA | Walk a SOP's primitives via the bridge and emit an SVG document of polylines (each primitive becomes one |
| swap_operatorA | Change an operator's TYPE while preserving its name, position, incoming + outgoing wires, and any parameters that exist on the new type. Snapshots wires + params, deletes the old node, creates a new node of |
| copilot_visionA | Capture a TOP as a preview image and ask the configured multimodal LLM a question about it. Returns |
| get_inline_previewA | Read-only one-shot inspection of a TOP: small base64 thumbnail (default 256² JPEG) + parent error sweep (BFS up |
| compact_graph_digestA | Read-only: compress a TD subtree into a structured digest under max_tokens (default 500). Returns {header, nodeCount, connectionCount, primaryOutput, families{count,topTypes}, outputChain, errors{total,topGroups}, warnings, approxTokens}. Uses getNetworkTopology + getNetworkErrors — no new bridge work. Cheaper than get_td_topology / snapshot_td_graph for planning turns. |
| create_node_chainA | Create multiple nodes and (optionally) connect them in sequence. Returns all created paths; on failure it stops and reports partial progress without deleting anything. |
| connect_nodesA | Wire one node's output connector into another node's input connector inside TouchDesigner, creating a single link between two existing nodes. Uses the bridge's batch endpoint when available and falls back to a Python connect otherwise. Use create_node_chain instead when you are creating several new nodes and want them auto-wired in sequence. Returns the source and target paths, the connector indices used, and which method made the connection. |
| create_glsl_shaderA | Create a GLSL TOP under parent_path that renders a custom fragment shader (and optional vertex shader). The shader source is placed in companion Text DATs ( |
| create_python_scriptA | Create one DAT under parent_path preloaded with your Python |
| set_parameters_batchA | Update parameters on multiple nodes in a single batch request. Each update reports its own success; a failure does not roll back the others. |
| create_containerA | Create one empty COMP under parent_path to hold a visual system, then tile it into the parent's network grid clear of existing siblings. |
| create_control_panelA | Expose live controls on a COMP: append custom parameters (sliders, toggles, menus, RGB, pulse) and bind them to node parameters so the artist can drive a generated system in real time. Point |
| create_control_surfaceA | Build a playable performance panel (a Container COMP of visual widgets) for live use, beyond the parameter dialog: vertical faders that drive parameters, and buttons that recall or morph to named cues (from manage_cue). Open the container in Perform/Panel mode for a touchable surface — faders move their parameters, cue buttons fire scenes (instantly or with a crossfade). |
| animate_parameterA | Drive one or more node parameters over time with an LFO (sine/triangle/ramp/square/pulse/random). Creates an LFO CHOP and binds each target so it oscillates between min and max with the given period — movement without manual keyframing. |
| bind_to_channelA | Drive one or more node parameters from a CHOP channel by expression — the link that makes a visual react. Point it at an audio_features channel (bass/mid/treble/level) or a tempo_sync channel (ramp/pulse/beat) with a scale and offset, and each target parameter tracks that signal live. This is how you wire extract_audio_features / create_tempo_sync into a visual system. Optionally add attack/release smoothing (in seconds) — or a single |
| manage_presetsA | Store, recall, list, or delete named snapshots of a COMP's parameter values — the live-performance preset system. Pair with create_control_panel: snapshot the knob positions and jump between looks. Snapshots are saved in the COMP's storage so they persist with the project. |
| manage_checkpointA | Store / restore / list / delete a full snapshot of a sub-network — an 'undo point' to take before risky live edits. A checkpoint captures every node's constant parameters, the wiring, and node positions. Restoring reapplies parameters, recreates nodes that were deleted since (with their wiring), and prunes nodes that were created since. Unlike manage_presets (custom-parameter looks for performance), this captures the whole network for safe experimentation. |
| manage_cueA | Live-performance scene system: store / recall / morph / list / delete named cues (snapshots of a COMP's custom-parameter values). Unlike manage_presets, a cue can be reached with a timed |
| manage_componentA | Build a reusable component library by moving COMPs to/from .tox files on disk. Two actions: 'save' writes the COMP at comp_path to file_path as a .tox (overwriting any existing file, optionally creating parent folders) and returns the saved path and byte size; 'load' reads file_path back into parent_path, either as an independent copy or a live-linked instance (via |
| add_custom_parametersA | Append a custom-parameter page (knobs, sliders, toggles, menus, pulses, RGB, XYZ) to a COMP so a generated network becomes a tunable, reusable component. Point |
| scaffold_extensionA | Give a COMP a Python extension class: create a Text DAT holding the class (with optional method stubs), wire it into an extension slot, optionally promote it (so members are callable directly on the COMP), and reinitialize. The other half of making a generated network reusable — pair with |
| create_macroA | Add one macro knob (a 0–1 custom parameter) to a COMP that drives many parameters at once, each remapped into its own [min,max] range with an optional response curve — a one-to-many control for sweeping a whole look from a single fader. Targets are bound by expression so they track the macro live. |
| randomize_controlsA | Randomize a COMP's numeric custom parameters within their slider ranges — an instant new variation for live improvisation. |
| create_phone_remoteA | Serve a mobile-friendly web panel from a Web Server DAT so you can control a COMP's numeric custom parameters from a phone — just open the URL, no app to install. Each parameter becomes a touch slider that writes back live. SECURITY: like the bridge, this listens on all interfaces and accepts writes with no auth, so use it only on a trusted network. Pair with create_control_panel (the params to expose) and manage_cue (snapshot looks you dial in from the phone). |
| create_external_ioA | Bridge TouchDesigner to the outside world: OSC/MIDI input (a control surface — bind incoming channels straight to parameters), OSC/MIDI output (send a CHOP's channels back out for bidirectional feedback to lighting desks, other apps or hardware — pass source_path), DMX/Art-Net output for lighting (dmx_out for any DMX desk; artnet_out for network Art-Net/sACN pixel-mapping of LED strips & stage fixtures), RTMP output to live-stream a TOP to Twitch/YouTube/OBS (rtmp_out — NVIDIA GPU on Windows only), or NDI / Syphon-Spout video input. To discover which channel a control sends (a 'MIDI learn'), wiggle it and read the input CHOP with get_td_nodes, then bind_to that channel. Validate live where possible, but real signal needs the hardware/sender present. |
| duplicate_networkA | Copy a node or whole COMP (and all its contents) to a new node, placed in the source's parent or another parent_path. Returns the source path and the new copy's path. Use duplicate this way to clone a built network; use create_container instead when you just need a fresh empty COMP. |
| arrange_networkA | Tidy an existing network: reposition a COMP's children into a readable left→right data-flow layout (sources on the left, output on the right). Use this to clean up nodes that are piled on top of each other. Set recursive to also arrange the contents of nested COMPs. Only moves node positions — it never adds, deletes, or rewires nodes. Returns the COMP path and how many nodes were repositioned. |
| create_panicA | Build a live-performance safety control — the 'oh no' button every VJ needs. Wraps a source in a small COMP with two instant kill switches: Blackout forces the output to black (a Level TOP's brightness1 driven to 0) and Freeze holds the last frame (a Cache TOP stops capturing, active → 0). With an input_path the source is pulled in by a Select TOP (so it can live in another container); without one a built-in Ramp TOP test source is used so it builds and previews standalone. Output is a Null TOP. Big Blackout / Freeze toggle buttons are exposed on the container so a performer can hit them instantly. Marked destructive because firing Blackout/Freeze disables the live output. Returns the container, the source/freeze/blackout/output node paths, and the initial toggle states. |
| create_clip_launcherA | Build an Ableton-style clip launcher: a grid panel (Container COMP) of clip buttons, one per named cue (from manage_cue), for fast hands-on scene switching during a live set. Open the container in Perform/Panel mode and tap a clip to fire its cue — instantly, or (with morph_time) crossfading to it over N seconds (eased, the same engine manage_cue uses). Store the cues with manage_cue / create_control_panel first. |
| create_decksA | Build a DJ-style VJ mixer. Without decks[], it preserves the legacy A/B Cross TOP mixer with GainA/GainB controls. With decks[], it builds a 2-8 deck mixer: every deck pulls a source TOP (or a test source) through gain and FX-send Level TOPs, decks 3+ blend into a running Cross TOP chain, a Switch TOP provides hard transition cuts, a final Cross TOP blends program vs cut, and an additive FX-send bus returns per-deck sends into the master. Output is a Null ready for post-processing or setup_output. |
| learn_controlA | EXPERIMENTAL two-step 'MIDI learn'. Call once with mode:'snapshot' (controls at rest) to record every channel of an input CHOP (a midiin/oscin CHOP or a Null fed by one); then wiggle one hardware knob/fader and call again with mode:'bind' — it diffs against the snapshot, finds the channel that moved the most, and binds your target parameter to it by expression (with optional scale/offset). The snapshot is kept in the parent COMP's storage between the two calls. This is live/stateful: verify the matched channel in the report. |
| create_cue_sequencerA | Build a bar-quantized cue timeline: a Beat CHOP (on the global tempo) + a CHOP Execute DAT that, on each bar (or beat) boundary, advances through an ordered list of steps and recalls — or morphs over morph_seconds — that step's cue on a target COMP. The deterministic, musically-timed counterpart to create_autopilot (which is random/cyclic). Reuses manage_cue's stored cues and the same cue_morph engine, so store the target's cues with manage_cue first. Live Active / Step / BarsPerStep controls let you pause, jump, or retune on stage. |
| create_stage_dashboardA | Serve one unified live-performance cockpit from a Web Server DAT — a single responsive web page (phone + laptop) that combines a grid of cue-launch buttons (recall named cues from manage_cue on the target COMP), master faders bound to chosen parameters, a big PANIC button (toggles the target COMP's Blackout/Freeze safety pars, the create_panic mechanism), and a live readout strip (a beat indicator plus a VU bar reading an audio-features Null CHOP). Open the URL — no app to install — and the page POSTs every control change back to the server, which applies it. SECURITY: like the bridge and create_phone_remote, this listens on all interfaces and accepts writes with NO auth, so use it only on a trusted network. Store cues with manage_cue, expose params with create_control_panel, and run create_panic first so the Blackout/Freeze toggles exist. |
| create_paletteA | Generate a reusable colour palette + gradient other tools can bind to. In 'harmony' mode it computes N swatches from a base hue and a colour-theory rule (complementary / analogous / triad / tetrad / monochrome); in 'from_source' mode it samples dominant colours from a source TOP. It builds a Ramp TOP gradient (key colours from a docked Table DAT) plus a Constant CHOP exposing each swatch as swatch{i}r/g/b channels — feed those into create_color_grade, generate_from_moodboard or bind_to_channel. Live BaseHue / Saturation / Value / Rule / Count controls are exposed on the parent. Builds standalone (a harmony palette needs no source). |
| create_data_sourceA | Ingest live external data onto a binding-ready channel/table — the input counterpart to create_data_visualization and bind_to_channel. 'json'/'csv' poll a URL with a Web Client DAT (and cook from a static sample of |
| create_led_mapperA | Pixel-map a source TOP onto an LED fixture layout and send per-pixel colors out as DMX over Art-Net/sACN. Resizes the source to a tiny WxH grid (one texel = one fixture pixel), samples it into per-pixel r/g/b channels with a TOP-to-CHOP, and feeds those into a DMX Out CHOP — the pixel-mapping editor that artnet_out lacked. Defaults to a built-in moving test source so the chain cooks with no input. Exposes Brightness and Universe controls. Sending real Art-Net needs a fixture/node on the network; this validates the per-pixel color CHOP is correct. |
| batch_operationsA | Run an ordered list of create / connect / setParam operations in one call (fail-forward, per-operation warnings; not transactional). Exposes the network builder as a general primitive — distinct from set_parameters_batch, which only sets parameters. Names created earlier can be referenced by later connect/setParam operations. |
| manage_annotationA | Self-document a network: create a titled annotation box, set an op's comment, list the annotations/comments in a network, or list the ops a box geometrically encloses. Makes generated networks legible. |
| set_perform_modeA | Toggle perform mode — the one switch the artist flips before going live. When enabled, tdmcp stores an advisory flag that tools can read before doing nonessential compute; the built-in guard currently suppresses auto preview captures. The flag is stored on the TD root op (op('/').store('tdmcp_perform_mode', ...)). Advisory: this does not stop the TD timeline or kill audio/video processing. Call with enabled=false after the show to resume normal operation. |
| bind_audio_reactiveA | Make a whole COMP react to the music in one call — the core VJ move. Point |
| create_replicatorA | Wire a Replicator COMP that clones a template COMP once per row of a Table DAT — TouchDesigner's idiomatic 'N copies from data' mechanism (menus, scoreboards, per-track decks, instanced panels). Resolves or creates the template COMP (omit template_path → a minimal container with a Text) and the driving Table DAT (omit table_path → a small example table; |
| create_data_reactiveA | Wire arbitrary external data (weather, follower count, sensor readings, OSC values) onto a COMP's custom numeric parameters — the data counterpart to bind_audio_reactive. Point |
| create_beat_grid_sequencerA | Build a programmable step-grid sequencer driven by a Beat CHOP on the global TD tempo: a Table DAT holds the per-step pattern (values or 1/0 flags), and a CHOP Execute DAT fires on every beat boundary, reads the current step (count % steps) from the table, and dispatches — action=param sets a custom parameter to the step value; action=cue recalls the cue for active steps (cues stored with manage_cue). The deterministic, repeating-rhythm instrument between create_autopilot (random drift) and create_cue_sequencer (linear list): program a strobe on beats 1+3, a hue shift on the bar, etc. Reprogramme the grid live by editing the step_table DAT. NOTE: beat-callback timing is UNVERIFIED offline — check op().time.play if steps don't fire when the TD timeline is paused. |
| rebuild_networkA | Reconstruct a live network inside a COMP from a serialize_network spec — the REBUILD half of a git-diffable round-trip. Takes a JSON spec of nodes (name, operator type, parameters as constants/expressions/binds, inbound wires by name, optional x/y) and, in one pass, creates every node, applies its parameters and expressions, then wires inputs by resolving each |
| create_envelope_followerA | EXPERIMENTAL — Build a reactive signal-shaping chain (attack/release envelope + threshold gate or sidechain ducking) from a CHOP channel, for 'pump the whole layer on every kick' or similar sidechain effects. Creates a container with: a Select CHOP isolating the source channel by absolute path (no cross-container wire), a Lag CHOP shaping the attack/release envelope, a Logic+Math CHOP threshold gate (gate mode: silence the output below threshold) or an inverted Math CHOP (duck mode: output dips to 0 on a hit, rises on silence — classic sidechain pumping), and a Null CHOP as the stable output handle. Optionally binds the shaped output to target parameters by expression. The gate threshold uses a Logic CHOP whose par names (convert/boundmin/boundmax) match detect_onsets — but these are UNVERIFIED across TD builds; gate reads near 0 at the 0.2 default with most sources — tune threshold live. Use bind_to_channel with attack/release for a simpler Lag-only envelope without a gate. |
| create_midi_mapA | HARDWARE-GATED SCAFFOLD. Build a MIDI controller preset for a supported device (apc_mini / launchpad / midi_mix / nanokontrol / generic): creates a midiinCHOP + a labeled bind Table DAT, and optionally auto-binds faders/knobs to a target COMP's numeric custom parameters. Explicit bindings can override or supplement the preset. CC/note numbers are best-effort from published MIDI charts and MUST be validated with real hardware — actual assignments depend on device firmware. This tool is HELD FROM RELEASE until hardware validation is complete. For one-at-a-time MIDI learn of a single control, use learn_control instead. |
| create_modulatorsA | Build a bank of N BPM-synced LFOs in one self-contained container — each an oscillator (sine/triangle/saw/square or a random sample-&-hold) with its own rate-in-beats, output range and phase offset. Every rate locks to a tempo source (a create_tempo_sync Null, or TouchDesigner's global tempo) by expression, so the whole bank speeds up/slows down with the music and stays phase-continuous across tempo changes. All outputs land on one Null CHOP (mod_out) with one named channel per modulator, ready for bind_to_channel — the 'everything breathes' lever. Note: modulators are timeline-driven, so they only move while the timeline is playing. Re-running with an existing container name rebuilds it in place (clearing that container's children), so this tool is marked destructive and hidden from the safe profile. |
| create_look_bankA | A playable snapshot row: store N named 'looks' (snapshots of a control COMP's numeric/toggle/menu parameters) in a visible, editable Table DAT, with one momentary recall button per slot (snap or crossfade) plus a master A↔B morph knob that blends continuously between two chosen looks. Reuses manage_cue's morph engine (so a recall behaves exactly like a cue morph, with optional beat/bar quantize) and mirrors slots into the COMP's cues so they interoperate with manage_cue / create_control_surface. Pulses and strings are always skipped at capture. Build cues/params with create_control_panel first. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| visual_artist_mode | Think in terms of visual composition, color, motion and aesthetics rather than code while building in TouchDesigner. |
| debug_network | Systematically debug a TD network: check errors, verify connections, inspect cook times, and suggest fixes. |
| optimize_performance | Analyze a TD network for performance: identify bottlenecks, suggest resolution changes, and recommend cooking optimizations. |
| explain_network | Generate a human-readable explanation of what a TD network does: data flow, key parameters, and artistic intent. |
| remix_visual | Take an existing visual system and create variations — change colors, swap techniques, add effects, alter timing. |
| beat_reactive_designer | Make a visual react to music — wire audio features and the beat into a visual system's parameters. |
| image_to_visual | Recreate the look of a reference image (one the user shared) as a real TouchDesigner network. |
| tweak_visual | Adjust an existing visual in plain language ('darker', 'faster', 'more chaotic') by changing the right parameters. |
| critique_visual | Evaluate a visual system and suggest concrete aesthetic and performance improvements. |
| analyze_screenshot | Look at a node's actual output and diagnose what it shows — or why it looks wrong (e.g. 'why is it black?', 'why is it frozen?') — by combining the live preview image with the network topology and node errors. |
| vj_set_builder | Assemble a complete reactive audiovisual set — scenes, audio/beat reactivity, cues and a control surface. |
| fix_shader | Diagnose and fix a GLSL TOP that won't compile: read the compiler error, check the Text DAT against TD's GLSL conventions, edit it, and re-verify with errors + preview. |
| text_to_shader | Author a GLSL TOP fragment shader from a plain-language description, then create and validate it in TD. |
| audio_to_show | Turn a track, genre or mood into a full reactive VJ show — visuals, audio/beat reactivity and section cues. |
| auto_fix | Detect, diagnose and repair errors across a network in a re-checking loop until it cooks clean. |
| text_to_recipe | Author a schema-valid recipe JSON (matching RecipeSchema) from a plain-language description, ready to save under recipes/ and instantiate with apply_recipe. |
| style_reference | Recreate a reference look or aesthetic — from a style description alone or an image the user shared — as a real TouchDesigner network. |
| fix_reactivity | Diagnose 'my visual stopped reacting to the music/camera' — the wired-but-dead signal class (paused timeline, silent source, RMS-0, a scale/offset that flattens the signal) that auto_fix and fix_shader don't cover. |
| recover_show | Mid-show emergency: the output is frozen, black, or erroring and there is an audience. A fast 'get a picture back NOW' triage loop — optimized for speed over completeness, unlike the thorough auto_fix. |
| auto_vj_director | Run a hands-free AI VJ: watch the live beat/onset event stream and fire cue recalls, transitions, and control randomization on the song's structure — an AI conductor over the create_autopilot engine, reasoning about builds/drops instead of randomizing mechanically. |
| color_story | Design a cohesive palette + color-grade ARC across a set or its sections (warm intro → cold drop → strobe-white peak) and wire it with create_palette + create_color_grade — instead of picking colors per-scene ad hoc. |
| setlist_planner | Turn a DJ tracklist / BPM + energy curve into a scene-per-track plan: which generator, palette, reactivity intensity and cue-morph time per track — then optionally drive import_setlist / manage_cue. Plans a whole night, not one track's sections. |
| explain_param | Plain-language 'what does this knob do, and what happens if I change it?' for any operator parameter — grounded in the 629-operator knowledge base plus the parameter's live value/range, not guessed. |
| visual_ab_compare | Capture two looks/cues (or before/after a tweak) with get_preview and judge which better matches a stated goal (palette, energy, focal point) — the comparative VJ decision critique_visual doesn't do. |
| lyric_show | Turn a block of lyrics/credits + a vibe into a timed kinetic-text layer — choosing create_kinetic_text mode (flash/pulse/slide), font/color from the palette, and beat-syncing the flashes. |
| genre_visual_language | Pick IDIOMATIC looks for a music genre instead of generic ones — encodes genre→visual conventions (techno = monochrome strobing geometry; ambient = slow organic feedback; DnB = RGB glitch; footwork = fast cut-up) and maps them onto concrete tdmcp tools. |
| teach_touchdesigner | Teach a TouchDesigner concept grounded in the embedded knowledge base, not generic web knowledge. |
| design_brief | Establish a persistent aesthetic direction the assistant honors across every build and tweak for the rest of the session, until the artist changes it. |
| motion_critique | Judge a look's MOTION over time, not a single frame — capture a short burst of previews (or read CHOP activity) and assess whether it's static, jittery, or musical. critique_visual looks at one still; the live thesis is movement. |
| match_reference_loop | Converge a build toward a reference image as an explicit scored loop (build → preview → self-score on named axes → adjust → re-preview) — the disciplined version of image_to_visual / style_reference's loose one-pass 'compare and adjust'. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| td-cheatsheets | Compact KB-grounded reminders for common tdmcp workflows, with links to richer resources. |
| td-glsl-snippets | A vetted, license-clean catalog of embedded GLSL snippets that agents can assemble into GLSL TOP networks without guessing resource ids. |
| td-cookbook | The English prompt cookbook as Markdown, exposed as a resource for agents that want worked examples before building. |
| td-agent-commands | The command-line verbs exposed by tdmcp-agent, generated from the actual CLI dispatcher so agent clients can discover safe, mutating and unsafe commands without drift. |
| td-prompts | The MCP prompts tdmcp offers, generated from the actual prompt registry so clients and local copilot flows do not drift from the registered names. |
| td-learning-touchdesigner | A curated learning path that pairs the teach_touchdesigner prompt with embedded operator and tutorial resources. |
| td-session-profile | The artist's persistent cross-session profile at ~/.tdmcp/session-profile.json. Caches the latest outputs of style_memory, recall_similar_work, learn_conventions, and learn_from_my_corpus so an agent can load all preferences in one resource read. Use the load_session_profile tool to initialise or refresh the file. Override the path with TDMCP_SESSION_PROFILE_PATH. |
| Operators: CHOP | All CHOP operators |
| Operators: COMP | All COMP operators |
| Operators: DAT | All DAT operators |
| Operators: MAT | All MAT operators |
| Operators: POP | All POP operators |
| Operators: SOP | All SOP operators |
| Operators: TOP | All TOP operators |
| Python: App | 4 methods, 2 members |
| Python: Attribute | 2 methods, 2 members |
| Python: Attributes | 1 methods, 2 members |
| Python: Bounds | 0 methods, 0 members |
| Python: CHOP | 51 methods, 2 members |
| Python: COMP | 70 methods, 2 members |
| Python: Cell | 2 methods, 2 members |
| Python: Channel | 9 methods, 2 members |
| Python: Connector | 2 methods, 2 members |
| Python: DAT | 84 methods, 2 members |
| Python: Dependency | 0 methods, 0 members |
| Python: Error DAT | 0 methods, 0 members |
| Python: Group | 3 methods, 2 members |
| Python: License | 0 methods, 2 members |
| Python: MAT | 46 methods, 2 members |
| Python: MOD | 5 methods, 4 members |
| Python: Matrix | 25 methods, 0 members |
| Python: Monitor | 0 methods, 2 members |
| Python: Network | 0 methods, 0 members |
| Python: NetworkEditor | 13 methods, 2 members |
| Python: Node | 0 methods, 0 members |
| Python: OP | 46 methods, 2 members |
| Python: OP Viewer COMP | 0 methods, 0 members |
| Python: ObjectCOMP | 77 methods, 2 members |
| Python: Page | 35 methods, 2 members |
| Python: Pane | 2 methods, 3 members |
| Python: Panel | 0 methods, 2 members |
| Python: PanelCOMP | 78 methods, 2 members |
| Python: PanelValue | 0 methods, 2 members |
| Python: Par | 11 methods, 2 members |
| Python: ParGroup | 10 methods, 2 members |
| Python: Parameter | 0 methods, 0 members |
| Python: Parent | 0 methods, 0 members |
| Python: Pattern CHOP | 0 methods, 0 members |
| Python: Peer | 4 methods, 2 members |
| Python: Point | 1 methods, 2 members |
| Python: Position | 5 methods, 2 members |
| Python: Prim | 3 methods, 2 members |
| Python: Project | 9 methods, 2 members |
| Python: PythonOp | 6 methods, 5 members |
| Python: Quaternion | 0 methods, 2 members |
| Python: Replicator COMP | 0 methods, 0 members |
| Python: Run | 1 methods, 2 members |
| Python: Runs | 0 methods, 0 members |
| Python: SOP | 48 methods, 2 members |
| Python: ScriptOp | 7 methods, 5 members |
| Python: Segment | 0 methods, 2 members |
| Python: Sequence | 2 methods, 2 members |
| Python: Stype | 0 methods, 0 members |
| Python: SysInfo | 0 methods, 2 members |
| Python: TOP | 51 methods, 2 members |
| Python: Timecode | 10 methods, 2 members |
| Python: UI | 2 methods, 4 members |
| Python: Vertex | 0 methods, 2 members |
| Python: baseCOMP | 70 methods, 2 members |
| Python: evaluateDAT | 84 methods, 2 members |
| Python: examineDAT | 84 methods, 2 members |
| Python: glslTOP | 51 methods, 2 members |
| Python: listCOMP | 92 methods, 2 members |
| Python: midiinDAT | 85 methods, 2 members |
| Python: scriptCHOP | 0 methods, 2 members |
| Python: scriptDAT | 90 methods, 0 members |
| Python: scriptSOP | 2 methods, 0 members |
| Python: scriptTOP | 2 methods, 0 members |
| Python: serialDAT | 87 methods, 0 members |
| Python: tcpipDAT | 89 methods, 0 members |
| Python: td | 49 methods, 5 members |
| Python: td Module | 0 methods, 2 members |
| Basic Video Input Chain | Standard video input and basic processing |
| Video Device Input Chain | Live video input processing |
| Image Filter Chain | Multi-stage image filtering workflow |
| Advanced Image Effects | Complex image processing with multiple effects |
| Feedback Loop Effect | Video feedback processing for recursive effects |
| Audio Analysis Chain | Audio input with spectrum analysis |
| Audio Processing Chain | Audio filtering and effects processing |
| MIDI Control Chain | MIDI input processing for control |
| Audio Reactive Visuals | Audio-driven visual generation |
| Basic 3D Geometry | Simple 3D object creation and rendering |
| Complex 3D Scene | Multi-object 3D scene with lighting |
| Procedural Geometry | Algorithmic geometry generation |
| Particle System Basic | Simple particle generation and forces |
| Advanced Particle System | Complex particle system with multiple forces and interactions |
| Data Visualization | Convert data to visual representation |
| UI Panel Creation | Interactive user interface elements |
| Generative Pattern | Algorithmic pattern generation |
| Motion Graphics | Animated graphics and text |
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/Pantani/tdmcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server