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 | Health check + TouchDesigner server info. Returns TD/Python version and bridge status when connected, plus the embedded knowledge-base stats. Use this first to confirm the bridge is reachable. |
| create_td_nodeA | Create a single operator (node) inside a parent COMP. Validates the operator type against the knowledge base and warns (without blocking) on unknown types. |
| delete_td_nodeA | Delete a single node by path. Destructive — only call this when the user explicitly asks to remove a node. |
| update_td_node_parametersA | Set one or more parameters on an existing node. |
| get_td_nodesA | List the direct child nodes of a 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 the current parameters (and I/O) of a node. Pass |
| get_td_node_errorsA | Check a node (or 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 | List TouchDesigner Python API classes from the embedded knowledge base (works offline). Optionally filter by name. |
| get_td_class_detailsA | Full documentation for one TouchDesigner Python class (members + methods) from the knowledge base. |
| get_module_helpA | Human-readable help (description, members, method signatures) for a TouchDesigner Python class or module, from the knowledge base. |
| get_td_performanceA | Report cook times under a network (recursively by default, slowest node first) and warn about nodes that exceed the frame budget. |
| get_td_topologyA | Return the nodes and connections under a network root, flagging obvious structural issues. |
| find_td_nodesA | Search a network for nodes by name pattern and/or operator type. Recursive by default; pass path_only:true for a compact path list. Prefer this over get_td_nodes when you are looking for specific nodes. |
| summarize_td_errorsA | 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. Use this instead of reading every node's errors one by one. |
| compare_td_nodesA | Diff the parameters of two nodes, returning only the values that differ (by default). Useful for aligning settings across similar operators. |
| snapshot_td_graphA | Capture a compact, serializable snapshot of a network — nodes, connections, structural issues, and optionally each node's parameters — for review, diffing, or documentation. |
| 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). |
| 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 |
| 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 into another node's input. Uses the batch endpoint when available, with a Python fallback. |
| create_glsl_shaderA | Create a GLSL TOP with a fragment shader (and optional vertex shader) supplied via Text DATs, with optional uniform binding and output resolution. |
| create_python_scriptB | Create a DAT (text/execute/script) preloaded with Python code. |
| 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 a self-contained COMP to hold a visual system. |
| 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: save any COMP as a .tox file, or load a .tox back into the project (as an independent copy, or a live-linked instance via |
| 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 its contents) to a new node, optionally into another parent. |
| 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. |
| 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. |
| 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: deck A and deck B each pull in a source TOP (via a Select TOP, so sources can live anywhere) through a per-deck gain/opacity Level, and a master Crossfader (a Cross TOP, 0 = A, 1 = B) blends them, followed by a master FX Level and an output Null. Either deck falls back to a built-in test source (Noise for A, Ramp for B) so it builds standalone. Exposes live 'Crossfader' + per-deck 'GainA'/'GainB' knobs. 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_feedback_networkA | Build a feedback-based visual system: a seed feeds a loop that is transformed (blur/displace/etc.) and fed back each frame. Great for evolving, hypnotic visuals. |
| create_generative_artA | Create an evolving generative visual. reaction_diffusion/noise_landscape use validated recipes; strange_attractor, voronoi, and fractal render real GLSL; custom_glsl uses your shader; the rest fall back to animated noise. |
| create_audio_reactiveA | Build an audio analysis chain (spectrum + level + optional beat) and a spectrum visual driven by it. Each visual_style renders the spectrum its own way: glsl=horizontal bars, geometric=radial bars, particle=dot field, feedback=ring tunnel, instancing=LED grid. |
| create_particle_systemA | Build a particle system: an emitter feeds a particle SOP inside a Geometry COMP, rendered with a camera + light. Forces and render style are scaffolded for further tuning. |
| create_data_visualizationB | Build a data-driven visualization: a data source feeds a CHOP that drives a chart TOP. Wire your real data into the created 'data' node. |
| apply_post_processingA | Chain post-processing effects (bloom, glitch, rgb_split, vignette, etc.) onto an existing TOP. Returns the processed output. |
| setup_outputC | Route a TOP to an output: a display window, NDI stream, Syphon/Spout, a recording, or Touch Out. |
| get_previewA | Capture a TOP node as an inline image so you can see what was created. |
| plan_visualA | Turn a natural-language description of a visual you WANT into a build plan (which tool/recipe and nodes) — a dry run that creates nothing. Note: this does NOT inspect the current TouchDesigner project; to read existing nodes use get_td_nodes / get_td_topology / find_td_nodes. |
| create_visual_systemA | Create a complete visual system from a natural-language description. Classifies intent (audio-reactive, particle, feedback, reaction-diffusion, landscape, generative) and builds it in a self-contained COMP, then verifies and previews it. |
| extract_audio_featuresA | Build an audio-analysis chain that exposes ready-to-bind reactive channels — overall level plus bass/mid/treble band energies — on a Null CHOP. Unlike create_audio_reactive (which renders a spectrum visual), this produces the raw signals so you can drive ANY parameter: bind a node parameter to op('…/audio_features/features')['bass'] and it pulses with the music. A Sensitivity knob scales all channels. Source can be the live device (mic/line — may prompt for macOS permission), an audio file, a synthetic oscillator (for testing), or an existing CHOP. |
| create_motion_reactiveA | Build a video-analysis chain that exposes ready-to-bind reactive channels — overall brightness plus frame-to-frame motion energy — on a Null CHOP. The camera counterpart to extract_audio_features: bind any parameter to op('…/motion_reactive/features')['motion'] and it responds to movement in front of the camera, or ['brightness'] to ambient light. A Sensitivity knob scales both. Source can be the live camera (may prompt for macOS permission), a movie file, an animated synthetic pattern (for testing without a camera), or an existing TOP. Optical flow is unavailable on macOS, so direction isn't exposed. |
| create_multi_outputA | Fan a master TOP across N projectors/displays: each output is a cropped slice (horizontal or vertical) resized to full projector resolution and ended on a Null, ready for setup_output. Set |
| sync_external_clockA | Lock the project tempo to a live source so beat-synced visuals follow the music: a Bpm knob writes the global tempo (op('/').time.tempo), and a Tap pulse beat-matches by ear (averaging your taps into a BPM). Drives every Beat CHOP downstream — create_tempo_sync clocks and create_autopilot all follow. Dedicated MIDI-clock / Ableton-Link sync is a planned follow-up; for now match the DJ by tapping or dialing their BPM. |
| create_tempo_syncA | Create a tempo clock (Beat CHOP driven by TouchDesigner's global tempo) exposing beat-synced channels on a Null CHOP: a per-beat 0→1 |
| create_text_overlayA | Composite styled text over a visual (or on its own transparent background) — a Text TOP with font size, color, and alignment, optionally laid 'over' a source TOP through a Composite TOP, output as a Null. For lyrics, titles, song names, or credits in a set. Distinct from the vault's bind_vault_text (which data-syncs a Text DAT to a note); this is a finished visual layer ready for setup_output. |
| create_autopilotA | Build a beat-driven auto-VJ: a Beat CHOP + a CHOP Execute DAT that, every N beats, either randomizes a target COMP's numeric controls (a hands-free drift, set by Amount) or cycles through its stored cues — so a set keeps evolving on its own. Live Active/Beats/Amount knobs let you pause or retune on stage. Reuses the tempo clock, randomize_controls and manage_cue mechanisms. Pair with a generated system (or a control panel) as the target. |
| create_layer_mixerA | Build a VJ-style layer mixer: combine source TOPs into one output. 'crossfade' makes an A/B Cross TOP with a Crossfade knob (the classic two-deck mix); any other blend mode composites the inputs (add, difference, hardlight, glow, …). Sources are pulled in via Select TOPs so they can live anywhere; with fewer than two, demo sources are created. Output is a Null ready for post-processing or setup_output. |
| create_video_playerA | Build a movie/clip player: one Movie File In TOP, or a playlist of clips fed through a Switch TOP with a Clip selector. Exposes live Play / Speed (and Clip) controls, output as a Null. Pass file paths, or none to get an empty player you point at a file in TD. For VJ clip playback — mix it with create_layer_mixer or make it react with bind_to_channel. |
| create_3d_sceneA | Build a renderable 3D scene: a Geometry COMP holding the chosen primitive (sphere/box/grid), a Camera, a Light, and a Render TOP, output as a Null — optionally instanced into a grid of |
| create_projection_mappingA | Wrap a source TOP in a Corner Pin warp for projection mapping: drag the four corner handles to line the image up with a physical surface (wall, object, screen). The source comes in through a Select TOP so it can live anywhere; output is a Null ready for setup_output. The corner positions are parameters, so you can also drive or save them. |
| create_keyframe_animationA | Animate parameters along a keyframed curve synced to the timeline — structured motion beyond animate_parameter's LFO. Give time/value keyframes and the targets; an Execute DAT interpolates the curve each frame (linear or smooth easing) and loops it. Use it for choreographed moves (a build-up, a drop, a sweep) rather than continuous oscillation. |
| create_simulationA | Build a GPU simulation: 'reaction_diffusion' grows Gray-Scott patterns (via the validated recipe), while 'slime' and 'fluid' run a feedback loop displaced by an evolving noise flow field — drifting trails and advected smears. Exposes a Decay knob (trail persistence). For more procedural techniques (cellular automata, flow fields, strange attractors) see create_generative_art. |
| list_recipesA | List the built-in recipe library — ready-made network templates (feedback tunnel, particle galaxy, reaction-diffusion, projection mapping, …) with their id, name, tags and difficulty. Offline. Apply one with apply_recipe. |
| apply_recipeA | Instantiate a built-in recipe by id (from list_recipes) inside a COMP — a tested, ready-made network you can build in one call, then tweak. Verifies and previews the result. |
| scaffold_showA | Create a starting skeleton for a live show: a container with a 'master' output Null (where your mix lands) and a 'tempo' beat clock for reactivity. A blank-canvas starting point — then add scenes, audio features, a layer mixer into master, cues and a control surface. |
| create_strobeA | Build a beat-syncable strobe / flash layer — a full-frame colour flash that pulses hard on/off, the signature live-VJ strobe effect. A square-wave LFO CHOP at the given Rate (Hz) drives a Level TOP's brightness so a Constant TOP (the flash colour, white by default) blinks; Duty sets the on-time fraction. With an input_path the flash is composited OVER that source (pulled in by a Select TOP, so it can live in another container); without one, the bare flash is output. Output is a Null TOP. Rate is free-running for v1 — bind the LFO's frequency to a beat CHOP later to lock it to the tempo. |
| create_kaleidoscopeA | Wrap a source in a kaleidoscope / radial-mirror symmetry effect — a signature VJ look. Folds the image into N identical mirrored wedges around a centre, with live Segments / Rotation / Zoom / Center controls. Pass input_path (an absolute TOP path) to kaleidoscope an existing visual, or omit it to generate a self-contained noise source that previews on its own. Output is a TOP. |
| create_glitchA | Build a glitch / corrupted-signal visual: RGB channel split, noise-driven blocky/slice displacement and horizontal band tearing over a source. With input_path it glitches an existing TOP (pulled in via a Select TOP); otherwise it uses a self-contained animated colour-noise source (no device permissions). Exposes Amount (master intensity — bind to audio/beat), Speed, RGBShift and BlockSize knobs. A signature live VJ look. |
| create_spectrumA | Build an FFT audio-spectrum analyzer that exposes N separate, ready-to-bind frequency-bin channels (band0..band{N-1}) on a Null CHOP. This is the per-band complement to extract_audio_features (which only gives overall level + bass/mid/treble): bind a row of parameters to op('…/spectrum/spectrum')['band0'], ['band1'], … to drive a bank of bars, or pick one frequency. A Sensitivity knob scales every band. Source can be the live device (mic/line — may prompt for macOS permission), an audio file, a synthetic oscillator (for testing), or an existing CHOP. |
| detect_onsetsA | Build a transient/onset detector that flags kick/snare/hi-hat hits in live audio and exposes a per-band pulse channel (a 0→1 spike on each hit) on a Null CHOP. Unlike create_tempo_sync (a fixed internal clock), this follows the ACTUAL audio: bind a parameter to op('…/onsets/onsets')['kick'] to flash or cut exactly on the kick drum. Each band is built from primitives (band filter → RMS energy → moving-baseline compare → threshold), so a Threshold knob tunes hit sensitivity and a Sensitivity knob scales the output. Source can be the live device (mic/line — may prompt for macOS permission), an audio file, a synthetic oscillator (for testing), or an existing CHOP. With emit_events on, it also broadcasts an |
| create_color_gradeA | Build a colour-grading / LUT finishing stage over a source — the 'make the final output look graded' tool for VJ sets. A Level TOP applies lift/gamma/gain (brightness1 / gamma1 / contrast + black level), then an HSV Adjust TOP applies saturation + hue rotation; an optional LUT image file is loaded via a Movie File In TOP and fed into a Lookup TOP's second input to remap every colour. With an input_path the source is pulled in via a Select TOP (so it can live in another container); without one, a Ramp TOP test gradient is graded so it builds and previews standalone. Live Brightness / Gamma / Contrast / Saturation / Hue knobs are exposed. Output is a Null TOP. |
| import_modelA | Import a 3D model file (.obj/.fbx/.usd) and render it to a TOP: a File In SOP reading |
| create_shader_libA | Instantiate a curated, ready-to-run full-screen GLSL shader (tunnel, raymarch_sphere, fractal, metaballs, plasma) into a GLSL TOP with live Speed / Scale / Color controls. High-value VJ eye-candy; unlike create_glsl_shader it ships robust built-in shaders rather than taking arbitrary code. |
| create_video_synthA | Instantiate an analog video-synthesizer pattern (lissajous oscillator curve, moving interference fringes, or CRT scanline modulation) into a GLSL TOP with live Speed / FreqX / FreqY / Scale / Color controls. An oscillator/interference generator for VJ work — distinct from create_shader_lib's tunnel/raymarch/fractal/metaball looks. |
| create_depth_silhouetteA | Extract a silhouette / body mask from a depth or video source — a person's white outline on black you can composite, fill with colour, or use as a mask for reactive visuals (interactive installations / camera-reactive sets). The signal is smoothed (Blur TOP), keyed to a mask (Threshold TOP), optionally inverted (Level TOP) and optionally filled with a colour keyed through the mask (Constant + multiply Composite). Source defaults to a self-contained synthetic noise field so it builds and previews with ZERO device permissions; pick 'file' for a clip, or a 'kinect_azure'/'kinect'/'realsense' sensor for the live installation (may prompt for macOS permission). Exposes Threshold (bind to proximity/audio), Smooth, Invert (+ FillColor) and outputs a Null TOP. |
| create_kinetic_textA | Build a self-contained animated / kinetic typography layer — a word or line that flashes, pulses, or slides, the signature live-VJ lyric-flash effect. A Text TOP renders the text; an LFO CHOP at the given Rate (Hz) drives the animation: 'flash' gates a Level TOP's alpha/opacity hard on/off (a square wave — the text vanishes between flashes rather than turning black, so it pops cleanly in and out over a background), 'pulse' drives a Transform TOP's scale plus a Level TOP alpha fade (a sine, the text breathes), and 'slide' scrolls the Transform TOP's translate-X. With an input_path the text is composited OVER that source (pulled in by a Select TOP, so it can live in another container); without one it animates on a transparent frame. Output is a Null TOP. Rate is free-running for v1 — bind the LFO's frequency to a beat CHOP (or a Trigger to a detect_onsets channel) to lock the flashes to the tempo. |
| create_waveformA | Build a time-domain audio waveform / oscilloscope — the actual audio signal scrolling left-to-right as a moving trace (the time-domain companion to create_spectrum's frequency bins and detect_onsets' transients). A Trail CHOP keeps a rolling buffer of recent samples (time_window seconds), a CHOP-to-SOP turns those samples into a real scope LINE (x=time, y=amplitude) rendered by a Geometry COMP through an orthographic Camera + Render TOP, and a Constant TOP tints the trace to the chosen colour. Unlike create_audio_reactive (which renders a spectrum), this shows the raw waveform. Source can be the live device (mic/line — may prompt for macOS permission), an audio file, a synthetic oscillator (for testing), or an existing CHOP. Output is a Null TOP. Scale is the vertical amplitude zoom; TimeWindow is the horizontal time span. |
| detect_pitchA | EXPERIMENTAL monophonic pitch tracker. Estimates the dominant musical pitch of live audio and exposes pitch_hz (frequency in Hz), note (MIDI note number), and confidence (peak magnitude) on a Null CHOP — bind a colour/parameter to op('…/pitch/pitch')['pitch_hz'] to drive visuals from a melody. Built entirely from stock CHOPs (the Pitch CHOP isn't createable in this build): an Audio Spectrum CHOP in 1-sample-per-Hz mode, trimmed to a [min_hz, max_hz] search band, then an Analyze CHOP argmax (highestpeakindex) whose index IS the frequency. A Threshold knob mutes the pitch when nothing is clearly playing and a Sensitivity knob scales the magnitude. Source can be the live device (mic/line — may prompt for macOS permission), an audio file, a synthetic sine oscillator (for testing), or an existing CHOP. Caveats: ~1 Hz resolution, no harmonic/octave correction, monophonic only — approximate and best tuned live. |
| create_3d_audio_reactiveA | Build a 3D scene that reacts to sound — the 3D counterpart of create_audio_reactive. An FFT spectrum chain feeds geometry: 'instanced_bars' renders a row of |
| create_dome_outputA | Remap a source TOP (treated as an equirectangular / panoramic master) into a square single-output dome master for planetarium fulldomes / 360 — the curved complement to create_multi_output's flat tiling. A Select TOP pulls the master in, a GLSL TOP warps it (fisheye: equirect → centred dome disc using |
| create_mesh_warpA | Map a source TOP onto a curved or irregular surface via a deformable textured grid — the curved-surface upgrade to create_projection_mapping's flat corner-pin, for domes, columns, and sculptures. Builds a Geometry COMP holding a grid that is bent into a dome (bulge), ripples (wave), half-cylinder (cylinder), or left flat, textured with the source through a Constant MAT, and rendered through an orthographic Camera + Light + Render TOP. Output is a Null ready for setup_output; exposes a Zoom knob. |
| create_depth_displacementA | Push a flat plane into real 3D relief by a depth/luminance map: a subdivided grid whose vertices are offset along Z by a GLSL displacement material sampling the source's brightness, rendered with a camera + light so it reads as depth that shifts with the view. Unlike create_depth_silhouette (a flat 2D mask), this is true geometry — a 2.5D landscape. Source can be the live camera (may prompt for macOS permission), a movie file, an animated synthetic pattern (testable without a camera), or an existing TOP (e.g. a real depth map). |
| create_gpu_particle_fieldA | Build a high-count GPU particle / point field: position and velocity are simulated entirely on the GPU in two RGBA32float feedback-TOP loops (velocity integrates forces — noise/curl/gravity; position integrates velocity), then a Geometry COMP instances a tiny dot once per texel, reading XYZ from the position texture. Reaches counts (side², up to 512²≈262k) well beyond the CPU create_particle_system, flowing as curl-noise streams. Exposes PointSize and Zoom knobs. Optional reactivity energises the field live: 'audio' drives it from mic/line RMS, 'motion' from camera frame-difference energy (both bound to the velocity shader's uReact uniform). |
| scaffold_vaultA | Populate the configured Obsidian vault with a starter layout and worked examples (a recipe, setlist, shader, and moodboard note) so you begin from a working vault instead of an empty folder. Skips existing files unless overwrite. Requires TDMCP_VAULT_PATH. |
| save_recipe_to_vaultA | Capture a COMP's network (nodes, parameters, wiring, text/script DAT bodies) as a reusable recipe note in the Obsidian vault (Recipes/.md). list_recipes/apply_recipe then see it alongside the built-in recipes. Requires TDMCP_VAULT_PATH. |
| apply_shader_from_vaultA | Read a shader note from the Obsidian vault (a |
| sync_presets_vaultA | Export a COMP's manage_presets snapshots to a markdown note (diffable, shareable), or import a note's presets back into TD storage. Requires TDMCP_VAULT_PATH. |
| export_network_to_vaultA | Document an existing TD network into an Obsidian note: a Mermaid flowchart plus [[wikilinks]] for every operator and connection, so the vault's graph view becomes a clickable map of the patch. Requires TDMCP_VAULT_PATH. |
| log_performanceA | Capture a dated performance-journal entry in the vault: a network snapshot (node/connection counts + any errors) and an optional preview thumbnail, written to Performances/-.md. Build a diary of your shows. Requires TDMCP_VAULT_PATH. |
| import_setlistA | Read a setlist note (frontmatter |
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. |
| 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. |
| 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. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| 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 |
| Real-time Compositing | Multi-layer video compositing |
| OSC Control Network | OSC communication for external control |
| GLSL Shader Pipeline | Custom GLSL shader rendering pipeline |
| Instanced Geometry | GPU-instanced geometry rendering |
| Texture Lookup Chain | Color lookup table processing |
| Multi-Screen Output | Multi-display output configuration |
| Sensor Data Processing | Sensor input smoothing and mapping |
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