touchdesigner-bridge-mcp

TouchDesigner'ı Claude Desktop entegrasyonuyla yönlendiren, yalnızca veri odaklı bir MCP sunucusu.

Dokümantasyon

touchdesigner-bridge-mcp

Drive TouchDesigner from an AI chat — a security-first, data-only control surface for building projection-mapping content, with no arbitrary-code path.

A Windows-native MCP (Model Context Protocol) server that lets an AI chat client build TouchDesigner operator networks — through a fixed catalog of typed, schema-validated tools with no execute_python-style path. The assistant assembles and tunes the operator graph (TOPs, CHOPs, SOPs, COMPs, MATs, DATs, POPs) that produces mapped video for a physical surface; you — the human at the machine — fire the cooks and renders and decide when the bridge is armed. It is built for one job: exterior building-surface projection-mapping content, from 3D façade renders and generative texture FX through per-section choreography, projector keystone/edge-blend, DMX/show control, and the wire-only hand-off to a media server (Pixera / disguise). One binary runs alongside TouchDesigner and your AI client; that, plus one line pasted into TouchDesigner, is the whole install.

Status: v0.1.0 — a Rust MCP gateway plus an in-TouchDesigner Python executor, modeled on the author's Houdini bridge. Target: a licensed TouchDesigner install, build 2023.11k+ or 2025.30k+. The pipeline is AMD-first — NVIDIA/CUDA-only operators are intentionally out of scope because they can't be tested on the target hardware. Windows-first.


Quickstart

New to this / not a coder? You do not need to live in a terminal. Getting running is: build (or obtain) one program, click a couple of buttons in its window, launch TouchDesigner and paste one small line into its Textport, then paste one JSON block into your AI client. That's the whole job. The numbered Steps 1–5 below walk each part in detail.

What you'll need on hand: a licensed TouchDesigner (2023.11k+ or 2025.30k+), a Windows PC, and an AI client that speaks MCP (Claude Desktop, etc.). One folder on your disk becomes the working directory the AI is allowed to read and write — you pick it in Step 2.

Three moves to a working setup (full detail in Steps 1–5):

  1. Get the gateway — the one program that connects your AI to TouchDesigner. Either download the prebuilt touchdesigner-bridge-mcp.exe from Releases (no coding), or build it from source (cargo build --release --manifest-path gateway/Cargo.toml, needs the Rust toolchain). It's a single file that is both a small GUI and the headless MCP server.
  2. Configure & arm — run the gateway (it opens a GUI), set your working directory and click Apply, then in TouchDesigner paste one arm line into the Textport (Alt+T) to arm the executor.
  3. Connect your AI client — paste one small JSON block into its config pointing at the gateway binary, fully restart the client, then run the Step 5 check to confirm the AI can see your TouchDesigner scene.

Fast path: python scripts/setup.py builds the gateway and prints your filled-in Claude Desktop config and your Textport arm command with real paths for this machine.


Why it's different

Most TouchDesigner/Blender/Houdini MCP servers control the application by shipping an execute_python-style tool — arbitrary code execution by design. This one is the inverse:

  • Data-only by construction. The assistant can only call a fixed registry of 544 typed, validated tools. There is deliberately no arbitrary-code tool, no raw-script path, and no free-form code sink — those simply do not exist in the catalog, so the boundary cannot be talked past. The set of things the server can do is the enumerated tool list. A runtime canary (assert_no_rce_endpoints) refuses to arm if any handler even looks like a code-execution endpoint, and a build-time fence (catalog_never_exposes_rce_tools) fails the build if a code-carrying tool ever reaches the catalog.
  • One create-and-configure tool per operator. Every TouchDesigner operator type has its own typed tool (e.g. blurTOP, noiseCHOP, gridSOP) that creates the node and sets its parameters in a single call. Ranges are clamped, menu parameters are fixed to their token set, and file paths are confined to the working directory before anything is written. Values only — never expressions or code.
  • You fire the heavy work. The bridge builds and wires render, record, and network-send graphs; output is wire-only by design — the export op is left with record/active off, and you (or your media server) fire it. The assistant never triggers a render, a file bake, or a live send on its own.
  • One working directory. Every file read and write is realpath-confined to a single project folder you choose. Nothing outside it is reachable, even through a symlink or junction.
  • Validated code lanes are the exception, not an escape hatch. The only paths that admit any code are two narrow, default-off, consent-gated lanes (a GPU-sandboxed GLSL lane and an experimental parameter- expression lane), each validated before any write and each off unless a human explicitly enables it. The AI cannot enable its own lane. See Security.

Learn TouchDesigner with an AI

TouchDesigner is deep, and the blank-network moment is where most people bounce off. This bridge is a guided, low-stakes way to actually learn it — you describe what you want, the AI builds it in your live session, and you watch the operator network take shape.

  • The typed tools are the learning scaffold. Every capability is a fixed, typed, validated operation, so the AI can only reach real TouchDesigner operators — it cannot wander outside what the software does or invent a step that isn't there. The tool list mirrors how TouchDesigner is organized (the TOP/CHOP/SOP/ COMP/MAT/DAT/POP families), so the surface that bounds the AI also teaches you how the application is structured.
  • You watch it, you don't run it blind. Every operation streams into the gateway GUI's live audit log, so you see the AI work step by step in a running TouchDesigner session — the network is built in front of you, node by node.
  • Mistakes are visible and cheap. The typed, inspectable surface makes any wrong node or misjudged parameter easy to see, undo, and correct. Nothing it does runs arbitrary code or touches files outside your project folder, so a bad step is something you catch and learn from, not a disaster.
  • The recipe layer is a built-in tutor. recipe_reference carries 66 tool-mapped workflow recipes with ordered steps, the landmark tap to plant at each stage, and the cheap read to verify it — worked examples of how real façade content is built, not a black box.
  • Learn to write code, safely. When the art needs a GPU shader or a self-computing parameter, the AI surfaces the opportunity and teaches it — it never reaches for raw code on its own. glsl_reference teaches GLSL shaders, expr_reference the parameter-expression surface, and code_reference explains which lane carries what and the consent handshake. Code enters only through a consented, validated lane (set_glsl / set_expr, default-off) or your own hands — recipe steps flag these spots with a glsl_opportunity / expr_opportunity cue.

Honest coverage — what's in scope, and what isn't. No inflation:

  • Operators: the catalog exposes 509 operator tools — a near-complete slice of TouchDesigner's operator set on the target rig (TOP 106 / CHOP 137 / SOP 79 / COMP 30 / MAT 10 / DAT 51 / POP 96). NVIDIA/CUDA-only operators are intentionally out of scope (untestable on the AMD-first target).
  • Code: two validated lanes — GLSL shaders (set_glsl) and single-line Python parameter expressions (set_expr) — ship default-OFF behind explicit consent; the *_reference tools teach them and propose text. DAT/callback Python is paste-handoff only — proposed and taught, never executed by the bridge.
  • Workflows: 66 tool-mapped recipes across 10 projection-mapping domains. The core façade lane (per-section rig, video-on-surfaces, choreography, masking, real-time input, alignment, output hand-off) is live-proven; several recipes (multi-projector blend, and parts of the generative / point-cloud / camera lanes) are built and mechanism-verified but not yet exhaustively live-swept — flagged here rather than overstated.
  • Deliberately out of scope: any arbitrary-code path (there is none, by design), and TouchDesigner domains outside projection-mapping content creation.

What you can do with it

Once the gateway is running and TouchDesigner is armed, you can say things like this directly in your AI chat client (paths are relative to the one working directory you configure):

  • "Render this building .obj through an ortho camera onto a dark plate at 4K."
  • "Build a generative noise-and-feedback field and tap it as façade content."
  • "Import section_00.obj … section_07.obj and blast this clip onto each façade surface."
  • "Animate a bottom-to-top light sweep revealing each section over the timeline."
  • "Load this drone point cloud and instance sprites onto the scanned points."
  • "Add a 4-corner keystone and wire a HAP file output — I'll press record."
  • "Split the finished composite across two overlapping projectors with a blended seam."
  • "Drive Art-Net fixtures from a CHOP in sync with the projection (leave it wire-only)."
  • "Wire an OSC input to drive per-section emission in real time."
  • "Set up a timer-driven cue show with GO, looping, and LTC timecode sync."
  • "Warp the composite to follow a curved surface with a control-grid remap."
  • "What operators are in the scene right now, and how much memory is TouchDesigner using?"

How it works

  AI / MCP client  ──stdio──▶  touchdesigner-bridge-mcp  (one binary: GUI + headless MCP gateway)
                                        │  loopback HTTP  (127.0.0.1:9980, X-TDMCP-Token)
                                        ▼
                               a data-only executor armed inside your live TouchDesigner session

Two processes make up the bridge, and they rendezvous through a single file, ~/.touchdesigner-bridge-mcp/arm.json:

  • The gateway (gateway/, a Rust binary) — the sole AI entry point and the whole client-side install. It is both a small GUI (set the working directory, watch a live audit log of every call) and the headless MCP server your AI client talks to over stdio. Which one it becomes is chosen at launch by the TDMCP_GW_HEADLESS environment variable. It owns the typed schema, input validation (clamp / enum / required-key / path-confine), and lowers each operator tool to a generic create_op + set_par before relaying it to the executor over loopback HTTP. This is the single security choke point on the way in.
  • The executor (td_executor/, Python) — a small, data-only handler registry armed inside a running TouchDesigner session by arm.py. It applies validated requests to the operator graph on TouchDesigner's main thread. It uses only the Python standard library and TouchDesigner's own built-in td module — no third-party packages are bundled or redistributed, nothing to pip install.

Because the gateway exposes 509 typed operator tools but lowers every one of them onto the same two executor verbs (create_op + set_par), the entire surface funnels through one validated parameter guard. See ARCHITECTURE.md.


Requirements

  1. TouchDesigner — a licensed install, build 2023.11k+ or 2025.30k+. The executor runs inside TouchDesigner's own embedded Python.
  2. A Rust toolchain (stable) — only if you build the gateway yourself; skip it if you download the prebuilt .exe from Releases. rustup.rs provides cargo.
  3. Python 3.10+ — only to run the optional scripts/setup.py helper (and the executor test suite). The executor itself runs in TouchDesigner's embedded Python, not this one.
  4. An MCP client — Claude Desktop, or any client that can launch a stdio MCP server.
  5. Windows — the primary platform. The target pipeline is AMD-first; NVIDIA/CUDA-only operators are intentionally out of scope.

Step 1 — Get the gateway

Prefer no coding? Download the prebuilt touchdesigner-bridge-mcp.exe from Releases and skip straight to Step 2 — it is the same single binary the build produces. Want to build from source instead (or there's no prebuilt binary for your setup yet)? Build it from source:

cargo build --release --manifest-path gateway/Cargo.toml
# or, from gateway/:
cargo build --release

This produces one file:

gateway/target/release/touchdesigner-bridge-mcp.exe      (Windows)

The gateway is both the GUI and the headless MCP server. Which mode it runs in is selected at launch by one environment variable, TDMCP_GW_HEADLESSunset opens the GUI window; 1 runs the headless stdio server. (You won't normally set this by hand: double-clicking the file opens the GUI, and the config block in Step 3 sets the headless flag for your AI client.)

gateway/src/tools.rs is generated from reference/catalog.json, never hand-edited.


Step 2 — Configure via the GUI

The working directory is the single folder the tool may read from and write to — every executor file operation is confined under it. It is deliberately not the source tree.

Run the gateway binary with no arguments to open the GUI, then:

  1. Open the Working dir pane, enter (or paste) an existing folder, and click Apply. This updates the confinement root live for every future call and merge-writes working_dir into ~/.touchdesigner-bridge-mcp/arm.json.
  2. Leave the GUI running — its Status pane shows an "Armed" pill and the live TouchDesigner build once the executor (Step 4) is reachable, and its live audit log lets you watch every call.

Changing the working directory later is just Apply again — no restart, no re-arm.

No firewall step is required. The in-TouchDesigner Web Server DAT binds 127.0.0.1 only — nothing listens off-box, so there is no inbound rule to add.


Step 3 — Register with your MCP client

Point your client (e.g. Claude Desktop — edit %APPDATA%\Claude\claude_desktop_config.json) at the gateway binary in headless mode. Copy the template at claude_desktop_config.example.json and replace both placeholders with your clone path (forward slashes, even on Windows):

{
  "mcpServers": {
    "touchdesigner": {
      "command": "C:/path/to/touchdesigner-bridge-mcp/gateway/target/release/touchdesigner-bridge-mcp.exe",
      "env": {
        "TDMCP_GW_HEADLESS": "1",
        "TDMCP_REPO": "C:/path/to/touchdesigner-bridge-mcp"
      }
    }
  }
}

Both env vars are load-bearing:

  • TDMCP_GW_HEADLESS=1 — required, or the client would spawn a GUI window and the MCP handshake would never complete.
  • TDMCP_REPO — the clone path, so the gateway finds its bundled reference data (reference/recipes.json, reference/catalog.json) deterministically.

Fully quit and reopen the client after editing the config.


Step 4 — Arm the executor inside TouchDesigner

Open TouchDesigner, open the Textport (Alt+T), and paste the arm command, substituting your clone path:

import os; os.environ['TDMCP_REPO']=r'C:/path/to/touchdesigner-bridge-mcp'; exec(open(os.path.join(os.environ['TDMCP_REPO'],'arm.py')).read())

You don't have to type it by hand — the GUI shows this exact line with a Copy arm command button, and python scripts/setup.py prints it too.

What arming does (arm.py):

  • Verifies the on-disk executor files against td_executor/INTEGRITY.json before importing them (fail-closed tamper-evidence).
  • Refuses to arm if any handler looks like a raw code-execution endpoint (the data-only canary).
  • Mints a 128-bit CSPRNG session token and writes token / port / working_dir (and preserves the consent flags) into arm.json.
  • Assembles a /mcp_bridge component — a Web Server DAT on loopback 127.0.0.1:9980 plus a thin callbacks DAT that loads the on-disk td_executor package — and adds GUI consent toggles (Allow Expr Lane / Allow GLSL Lane) that persist to arm.json.

Re-arm any time to hot-reload on-disk executor edits (it purges the module cache first). Remove the bridge with op('/mcp_bridge').destroy(). To make arming persistent per project, see td_package/README.md.


Step 5 — Verify your setup

  1. Executor health — with TouchDesigner armed, open in a browser or curl:

    http://127.0.0.1:9980/health
    

    The GUI's Status pane also shows the "Armed" pill and the live TouchDesigner build once the executor is reachable.

  2. Tools appear in the client — in a new client chat, ask the assistant to run scene_info. A successful reply (the current scene, TouchDesigner build) confirms the whole path is live: client → gateway → loopback → executor → TouchDesigner.

If both return, you are wired. See docs/INSTALL.md for the full walkthrough, including enabling the code lanes and troubleshooting.


Available tools

544 tools total509 operator tools across 7 TouchDesigner families plus 35 utility tools, listed in full below (also in docs/TOOL_CATALOG.md). Every tool is a validated handler; no free-form code path exists. For any operator's full typed parameter schema, ask the operator_reference tool live in-session (optype=<name>).

Every operator tool creates and configures one operator type in a single call, and also accepts four reserved placement args: op_name, parent_path (default /), pos_x, pos_y. The tables below are the exact current catalog, generated from reference/catalog.json.

TOP — image / texture (GPU raster) (106)

ToolParametersDescription
addTOP26Composites two input images by summing their pixel values, clamping channels that overflow; a simple additive blend often used to brighten or combine light passes.
analyzeTOP19Reduces an image to a single value, row, or column by taking a statistic such as minimum, maximum, or average across the pixels.
antialiasTOP21Smooths jagged, stair-stepped edges in an image with a post-process anti-aliasing filter.
blobtrackTOP37Detects bright blobs in an image and reports their positions and sizes, a lightweight optical tracker for interactive installations.
blurTOP23Applies a Gaussian or box blur; the filter width parameter sets how many pixels are averaged together.
cacheTOP26Stores a rolling buffer of recent frames on the GPU so earlier frames can be replayed or sampled by a Cache Select.
cacheselectTOP16Reads a chosen frame out of a Cache TOP's stored buffer by index.
channelmixTOP19Rebuilds each output channel as a weighted mix of the input channels, useful for channel swaps and custom color matrices.
choptoTOP19Converts CHOP channels into an image, writing sample values into pixels so numeric data can be visualized or fed to shaders.
chromakeyTOP29Keys out a chosen background color (green/blue screen) to produce an alpha matte for compositing.
circleTOP42Draws a filled or outlined circle or ellipse directly as an image.
compositeTOP34Layers many inputs together with a selectable blend operation, the multi-input equivalent of the two-input Over/Add TOPs.
constantTOP23Outputs a flat image of one solid color and alpha at the chosen resolution.
convolveTOP20Filters the image with a user-defined convolution kernel supplied as a small matrix, for custom sharpen/blur/edge effects.
cornerpinTOP36Warps the image by dragging its four corners to arbitrary positions, the standard keystone/quad-warp for projection alignment.
cropTOP23Extracts a rectangular sub-region of the image, changing the output to that crop.
crossTOP27Cross-dissolves between two inputs by a single blend amount.
cubemapTOP15Assembles or rearranges the six faces of a cubemap for environment mapping and reflections.
depthTOP23Extracts the depth buffer from a Render TOP so scene distance can be used for fog, depth-of-field, or masking.
differenceTOP26Outputs the absolute per-pixel difference between two inputs, handy for change detection.
directdisplayoutTOP20Sends the image to a directly attached display bypassing the desktop compositor for low-latency output.
directxinTOP15Receives a shared GPU texture from another application via DirectX shared surfaces.
directxoutTOP16Publishes the image as a shared DirectX texture for another application to read.
displaceTOP25Offsets each pixel's lookup position using a second image as a displacement map, warping the picture.
edgeTOP25Detects edges by measuring local contrast, producing an outline image.
embossTOP21Produces a raised, embossed relief look by shading from local intensity gradients.
feedbackTOP16Feeds a downstream result back into the graph one frame later, the building block for trails, accumulation, and reaction-diffusion loops.
fitTOP27Resizes and fits the input into the output resolution with a chosen fit/stretch mode.
flipTOP18Flips or mirrors the image horizontally and/or vertically.
glslTOP59Runs a custom GLSL fragment shader over the output pixels, with the shader source supplied through a referenced Text DAT rather than an inline code value.
glslmultiTOP59A GLSL fragment shader TOP that exposes multiple image inputs for multi-texture effects.
hsvadjustTOP24Shifts hue and scales saturation and value, the go-to color-grade for tint and vibrance.
hsvtorgbTOP14Interprets the input channels as HSV and converts them to RGB.
inTOP16The input tap of a TOP component, exposing an external image inside the subnetwork.
insideTOP26Keeps the first input only where the second input's matte is opaque (source-in compositing).
kinectazureTOP46Captures depth, color, and infrared image streams from an Azure Kinect sensor.
layermixTOP34Blends stacked layers with per-layer opacity and blend modes.
layoutTOP36Tiles multiple inputs into a single grid image, sized by rows and columns.
lensdistortTOP38Adds or removes barrel/pincushion lens distortion.
levelTOP45Adjusts brightness, contrast, gamma, black/white levels, and opacity, the workhorse tone control.
lookupTOP25Remaps each pixel through a lookup table supplied as a second image, driving color grades and gradient mapping.
lumablurTOP21Blurs by an amount that varies with local luminance, so bright or dark regions smear more.
lumalevelTOP32Adjusts levels based on luminance, useful for isolating highlights or shadows.
mathTOP37Performs per-pixel arithmetic (add, multiply, difference, and more) between inputs and constants.
matteTOP16Applies one input as the alpha matte of another to cut out a shape.
mirrorTOP20Reflects the image about a chosen axis to build kaleidoscopic symmetry.
monochromeTOP18Collapses color to a single grayscale channel using a chosen luminance weighting.
moviefileinTOP63Loads and plays back a movie or still-image file, with parameters for the file path, playback rate, and trim.
moviefileoutTOP70Records the incoming image stream to a movie or image-sequence file; this bridge only wires it up, the user triggers the actual recording.
multiplyTOP26Multiplies the pixel values of its inputs, a modulate/darken blend.
ndiinTOP24Receives video over the network as an NDI source.
ndioutTOP26Publishes the image on the network as an NDI stream.
noiseTOP41Generates procedural noise images (Perlin, simplex, and others) with animatable transform and harmonics.
normalmapTOP20Derives a tangent-space normal map from a height or grayscale image for surface detail lighting.
notchTOP29Plays and controls a Notch effects block (.dfxdll), exposing its exposed parameters.
nullTOP14A pass-through placeholder used as a stable tap point at the end of an image chain.
opencolorioTOP40Applies an OpenColorIO color-space transform for color-managed pipelines.
opviewerTOP17Renders another operator's node viewer into an image so any operator can be seen as a TOP.
orbbecTOP31Captures depth and color image streams from an Orbbec depth camera.
orbbecselectTOP19Selects and extracts one image stream, such as depth or color, from an Orbbec TOP.
outTOP17The output tap of a TOP component, exporting an image out of the subnetwork.
outsideTOP26Keeps the first input only where the second input's matte is transparent (source-out compositing).
overTOP26Composites the first input over the second using standard alpha-over blending.
packTOP15Packs pixel data into a specific layout or bit format for transport or GPU readback.
photoshopinTOP21Links live to a Photoshop document, bringing its layers in as an image.
pointfileinTOP56Loads point-cloud file data into a texture where each pixel encodes a point's position or attribute.
pointtransformTOP61Transforms 3D point data stored in a texture, applying translation, rotation, scale, or an alignment matrix to each point.
prefiltermapTOP15Pre-convolves an environment map into the mip levels a PBR material needs for glossy reflections.
projectionTOP18Converts between projection layouts such as equirectangular, cubemap, and fisheye.
rampTOP32Generates linear, radial, or circular gradients from an editable color ramp.
realsenseTOP40Captures depth, color, and infrared image streams from an Intel RealSense depth camera.
rectangleTOP39Draws a filled or outlined rectangle with adjustable size, position, and corner rounding.
remapTOP24Warps the first input by looking up coordinates stored in a second input's pixels.
renderTOP67Renders 3D geometry from a camera with lights and materials into an image, the heart of the 3D-to-2D lane.
renderpassTOP56Adds an extra render pass (such as a separate layer or buffer) to a Render TOP.
renderselectTOP20Selects one output buffer or pass from a multi-output Render TOP.
rendersimpleTOP31A one-node render that bundles a camera, light, and geometry for quick 3D previews.
renderstreaminTOP18Receives frames from a disguise RenderStream host, bringing an externally rendered image in over the network.
renderstreamoutTOP19Sends the image out to a disguise RenderStream host as a rendered output stream.
reorderTOP22Rearranges, duplicates, or fills the RGBA channels from the inputs.
resolutionTOP15Resamples the image to a new resolution using a chosen filter.
scalabledisplayTOP20Applies a Scalable Display Technologies warp-and-blend calibration for multi-projector setups.
screenTOP26Composites two inputs with the Screen blend mode for a brightening effect.
screengrabTOP27Captures the desktop or a display region into an image.
sharedmeminTOP18Reads an image from a shared-memory block written by another process.
sharedmemoutTOP20Writes the image into a shared-memory block for another process to read.
slopeTOP24Computes the local gradient (slope) of the image, often a precursor to normal maps or edge shading.
spectrumTOP18Transforms the image to and from its frequency spectrum via FFT for frequency-domain filtering.
st2110inTOP31Receives uncompressed video over IP following the SMPTE ST 2110 standard.
st2110outTOP47Transmits uncompressed video over IP following the SMPTE ST 2110 standard.
substanceTOP19Renders a Substance (.sbsar) procedural material, exposing its published parameters.
subtractTOP26Subtracts the second input's pixels from the first.
switchTOP17Passes through one of several inputs chosen by an index, for A/B switching and sequencing.
syphonspoutinTOP16Receives a shared GPU texture via Syphon (macOS) or Spout (Windows).
syphonspoutoutTOP16Publishes the image as a shared GPU texture via Syphon (macOS) or Spout (Windows).
textTOP78Renders text into an image with control over font, size, alignment, and color.
tileTOP36Tiles and repeats the input across the output, with adjustable repeat counts, offset, overlap, and flip for seamless patterns.
touchinTOP20Receives an image from another TouchDesigner instance over the network.
touchoutTOP20Sends the image to another TouchDesigner instance over the network.
transformTOP30Translates, rotates, scales, and tiles the image within its frame.
underTOP26Composites the second input over the first (the reverse of Over).
videodeviceinTOP55Captures live video from a camera or capture card.
videodeviceoutTOP35Outputs the image to an SDI/HDMI or other hardware video device.
videostreaminTOP31Receives a compressed video stream such as RTSP, RTMP, or SRT.
viosoTOP21Applies a VIOSO projection warp-and-blend calibration for multi-projector alignment.
webrenderTOP34Renders a web page or URL into an image using an embedded browser.

CHOP — channels / signals / timing (137)

ToolParametersDescription
abletonlinkCHOP28Synchronizes tempo, phase, and beat with peers on the network over Ableton Link.
analyzeCHOP14Reduces channels to a single statistic per channel such as average, maximum, or length.
angleCHOP13Converts between angle representations, for example degrees, radians, quaternions, and direction vectors.
attributeCHOP11Tags channels with attributes such as rotation order or quaternion type that downstream operators respect.
audiobandeqCHOP26A multi-band graphic equalizer that boosts or cuts fixed frequency bands of an audio signal.
audiobinauralCHOP14Spatializes audio into a binaural (headphone 3D) mix from source and listener positions.
audiodeviceinCHOP40Captures audio samples from an input device such as a microphone or interface.
audiodeviceoutCHOP41Plays channels as audio out to an output device.
audiodynamicsCHOP25Applies compression, limiting, and gating dynamics to an audio signal.
audiofileinCHOP31Reads audio samples from a file for playback or analysis.
audiofileoutCHOP18Writes audio channels to a sound file.
audiofilterCHOP16Filters an audio signal with low-pass, high-pass, band-pass, or band-reject response and an adjustable cutoff.
audiomovieCHOP19Extracts the audio track that accompanies a movie played by a Movie File In TOP.
audiondiCHOP11Sends or receives audio embedded in an NDI stream.
audiooscillatorCHOP20Generates audio-rate tones and waveforms from a frequency input.
audioparaeqCHOP26A parametric equalizer with adjustable center frequency, gain, and Q per band.
audioplayCHOP37Plays back a sound file on demand, often triggered by an event.
audiorenderCHOP48Renders a spatial audio scene from sound sources and a listener into output channels.
audiospectrumCHOP15Computes the frequency spectrum of an audio signal via FFT for visualization or reactivity.
audiostreaminCHOP21Receives streamed audio from the network.
audiostreamoutCHOP16Streams audio channels out over the network.
audiovstCHOP27Hosts a VST audio plug-in and exposes its parameters.
audiowebrenderCHOP11Captures the audio produced by a Web Render TOP.
beatCHOP34Runs a musical clock locked to a tempo, emitting beat ramps, counts, and pulse triggers.
blacktraxCHOP22Receives real-time position and orientation data from a BlackTrax tracking system.
blendCHOP12Blends multiple input channel sets using weighting channels, for weighted pose or value mixing.
blobtrackCHOP25Reports tracked blob positions and sizes as channels.
clipCHOP24Plays back recorded channel clips with control over rate and range.
clipblenderCHOP38Blends and sequences animation clips into a continuous motion stream.
clockCHOP36Outputs wall-clock time components such as hours, minutes, seconds, and frame.
compositeCHOP27Overlays and combines channels from multiple inputs, aligning them in time.
constantCHOP22Produces channels that hold constant values you type in.
copyCHOP17Repeats or copies the first input's channels once per sample of a second input.
countCHOP25Counts threshold crossings or triggers on its input and outputs the running total.
crossCHOP10Cross-fades between two channel sets by a blend amount.
cycleCHOP20Repeats a channel a number of times, optionally blending the seams into a seamless loop.
dattoCHOP31Reads a DAT table and turns its rows or columns into channels.
delayCHOP12Delays channels by a fixed time offset.
deleteCHOP32Removes selected channels or trims samples by name pattern or range.
dmxinCHOP31Receives lighting-control data (DMX over Art-Net or sACN) as channels.
dmxoutCHOP34Sends channels out as DMX lighting-control data.
envelopeCHOP17Follows the moving amplitude envelope (peak or RMS) of a signal.
eventCHOP33Turns discrete events into channels with lifespans and shapes.
expressionCHOP13Applies a per-channel math expression; note that the code-carrying expression value is withheld from this data-only surface, leaving its scope and naming parameters.
extendCHOP12Sets how each channel behaves before its first and after its last sample (hold, cycle, mirror, or default).
fanCHOP14Fans a single channel out to many, or folds many channels into one, by index.
feedbackCHOP12Feeds its own prior output back for recursive, frame-delayed channel processing.
fileinCHOP20Reads channel data from a file or URL.
fileoutCHOP12Appends or writes channels to a file.
filterCHOP26Low-pass smooths channels over time to remove jitter, with an adjustable filter width.
freedinCHOP15Receives camera tracking data over the FreeD protocol as pan, tilt, zoom, and position channels.
functionCHOP19Applies a mathematical function (trigonometric, logarithmic, power, and so on) to each channel.
gestureCHOP21Records a motion and replays it as a reusable gesture channel.
handleCHOP15Solves handle-based inverse kinematics for character rigs.
hogCHOP13Deliberately consumes cook time to profile and stress-test performance.
hokuyoCHOP19Reads distance samples from a Hokuyo laser range scanner.
holdCHOP12Samples the first input and holds that value whenever a second trigger input fires.
inCHOP14The input tap of a CHOP component.
infoCHOP16Exposes another operator's numeric info (cook time, sample counts, and status) as channels.
interpolateCHOP12Interpolates smoothly between successive input channel sets or keyframes.
inversecurveCHOP17Solves an inverse-kinematics curve for smooth chain bending.
inversekinCHOP17Solves two-bone inverse kinematics from a goal position.
joinCHOP27Joins channels end to end in time to build a longer sequence.
joystickCHOP31Reads axes and buttons from a joystick or game controller.
keyboardinCHOP18Reports the pressed state of keyboard keys as channels.
keyframeCHOP14Holds an editable keyframe animation and evaluates it into channels.
kinectazureCHOP23Tracks skeletal body joints from an Azure Kinect sensor, outputting per-joint position and orientation channels.
lagCHOP22Adds inertia, lag, and slew-rate limits so channels ease toward new values.
laserCHOP42Prepares path data for laser projection output.
laserdeviceCHOP23Drives a laser projector DAC with prepared laser channels.
leuzerod4CHOP25Reads distance data from a Leuze ROD4 laser scanner.
lfoCHOP20A low-frequency oscillator generating sine, ramp, square, and pulse waves for animation.
limitCHOP24Clamps channel values to a range and optionally quantizes them to a step.
logicCHOP16Performs boolean logic and comparisons across channels, outputting on/off results.
lookupCHOP17Uses the first input as an index into the second input's lookup table.
ltcinCHOP16Decodes SMPTE linear timecode from audio into time channels.
ltcoutCHOP29Encodes time channels as SMPTE linear timecode audio.
mathCHOP22Performs arithmetic and range remapping on channels (add, multiply, from/to ranges).
mergeCHOP11Combines the channels of several inputs into one output.
midiinCHOP64Brings MIDI notes and controllers in as channels.
midiinmapCHOP19Maps incoming MIDI messages to named channels via a mapping table.
midioutCHOP32Sends channels out as MIDI notes and controllers.
mosysCHOP16Receives camera tracking data from a Mo-Sys system as position, orientation, and lens channels.
mouseinCHOP24Reports mouse position and button state as channels.
mouseoutCHOP15Drives the system mouse position from channels.
ncamCHOP17Receives camera tracking data from an Ncam system as position, orientation, and lens channels.
noiseCHOP41Generates coherent procedural noise channels over time.
nullCHOP13A pass-through tap, the recommended stable endpoint for exports and references.
objectCHOP42Outputs the transform or relationship (position, rotation, distance) between two 3D objects.
optitrackinCHOP19Receives rigid-body and marker data from an OptiTrack motion-capture system.
oscinCHOP27Receives OSC messages and maps their values to channels.
oscoutCHOP22Sends channel values out as OSC messages.
outCHOP12The output tap of a CHOP component.
overrideCHOP13Passes through whichever input changed most recently, letting several controllers share one output.
panelCHOP14Exposes a panel component's interaction values (state, click, roll) as channels.
pangolinCHOP20Controls Pangolin laser software from channels.
pantiltCHOP15Computes pan and tilt angles to aim a device at a target.
parameterCHOP18Reads the evaluated values of an operator's parameters into channels.
patternCHOP32Generates a shaped pattern across samples (ramp, Gaussian, sine, and more).
performCHOP36Exposes real-time performance statistics such as frame time and cook counts as channels.
phaserCHOP13Produces a phase-offset animation signal, shifting channel phase over time.
pipeinCHOP25Receives channels over a TCP pipe from another process.
pipeoutCHOP21Sends channels over a TCP pipe to another process; its script-carrying parameter is withheld from this data-only surface.
poptoCHOP25Reads POP point attributes into channels.
posistagenetCHOP19Receives PosiStageNet stage-tracking positions as channels.
pulseCHOP33Emits pulse spikes at a set interval or count.
recordCHOP16Records incoming channels into a buffer that can be replayed.
renameCHOP9Renames channels using from/to name patterns.
renderpickCHOP48Picks 3D geometry under given coordinates in a render and returns the hit position and info as channels.
renderstreaminCHOP18Receives control data from a disguise RenderStream session.
reorderCHOP18Reorders the channels within the stream.
replaceCHOP11Replaces channels in the first input with matching-named channels from the second.
resampleCHOP22Resamples channels to a new sample rate or time range.
selectCHOP16References channels by name from another CHOP anywhere in the project.
serialCHOP17Reads and writes a serial (RS-232/USB) device as channels.
shiftCHOP17Shifts a channel forward or backward in time.
shuffleCHOP12Reshapes the layout between channels and samples (transpose-like operations).
soptoCHOP24Reads SOP point or primitive attributes into channels.
sortCHOP16Sorts channels or their samples by value or name.
speedCHOP22Integrates a speed channel into position, or scales the flow of time.
st2110deviceCHOP31Exposes audio and ancillary data of an ST 2110 IP video device as channels.
stretchCHOP18Stretches or compresses channels to a new length while preserving their shape.
stypeinCHOP16Receives camera tracking data from a Stype system as position, orientation, and lens channels.
switchCHOP12Selects one of several inputs by index.
syncinCHOP16Receives synchronization timing from a Sync Out CHOP over the network to keep multiple machines frame-locked.
syncoutCHOP20Coordinates frame synchronization across multiple machines.
tabletCHOP40Reads pen pressure, tilt, and position from a graphics tablet.
timecodeCHOP40Represents a timecode value as hour/minute/second/frame channels.
timelineCHOP25Outputs the current timeline position in frames and seconds.
timerCHOP73A programmable timer with segments, cycles, and done pulses for sequencing.
toptoCHOP39Samples pixels from a TOP into channels.
touchinCHOP23Receives channels from another TouchDesigner instance over the network.
touchoutCHOP18Sends channels to another TouchDesigner instance over the network.
trailCHOP19Displays a scrolling history graph of its input channels for monitoring.
triggerCHOP46Generates an attack-decay-sustain-release envelope each time the input crosses a threshold.
trimCHOP16Trims channels to a start and end time.
waveCHOP30Generates periodic waveforms defined by shape and period; its expression-carrying parameter is withheld from this data-only surface.

SOP — geometry (surfaces) (79)

ToolParametersDescription
addSOP17Creates individual points and polygons, or connects existing points into new primitives.
alembicSOP11Loads geometry from an Alembic (.abc) cache file.
alignSOP17Aligns input geometries to one another by bounding box or transform.
armSOP34Builds or edits an articulated arm/chain of geometry.
attributeSOP13Creates, renames, deletes, or edits point, vertex, primitive, and detail attributes.
attributecreateSOP4Adds new attributes to geometry and initializes their values.
basisSOP30Edits the parametric basis (knot vector and order) of NURBS curves and surfaces.
blendSOP9Blends point positions between topologically matching inputs by weight, for shape interpolation.
bonegroupSOP3Creates point groups based on skeletal bone capture regions.
booleanSOP6Computes boolean union, intersection, or difference between solid meshes.
boxSOP18Generates a box or cube with adjustable size and divisions.
bridgeSOP15Builds a skin surface bridging between edge loops or profiles.
cacheSOP9Holds a buffer of geometry frames in memory for replay.
capSOP16Caps the open ends of tubes and surfaces with flat or rounded faces.
captureSOP9Assigns capture weights binding geometry points to a skeleton for skinning.
captureregionSOP9Defines the capture influence region of a bone.
carveSOP20Cuts, slices, or extracts portions of curves and surfaces along their parametric coordinates.
choptoSOP10Creates or drives geometry from CHOP channels, for example animating points from channel data.
circleSOP16Generates a circle or arc as a curve or polygon.
claySOP24Deforms a surface by pushing and pulling its control points like modeling clay.
clipSOP8Clips geometry against a plane, keeping one side or splitting at the cut.
convertSOP17Converts geometry between types such as polygon, mesh, NURBS, and Bezier.
copySOP35Copies geometry onto template points or with a stack of transforms, the core instancing/stamping SOP.
creepSOP5Slides and deforms geometry so it crawls along the surface of another.
curveclaySOP13Sculpts curves by pulling their control points.
curvesectSOP11Finds intersections between curves and surfaces, outputting the crossing points.
dattoSOP15Builds geometry (points and primitives) from the rows of a DAT table.
deformSOP6Deforms captured geometry to follow its skeleton (the skinning deform step).
deleteSOP21Deletes points or primitives selected by group, number, or bounding volume; its per-element filter expression is withheld from this data-only surface.
divideSOP14Subdivides, triangulates, or bricks polygons to change their tessellation.
extrudeSOP21Extrudes faces or edges to add depth and beveling.
facetSOP14Controls normals and faceting, uniquing points and cusping edges for flat or smooth shading.
fileinSOP5Loads geometry from a file such as OBJ.
filletSOP16Creates rounded fillet surfaces or curves between two inputs.
fitSOP17Fits a NURBS curve or surface through a set of points.
forceSOP8Defines a force field that particle and metaball systems respond to.
fractalSOP9Displaces points with fractal noise to roughen a surface.
gridSOP18Generates a flat grid of points or polygons with adjustable rows and columns.
groupSOP46Creates named point or primitive groups by pattern, number, or bounding region; its per-element filter expression is withheld from this data-only surface.
holeSOP6Turns enclosed faces into holes in their surrounding face.
inSOP3The input tap of a SOP component.
inversecurveSOP2Computes an inverse curve solution for chained geometry.
isosurfaceSOP6Builds a surface at a constant value of an implicit 3D function.
joinSOP12Joins multiple curves or surfaces into single continuous primitives.
jointSOP12Creates a skeleton of joints and bones for rigging.
latticeSOP6Deforms geometry by moving the points of a surrounding lattice cage.
limitSOP39Places geometry (spheres, boxes, or templates) at data points or value limits.
lineSOP5Creates a straight polyline between endpoints with a chosen number of points.
linethickSOP9Gives polylines thickness, converting them to ribbons or tubes.
lodSOP9Switches between level-of-detail versions of geometry based on viewing distance.
lsystemSOP35Grows procedural plants and fractals from an L-system rule set.
magnetSOP13Deforms geometry within a falloff region using a metaball-shaped magnet.
materialSOP2Assigns a material to geometry primitives.
mergeSOP2Merges several geometries into one.
metaballSOP9Creates metaballs that blend into smooth blobby surfaces.
modelSOP1Holds hand-editable model geometry.
noiseSOP20Displaces points with animated coherent noise.
nullSOP1A pass-through tap, the recommended stable endpoint of a geometry chain.
objectmergeSOP3Pulls in geometry from other SOPs by path, optionally applying their object transforms.
outSOP4The output tap of a SOP component.
particleSOP39A legacy CPU particle system driven by forces and collisions.
pointSOP43Edits point positions and attributes directly, including creating standard attributes.
polyloftSOP13Lofts polygon surfaces across a series of cross-section curves.
polypatchSOP12Builds a smooth spline patch from a polygon control mesh.
polyreduceSOP16Reduces polygon count while preserving overall shape.
polysplineSOP11Fits smooth splines through polygon edges to round them off.
polystitchSOP7Stitches together seams and cracks between polygon surfaces.
primitiveSOP34Edits primitive-level attributes and transforms.
profileSOP14Extracts and edits profile curves lying on surfaces.
projectSOP21Projects curves onto a surface to create profile curves.
railsSOP16Sweeps cross-section curves along one or two rail curves.
raySOP16Projects points onto a target surface along a ray direction, a shrink-wrap.
rectangleSOP16Creates a rectangle curve or polygon.
refineSOP18Refines curves and surfaces by adding points or raising their order without changing shape.
resampleSOP11Resamples curves into evenly spaced points or segments.
skinSOP12Builds a skin surface across a set of profile curves.
sphereSOP23Generates a sphere as polygons, mesh, or NURBS.
textSOP30Creates 3D text geometry from a font and string.
transformSOP27Translates, rotates, and scales geometry.

COMP — components / 3D / containers (30)

ToolParametersDescription
actorCOMP153A rigid or soft body actor participating in a Bullet physics simulation.
ambientlightCOMP86Adds uniform ambient light to a 3D scene.
animationCOMP43A component that holds and edits keyframe animation channels.
annotateCOMP55A resizable comment box for annotating and organizing the network.
baseCOMP22A general-purpose container with no panel, used to group and modularize operators.
blendCOMP138Blends the transforms of several object components by weight, a weighted parent.
boneCOMP140A single bone within a skeletal hierarchy for character rigging.
bulletsolverCOMP137The Bullet dynamics solver that advances a rigid-body physics simulation.
buttonCOMP132A clickable button panel widget that emits a state value.
cameraCOMP84A 3D camera defining the view and projection used to render a scene.
camerablendCOMP100Blends smoothly between several cameras.
containerCOMP122A panel container that lays out other panels for building user interfaces.
engineCOMP43Runs an exported .tox component in a separate process via TouchEngine for isolation and scaling.
environmentlightCOMP92Provides image-based environment lighting for physically based rendering.
fbxCOMP161Imports an FBX scene, bringing in its geometry, materials, and hierarchy.
fieldCOMP136A text-entry field widget for user input.
geometryCOMP124Places SOP geometry into the 3D scene with a transform, material, and render flags, the object node that a Render TOP draws.
geotextCOMP163Renders 3D text as scene geometry.
handleCOMP134An interactive manipulation handle in the 3D viewport.
lightCOMP117A 3D light source (point, cone, or distant) illuminating a rendered scene.
listCOMP130A scriptable list or grid panel widget for rows of items.
nullCOMP124A pass-through object transform used as a stable parent or tap in the object hierarchy.
opviewerCOMP127Embeds another operator's viewer inside a panel.
parameterCOMP137A component that presents custom parameters as a user-interface panel.
replicatorCOMP41Creates and maintains one copy of a template operator per row of a table; its script-carrying parameter is withheld from this data-only surface.
sliderCOMP139A one- or two-dimensional slider panel widget.
textCOMP175A text-display panel widget.
timeCOMP33Defines an independent local timeline (frame rate and range) for a subnetwork.
usdCOMP158Imports a Universal Scene Description (USD) scene.
windowCOMP53Defines an output window or fullscreen display on a chosen monitor.

MAT — materials / shading (10)

ToolParametersDescription
constantMAT48An unlit material that shades surfaces with a single flat color and alpha.
depthMAT34Shades surfaces by their depth for use in depth passes and effects.
glslMAT78A fully custom material driven by GLSL vertex and pixel shaders, with the shader source supplied through referenced DATs.
inMAT36The input tap of a material component.
lineMAT109A material for rendering lines and wireframes with width and color control.
nullMAT34A pass-through material tap.
outMAT37The output tap of a material component.
pbrMAT185A physically based material using metalness, roughness, and texture maps for realistic lighting.
phongMAT213A classic Phong-shaded material with diffuse, specular, and emission; its GLSL multi-texture expression parameter is withheld from this data-only surface.
pointspriteMAT55Renders points as camera-facing textured sprites.

DAT — data / tables / references (51)

ToolParametersDescription
artnetDAT9Receives Art-Net DMX universes into a table.
audiodevicesDAT10Lists the available audio input and output devices.
choptoDAT9Writes CHOP channels into a table of samples.
clipDAT13Holds clip metadata in table form.
convertDAT9Converts between table and text representations such as CSV, TSV, and free text.
dmxmapDAT13Defines a mapping of DMX channels to named slots.
errorDAT15Collects the errors and warnings reported by operators in the project.
etherdreamDAT8Controls an Ether Dream laser DAC.
evaluateDAT30Evaluates an expression for each cell of a table; its expression-carrying parameters are withheld from this data-only surface, leaving the non-code controls.
examineDAT21Inspects variables and objects for debugging; its expression parameter is withheld from this data-only surface.
fifoDAT11A first-in-first-out table that drops the oldest rows as new ones arrive.
fileinDAT9Reads text or a table from a file or URL.
fileoutDAT8Writes the contents of a DAT to a file.
folderDAT38Lists the files and folders of a directory as a table.
inDAT7The input tap of a DAT component.
infoDAT8Reports another operator's metadata and info as a table.
insertDAT13Inserts rows or columns into a table; its replace expression parameter is withheld from this data-only surface.
jsonDAT12Parses JSON and extracts values by path (the JSONPath filter is kept as data); its Python expression parameter is withheld from this data-only surface.
keyboardinDAT17Logs keyboard key events into a table.
mediafileinfoDAT10Reports metadata (codec, resolution, duration) about a media file.
mergeDAT10Merges tables or text from several inputs, by rows or columns.
midieventDAT21Logs incoming MIDI events as table rows.
midiinDAT22Logs incoming MIDI messages into a table.
monitorsDAT9Lists the connected display monitors and their properties.
mqttclientDAT21An MQTT client that publishes and subscribes to topics.
multitouchinDAT23Reports multi-touch contact events as a table.
ndiDAT8Lists the NDI video sources available on the network.
nullDAT5A pass-through tap for tables.
opfindDAT65Searches the network and lists operators matching name, type, or property criteria.
oscinDAT22Receives OSC messages as table rows.
oscoutDAT22Sends table rows out as OSC messages.
outDAT8The output tap of a DAT component.
parameterDAT45Exposes an operator's parameters as an editable table of names and values.
performDAT22Reports frame-by-frame performance data as a table.
poptoDAT23Writes POP attributes into a table.
renderpickDAT38Reports 3D pick results (hit geometry and position) as a table.
reorderDAT11Reorders the rows or columns of a table.
serialDAT20Reads and writes text to a serial device.
serialdevicesDAT9Lists the available serial ports.
socketioDAT15A Socket.IO client for real-time web messaging.
soptoDAT10Writes SOP attributes into a table.
tableDAT18A static, editable grid of cells; its cell and fill expression parameters are withheld from this data-only surface.
tcpipDAT19A TCP/IP client or server exchanging text messages.
textDAT10Holds free-form text, often used to store shader or script source referenced by other operators.
udpinDAT19Receives UDP datagrams as table rows.
videodevicesDAT10Lists the available video capture devices.
webclientDAT24Issues HTTP requests and captures the responses.
webrtcDAT14Handles WebRTC signaling and data-channel messaging.
webserverDAT15Hosts an HTTP and WebSocket server for external clients.
websocketDAT16A WebSocket client or server for bidirectional messaging.
xmlDAT23Parses XML or HTML into a navigable table.

POP — points / particles (GPU) (96)

ToolParametersDescription
accumulatePOP13Accumulates or integrates point attributes across frames.
alembicoutPOP28Writes point geometry out to an Alembic cache.
analyzePOP25Reduces point attributes to summary statistics.
attributePOP30Creates, edits, or removes point attributes.
attributecombinePOP12Combines matching attributes from multiple point inputs.
attributeconvertPOP11Converts an attribute's type or numeric precision.
blendPOP18Blends point attributes between inputs by weight.
boxPOP23Generates points arranged as a box.
cachePOP14Buffers frames of point data for replay.
cacheblendPOP14Blends between cached frames of point data.
cacheselectPOP9Selects a specific cached frame of point data.
choptoPOP24Creates points from CHOP channel data.
circlePOP22Generates points arranged on a circle.
connectivityPOP11Labels points by which connected component they belong to.
convertPOP6Converts point geometry between representations.
copyPOP46Copies points onto other points or with transforms, for instancing.
curvePOP36Generates a curve described by points.
dattoPOP47Builds points from the rows of a DAT.
deletePOP36Deletes points selected by group or condition.
dimensionPOP8Measures or sets the bounding dimensions of the point set.
dmxfixturePOP25Maps points to DMX lighting fixtures.
dmxoutPOP31Sends point data out as DMX.
extrudePOP17Extrudes point geometry to add depth.
facetPOP18Adjusts normals and faceting of point geometry.
feedbackPOP11Feeds point output back for recursive, frame-delayed processing.
fieldPOP47Creates or samples a spatial field over points.
fileinPOP12Loads points from a file.
fileoutPOP23Writes points to a file.
forceradialPOP34Applies a radial (attract/repel) force to points.
glslPOP62Runs a GLSL compute program over points, with the program source supplied through a referenced DAT.
glsladvancedPOP119A multi-buffer GLSL point operator for advanced compute workflows, sourced from referenced DATs.
glslcopyPOP57Uses a GLSL program to drive copying or instancing of points.
glslselectPOP7Selects points using a GLSL program.
gridPOP26Generates points arranged on a grid.
groupPOP42Groups points by condition or region.
histogramPOP14Computes a histogram of an attribute's values.
importselectPOP28Selects and imports a subset of point data.
inPOP7The input tap of a POP component.
limitPOP23Clamps point attributes to a range.
linePOP31Generates points arranged on a line.
linebreakPOP20Breaks polylines into separate segments.
linedividePOP34Divides polylines into more segments.
linemetricsPOP59Measures line length and related metrics per point.
lineresamplePOP18Resamples polylines into evenly spaced points.
linesmoothPOP30Smooths polylines to reduce sharp variation.
lookupattributePOP23Looks up attribute values using an index attribute.
lookupchannelPOP24Samples a CHOP channel per point as a lookup.
lookuptexturePOP28Samples a texture (TOP) per point to read colors or data into attributes.
mathPOP26Performs arithmetic and range remapping on point attributes.
mathcombinePOP52Combines attributes together with a math operation.
mathmixPOP25Mixes attributes by a blend factor.
mergePOP11Merges several point sets into one.
neighborPOP25Finds neighboring points within a radius or count.
noisePOP49Applies coherent noise to point positions or attributes.
normalPOP27Computes point normals.
normalizePOP22Normalizes vector attributes or rescales values to a range.
nullPOP5A pass-through tap for point chains.
outPOP8The output tap of a POP component.
particlePOP41A GPU particle simulation advancing points under forces and rules.
patternPOP35Generates a shaped pattern of values across points.
phaserPOP23Applies a phase-based offset that animates values across points.
planePOP19Generates points arranged on a plane.
pointPOP11Edits point positions and attributes directly.
pointfileinPOP33Loads a point-cloud file (such as PLY) into points, the entry point for scanned data.
pointgeneratorPOP26Generates a specified number of points to seed a system.
polygonizePOP22Builds polygonal surface geometry from points.
primitivePOP21Edits primitive-level attributes of point geometry.
projectionPOP22Projects points using a projection mapping.
proximityPOP21Computes proximity and nearest-neighbor relationships between points.
quantizePOP19Snaps point attributes to a grid or step size.
randomPOP36Assigns random values to point attributes.
rayPOP37Projects points onto a target surface along rays.
rectanglePOP23Generates points arranged as a rectangle.
rerangePOP19Remaps an attribute from one value range to another.
revolvePOP12Revolves a profile of points around an axis to form a surface.
selectPOP9References points from another POP by path.
skinPOP9Skins a surface across point curves.
skindeformPOP18Deforms points to follow a skeleton (skinning).
soptoPOP10Converts SOP geometry into points.
sortPOP27Sorts points by value, position, or attribute.
spherePOP33Generates points arranged on a sphere.
sprinklePOP16Scatters points across a surface or through a volume.
subdividePOP9Subdivides point geometry for higher resolution.
switchPOP14Selects one of several point inputs by index.
textPOP37Generates points describing text.
texturemapPOP32Assigns or computes texture coordinates for points.
topologyPOP61Builds or edits the connectivity/topology of point geometry.
toptoPOP45Creates points from a TOP, turning pixels into positioned points.
torusPOP24Generates points arranged on a torus.
tracePOP30Traces an image's shapes into points or curves.
trailPOP28Records the motion trails of points over time.
transformPOP48Translates, rotates, and scales points.
triangulatePOP16Triangulates points into a mesh (Delaunay-style).
trigPOP17Applies trigonometric functions to point attributes.
tubePOP24Generates points arranged as a tube.
twistPOP19Applies twist, bend, or taper deformations to points.

Utility tools — the data plane, drive layer, and control plane (35)

  • Read the scene: scene_info, read_network, find_errors, inspect, top_info, probe_optype, mem.
  • Build & wire: connect, set_par, set_par_many, set_flags, set_pos, delete_op, bind_chop, batch (runs many ops in one round-trip; grants no capability a direct call lacks, and cannot nest).
  • Import: import_scan, import_segmented_model (builds a whole per-section sec*/mat* rig from per-part OBJs in one call).
  • Deliver (wire-only): save_top (writes a TOP's image to the working directory), capture_ui, write_csv, pulse, show.
  • Look things up: td_capabilities (start-here index of the surface + boundary), help, operator_reference (any operator's full typed schema), recipe_reference (the workflow recipes).
  • Learn to write code: glsl_reference (GLSL shaders), expr_reference (parameter expressions), code_reference (which lane carries what + the consent handshake) — read-only teachers that propose code text for the validated lanes or paste-by-hand; they never run code.
  • Code lanes (default-off, consent-gated): set_glsl / validate_glsl, set_expr / validate_expr.
  • Device control (default-off, consent-gated): device_send — sends a command to a projector over the closed PJLink Class-1 allowlist; off unless a human explicitly enables allow_device_control.
  • Maintenance: dev_reload.

References

Several discoverability surfaces back the tool catalog. td_capabilities is the start-here index — call it first to orient on the surface, the boundary, and where to look things up.

  • Tool catalogdocs/TOOL_CATALOG.md, generated from reference/catalog.json (the authoritative count of every typed operation, across roughly 17,000 typed parameters in the operator families). This is the security boundary: if it isn't in the catalog, the server can't do it.
  • Operator reference — the operator_reference MCP tool answers "what parameters does operator X take?" from live-probed ground truth (name, kind, range/tokens per parameter).
  • help — an operator's facts (family, input count, parameter names) plus a deep link to the official Derivative documentation. No Derivative prose is bundled; shipped operator descriptions are original.
  • recipe_reference — the drive layer: 66 tool-mapped workflow recipes carrying ordered steps and conventions (see below).
  • Code teachers — read-only guides for TD's code surfaces: glsl_reference (GLSL shaders), expr_reference (parameter expressions), code_reference (which lane + the consent handshake). They propose code text for the validated lanes or paste-by-hand; they never run code.

Documentation


Projection-mapping recipes

recipe_reference classifies your task and returns one proven, tool-mapped way to build it — an ordered sequence of real tools, the parameters that actually move the result, a landmark OUT_ null to plant at each step, and the cheap read to verify it. TouchDesigner offers many valid approaches, so a recipe is a worked example to adapt, never gospel. The 66 recipes span these domains:

  • 3D render lane (facade_3d_render) — a building .obj/.abc/.fbx/.usd into a Geometry COMP, framed by a camera, shaded with a MAT, rendered to a Render TOP over a dark plate.
  • Generative texture FX (generative_texture_fx) — the bread-and-butter façade content lane: noise → ramp → tone → transform → composite → feedback trail, a pure evolving TOP network.
  • Point-cloud content (point_cloud_content) — ingest a finished drone/photogrammetry scan (position data in a TOP) and instance sprites or meshes onto the points.
  • Camera / framing (camera_match_facade) — match the virtual camera to the real façade (orthographic flat map or perspective lens-match).
  • Per-section rig & choreography (per_section_material_rig, height_sweep_choreography, per_section_color_choreography, facade_cue_choreography) — one material per architectural section, driven data-only via CHOP-export (a travelling light sweep, per-section color, or a cued show) — no expressions, no code.
  • Video mapping (segmented_facade_video_projection, segmented_facade_video_content, facade_mask_atlas) — drive actual video onto each UV-registered section via emitmap, with a grayscale mask keeping windows black.
  • Freeform / mesh warp (mesh_freeform_warp) — the data-only analog of a mesh-warp mapper: a remapTOP UV field with a control-grid offset bends content onto a curved surface.
  • Projector mapping & alignment (projector_calibrated_3d, projection_align_and_output, multiprojector_edge_blend) — a calibrated projector frustum, a 4-corner keystone, and an edge-blended seam across overlapping projectors.
  • Show control & DMX (realtime_input_driver, show_control_timecode, dmx_artnet_output) — a live OSC/audio/DMX/MIDI input driving the façade, a timer/timecode transport running the cue show, and DMX / Art-Net / sACN output for lights and fixtures.
  • Output / hand-off (output_handoff) — expose the finished content to a media server (Pixera / disguise) or bake a HAP 4K file — wire-only, with record/active left off for the operator to fire.
  • 2D multi-surface mapping (multi_quad_mapper) — the data-only kantanMapper: N sources, each on its own corner-warped quad, composited over black — map a different video onto every window / flat / sign face.
  • Projector calibration intake (camera_calibration_intake) — build the target Camera COMP + render rig so on-site camSchnappr / OpenCV / survey calibration (pose + projection matrix) plugs straight back in.
  • Multi-projector depth (multiprojector_blacklevel_mask, projector_stack_converge) — black-level uplift so the blend seam vanishes on dark content, and projector stacking/convergence for brightness & redundancy (distinct from edge-blend).
  • Spill / garbage masking (output_spill_garbage_mask) — screen-space holdout that clips content to the surface silhouette (keep light off the ground / sky / neighbors) plus a soft projector-frame feather.
  • Test patterns & rig-and-focus (test_pattern_generator) — data-only alignment grids, crosshairs, color bars, focus/1:1-pixel fields, per-projector labels, convergence & overlap markers at native resolution.
  • Media playback & compositing (media_clip_player, layer_compositor) — robust 4K clip playback + gapless playlist, and a media-server-style layer stack (per-layer opacity/blend/transform) with transitions.
  • Live feed & direct output (live_media_server_feed, direct_projector_output) — live Spout / NDI / Touch / RenderStream handoff, and a direct-to-projector perform-window / Direct-Display front-of-house lane.
  • Immersive / dome / curved (dome_fisheye_master, curved_screen_warp_blend) — fisheye/equirect dome and 360 masters (cubemap reprojection) and a cylindrical warp + blend for a single wide curved screen.
  • Interactive content (vision_interactive_mask, audio_reactive_content) — a live camera driving a presence/motion mask, and generative visuals built from the music (FFT / band energy / onset) — data-only.
  • Text & titling (text_title_content) — data-only typography: show titles, lower-thirds, rolling credits, and a code-free live countdown/clock via a timerCHOP → choptoDAT → textTOP bridge (no expressions).
  • Particles & kinetic 3D (particle_system_content, instanced_kinetic_content) — a live GPU POP particle system (embers / sparks / snow / flow) and animated instance arrays / kinetic motion-graphics scenes.
  • Seamless loops (seamless_loop_authoring) — bake a seam-free generative loop (periodic-phase or head/tail crossfade), wire-only to a movie file.
  • Tracked / moving surface (tracked_surface_content) — project onto a moving prop or performer: a tracking CHOP (BlackTrax / PosiStageNet / OptiTrack) drives a digital-twin transform code-free.
  • LED wall / pixel-map (led_wall_pixelmap_feed) — carve a canvas into per-panel tiles at the exact total resolution a Novastar / Brompton / Linsn LED processor ingests.
  • Immersive room (immersive_room_mapping) — a fully enclosing multi-wall + floor/ceiling room, one calibrated camera per surface fanned from a shared 3D scene (floor / forced-perspective anamorphic mode).
  • Sheer surfaces (sheer_surface_mapping) — scrim / gauze / HoloGauze / fog / water-screen content prep with mandatory black-crush, a rear-projection mirror, and an actor-safe holdout.
  • Signal ingest (signal_ingest_remap) — capture a live SDI / HDMI / NDI / ST-2110 / Syphon-Spout source and remap it onto surfaces — the ingest twin of the output lanes.
  • Colour delivery & uniformity (color_grade_lut_delivery, projector_color_uniformity) — a LUT / OCIO delivery-colour pipeline, and white-point / gamma matching across a multi-projector array.
  • Multi-zone output (multizone_independent_outputs) — N independent output zones, each with its own content, resolution, and destination (distinct from one spanning edge-blended window).
  • Show automation & safety (scheduled_playback_dayparting, timecode_chase_slave, emergency_blackout_and_standby, confidence_monitor_foldback) — unattended time-of-day dayparting, chasing external LTC/SMPTE timecode, instant DBO / standby, and operator confidence / foldback taps.
  • Live-event graphics (corporate_stage_graphics) — an IMAG + lower-thirds + holding-slide + countdown package for a conference / keynote stage.
  • Operator control & show-ops (operator_control_panel, show_health_watchdog) — build the operator's own on-screen/TouchOSC control surface, and a system-health watchdog (fps / dropped-frames / GPU-temp) with an alarm overlay.
  • Naked-eye-3D corner LED (anamorphic_corner_led_3d) — forced-perspective 3D across a 90° corner LED wall via a single off-axis hero camera, split to the two faces.
  • Lidar & contour (lidar_presence_interaction, line_contour_mapping) — interactive floor/wall from a 2D laser scanner, and animated edge/outline light-lines tracing a building's real architecture.
  • Show audio (show_audio_playback) — soundtrack playback + multichannel/spatial speaker routing + A/V timecode lock (the audio-OUT lane; every other audio recipe is input-only).
  • Broadcast & IoT (st2110_ip_video_out, mqtt_iot_input) — SMPTE ST 2110 video-over-IP delivery (PTP), and MQTT / building-automation triggers extending the input-driver family.
  • Content pipeline (projector_plan_tables, uv_template_export, structured_light_calibration_patterns, notch_block_playback) — throw/lens planning sheets, a UV registration template for content artists, gray-code / phase-shift capture patterns, and a Notch .dfx block-playback scaffold.

TouchDesigner's job is content creation; the physical warp/blend onto the real surface is done downstream by the media server. See ARCHITECTURE.md for how the recipe layer is wired.


Gotchas

A few TouchDesigner-specific traps the recipes encode:

  • Create tools take tuplet vectors; set_par takes raw components. A create tool exposes color:[r,g,b] and resolution tuplets; passing raw component names (colorr) or a pars{} wrapper to a create tool silently drops them. Use set_par for raw colorr/tx.
  • A fresh geometryCOMP ships a default torus child carrying the render/display flags. Delete it (with delete_op) and turn on the render flag of your imported fileinSOP, or both compete to be rendered.
  • The Render TOP references camera / geometry / lights by parameter, not by wiring them into its inputs. Its output is transparent — composite it over a dark constantTOP for a readable beauty pass.
  • The 256/1280 resolution trap is real. Generators (noiseTOP, rampTOP) inherit a small default; set outputresolution=custom + resolutionw/h for 4K delivery. Non-commercial builds cap output at 1280.
  • CHOP-export drives a parameter only with the exporter's viewer active and a forced cook — the Export flag alone does nothing. bind_chop handles this; a manual export still needs it.
  • import_segmented_model forces the File In SOP to CONSTANT mode so the real OBJ loads, not TouchDesigner's default sample box; models must live under the working directory.

Configuration

Most configuration happens in the GUI and is written to ~/.touchdesigner-bridge-mcp/arm.json, the single file both processes read fresh per call. Only the MCP client config needs environment variables.

SettingWhereDescription
TDMCP_GW_HEADLESSenv (client config)1 = run the binary as the headless stdio MCP gateway; unset = open the GUI window.
TDMCP_REPOenv (client config)The clone path, so the gateway resolves its bundled reference/ data deterministically.
working_dirGUI → Working dir → ApplyThe confinement root. Every file read/write is realpath-confined under it. Read fresh per call by both layers; Apply takes effect live, no restart.
token / portarm.json (minted on arm)The CSPRNG session token and loopback port (default 9980). You never type or see the token.
allow_expr / allow_glslGUI consent toggle → arm.jsonConsent flags for the two code lanes (default off).
allow_highresarm.jsonBypass the enforced render magnitude ceiling (default off).
min_action_interval_msarm.jsonThe destructive-call throttle.

A bare re-arm preserves the consent flags and working directory — it never silently resets the jail or flips a lane.


Security

The security model is the boundary itself, not a sandbox. Full threat model, honest limits, and disclosure contact in SECURITY.md.

  • Data-only by construction. No execute_python / eval / run / shell tool exists. A runtime canary (assert_no_rce_endpoints), a runtime optype guard (check_optype_allowed, which denies script / execute / cplusplus operators and evaluateDAT), and a build-time fence (catalog_never_exposes_rce_tools) enforce it.
  • Layered parameter guard. Because the typed surface lowers to a generic set_par, the real boundary is the executor's check_par_allowed over TouchDesigner's ~17,000-parameter surface: a universal deny of code-pointer parameter names (callbacks / *script / datexpr), a reviewed inline code-sink denylist with Sequence-block-index regex generalization, and a fail-closed allowlist so unknown or newer parameters are refused instead of waved through. This is a denylist over a closed-source third-party surface: an independent red-team review found no working RCE bypass, but it is a residual, not a proven- complete boundary — stated plainly in SECURITY.md.
  • Loopback + auto-minted token. The Web Server DAT binds 127.0.0.1 only; arming mints a 128-bit CSPRNG token presented as X-TDMCP-Token and compared with secrets.compare_digest. Cross-origin (non-loopback Origin/Host) requests are refused on every endpoint, closing the loopback-CSRF / DNS-rebind class. Body caps guard against memory-DoS.
  • realpath-confined working directory. Every file operation resolves and re-checks against one root, with symlink/junction escapes closed. The config dir (token + consent) and the executor trust root (td_executor/*.py, INTEGRITY.json, arm.py) are off-limits even inside the working dir, and write tools enforce extension whitelists.
  • Integrity pinning. INTEGRITY.json hash-pins every executor .py; arming and dev_reload verify before import and fail closed on any mismatch or unpinned handler. Honest ceiling: this is tamper-evidence, not a boundary against an attacker who can already write the install directory — OS file permissions are the root of trust.
  • Output is wire-only. Record/live-send graphs are built with record/active off; you fire them.
  • The two validated code lanes are default-off and consent-gated. glsl_v1 (set_glsl/validate_glsl, GPU-sandboxed — worst case a recoverable driver timeout) and expr_v1 (set_expr/validate_expr, an AST positive-allowlist, shipped EXPERIMENTAL because a validator gap here would be host code). Both validate before write, are executor-authoritative, audited, and single-write-path. The AI cannot flip its own consent — the /mcp_bridge component and its GUI toggles are refused by assert_writable on every mutating tool, and the flags live in the off-limits config dir.
  • Enforced magnitude ceiling. The advisory governor is advisory-first, but a hard ceiling refuses catastrophic, driver-killing magnitudes (per-dimension resolution > 16384 px, instance/particle counts

    5,000,000, render passes > 256), overridable only by the human-gated allow_highres flag — so legitimate 4K/8K delivery passes but a runaway set_par cannot hang the display driver.

  • Intended posture: loopback, single trusted user, trusted machine. The transport is meant to stay on the local host. Treat the AI as semi-trusted input.

Read SECURITY.md before running this anywhere other than a single trusted machine.


Troubleshooting

Full table in docs/INSTALL.md. Quick checklist:

  • The GUI Status pane reads Armed with your TouchDesigner build, and http://127.0.0.1:9980/health responds.
  • The MCP client config points at the built touchdesigner-bridge-mcp.exe with TDMCP_GW_HEADLESS set to 1 (without it, the binary launches its GUI and the handshake never completes).
  • TDMCP_REPO points at the clone (the folder containing reference/recipes.json), or reference/recipe lookups fail.
  • The client was fully restarted after editing its config.
  • File paths you pass to tools live inside the configured working directory.
  • If arming reports "integrity pre-check FAILED, refusing to arm", an executor file changed without regenerating the manifest — run python scripts/gen_integrity_manifest.py.
  • If an Expr/GLSL-lane call is rejected, those lanes are off by default — flip the consent toggle on /mcp_bridge (it persists to arm.json).

License

This project is dual-licensed:

The bridge bundles no third-party binaries or data — the executor uses only the Python standard library and TouchDesigner's own built-in td module, and shipped operator descriptions are original.


Support

If this saved you time and you're using it noncommercially, a tip is always appreciated — ko-fi.com/eviscerations. It's voluntary and grants no license; commercial use is covered by COMMERCIAL-LICENSE.md.


Development & tests

The executor tests need no TouchDesigner license — they run against a fake TD scene (td_executor/tests/_tdmock.py) — so the security invariants are provable on any machine. Run all four checks before opening a change:

# 1. Executor unit tests — offline, no TouchDesigner required.
python td_executor/tests/run_tests.py

# 2. Gateway tests — includes the build-time boundary fences (catalog_never_exposes_rce_tools,
#    code_named_params_are_the_known_reviewed_set, reserved placement args, unique names).
cargo test --manifest-path gateway/Cargo.toml

# 3. Registry consistency — the gateway catalog and the executor endpoint set agree.
python scripts/audit_registry_consistency.py

# 4. Recipe validation — every recipe maps to real, shipped tools.
python scripts/validate_recipes.py

After any executor edit, regenerate the integrity manifest or the next arm/reload fails closed:

python scripts/gen_integrity_manifest.py            # write/refresh the manifest
python scripts/gen_integrity_manifest.py --check    # CI mode: nonzero if stale

See CONTRIBUTING.md for the full build / test / arm loop and the reload lifecycles.


Contributing

Pull requests welcome — see CONTRIBUTING.md. This project is a data-only control surface, and that boundary is the point of the whole design, so the most important rule for any change is: do not add a path that lets the AI run arbitrary code. Read SECURITY.md and ARCHITECTURE.md before making non-trivial changes, and note any security-posture change in CHANGELOG.md.