tdmcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| TDMCP_BRIDGE_TOKEN | No | Optional token to authenticate bridge requests. | |
| TDMCP_BRIDGE_ALLOW_EXEC | No | Set to '0' to disable exec endpoints for security. |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
| completions | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_td_infoA | Read-only health check + TouchDesigner server info. Returns {connected, endpoint, touchdesigner version info, knowledge-base stats, bridge_stale?} and changes nothing. Use this first to confirm the bridge is reachable; it succeeds even when TD is offline, reporting connected:false with the reason. Also warns when the running Python bridge is older than this build (a common gotcha — editing td/ doesn't reload the running bridge), pointing you at reload_bridge. |
| create_td_nodeA | Create a single bare operator (node) inside a parent COMP — nothing is wired or laid out. Validates the operator type against the knowledge base and warns (without blocking) on unknown types. Returns {node, warnings[]} for the created node. This is the atomic primitive: for a complete wired+arranged network prefer the higher-level Layer-1 create_* tools (e.g. create_audio_reactive, create_feedback_network). |
| delete_td_nodeA | DESTRUCTIVE by default: permanently remove one node from the project by path (a COMP also takes its children with it); this cannot be undone via the API. Prefer mode:'bypass' when you only want to disable a node — it turns the bypass flag on (reversible) instead of destroying it. Returns {deleted|bypassed, mode}. Only call delete mode when the user explicitly asks to remove a node. |
| update_td_node_parametersA | Modify an existing node by setting one or more of its parameters to constant values. The update is strict (not best-effort): an unknown parameter name fails the whole call atomically without changing anything, and a bad value (wrong type or out of range) returns an error naming which parameters applied and which failed. On success returns the updated {node}. To inspect valid parameter names/current values first use get_td_node_parameters; to make a parameter move over time use animate_parameter instead of a static value. |
| get_td_nodesA | Read-only: list the DIRECT child nodes of one COMP. Defaults to a compact summary (count + type breakdown + sample paths); pass detail_level:"full" or path_only:true for the complete list, and |
| get_td_node_parametersA | Read-only: read the current parameters (and inputs/outputs) of one node. Returns {path, type, name, parameters, inputs, outputs}. Pass |
| read_parameter_modesA | Read-only: for each parameter of a node, report its mode (CONSTANT / EXPRESSION / EXPORT / BIND), its evaluated value, and its raw expression / bind-expression / export-source strings. Use this to faithfully serialize a network for round-trip editing, diffing, or debugging — the evaluated value alone hides which parameters are driven by expressions or exports. Set |
| get_td_node_errorsA | Read-only: check one node (or, with recursive:true, its whole sub-network) for cook/compile errors and warnings. Pass |
| execute_python_scriptA | Escape hatch — run an arbitrary Python script inside the TouchDesigner process. Prefer the structured tools (find_td_nodes, get_td_node_parameters, update_td_node_parameters, summarize_td_errors, snapshot_td_graph, …); reach for this only when no structured tool can express the operation. Code runs in TD only, never on the local machine. |
| exec_node_methodA | Escape hatch — invoke an arbitrary Python method on a node (operator). Prefer structured tools where one exists; use this for operations they don't cover (e.g. .cook(), .copy(), .destroy()). |
| get_td_classesA | Read-only: list TouchDesigner Python API class names from the embedded knowledge base (works offline, never touches TD). Returns {classes[]} of name/displayName entries. Optionally filter by name. Use get_td_class_details or get_module_help to expand one class into its members and methods. |
| get_td_class_detailsA | Read-only: full STRUCTURED documentation for one TouchDesigner Python class (members + methods) from the embedded knowledge base (offline). Returns the class object, or {found:false, suggestions[]} of near-name matches if unknown. Use get_module_help instead when you want the same content as ready-to-read Markdown rather than structured JSON. |
| get_module_helpA | Read-only: human-readable Markdown help (description, members, method signatures) for a TouchDesigner Python class or module, from the embedded knowledge base (offline). Returns formatted text, or {found:false, suggestions[]} of near-name matches if unknown. Use get_td_class_details instead when you need the same information as structured JSON to process in code. |
| get_td_performanceA | Read-only: report cook times under a network (recursively by default, slowest node first) and warn about nodes that exceed the frame budget. Returns {targetFps, frameBudgetMs, totalCookMs, nodes[], warnings[]} and changes nothing. Use this to just measure; use optimize_performance when you want suggestions and the option to auto-shrink the slow TOPs. |
| get_td_topologyA | Read-only: return the nodes AND the connections (wiring) under a network root, flagging obvious structural issues. Returns {nodeCount, connectionCount, issues[], topology}. Use this when you need how nodes are wired together; use get_td_nodes/find_td_nodes when you only need the node list without connections, or snapshot_td_graph when you also want each node's parameters captured for diffing. Token economy: point it at a specific network root rather than the project root, and leave recursion off unless you need nested networks. |
| find_td_nodesA | Read-only: search a network for nodes by name pattern and/or operator type, recursively by default. Returns {count, truncated, matches/paths}. Prefer this over get_td_nodes when you are looking for specific nodes anywhere in a sub-tree (get_td_nodes only lists one COMP's direct children); use get_td_topology when you also need the wiring between them. |
| summarize_td_errorsA | Read-only: collect errors across a network and cluster them by message, type, or parent container, with the worst-offending nodes and a suggested order to investigate. Returns {total, groups[], suggestions[]}. Use this for network-wide triage instead of reading every node's errors one by one; use get_td_node_errors when you just want the raw error list for one node or sub-tree. |
| compare_td_nodesA | Read-only: diff the parameters of two nodes, returning only the values that differ (by default). Returns {type_match, differing_count, differing[], same_count}. Useful for aligning settings across similar operators; compares two live nodes, whereas diff_snapshots compares two whole-network snapshots over time. |
| snapshot_td_graphA | Read-only: capture a compact, serializable snapshot of a network — nodes, connections, structural issues, and optionally each node's parameters — for review, diffing, or documentation. Returns {nodeCount, connectionCount, issues[], nodes[], connections[]}. Set |
| reload_bridgeA | Hot-reload the bridge's Python inside the running TouchDesigner, so edits to the td/ modules take effect without reopening the project. Reimports every loaded mcp./utils. module in place and returns the list reloaded. Use after editing bridge code. |
| search_operatorsA | Search the embedded operator knowledge base (629 operators) by keyword, exact name, tag/keyword, category, subcategory, parameter metadata, or TouchDesigner version compatibility — ranked by relevance, fully offline by default. 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, summary, facets and optional matching parameters. Pass semantic:true to re-rank fuzzy candidates by embedding similarity (needs an LLM endpoint; falls back to keyword). With parameter_search, matched Menu parameters include their menu options; results are stamped with a data_version (which TouchDesigner build the offline catalog reflects) and a stale_hint when the connected TD is on a different major. Token economy: use a specific query and a small |
| compare_operator_docsA | Read-only: compare two TouchDesigner operator types from the embedded offline knowledge base, including overview metadata plus shared and unique documented parameters. This compares operator documentation, not live node settings; use compare_td_nodes for live node parameter diffs. |
| get_operator_workflow_guideA | Read-only: return an embedded TouchDesigner operator workflow guide with common inputs, outputs, examples, and next-operator suggestions. For unknown operators, returns candidate guide ids instead of failing. |
| suggest_operator_chainA | Read-only: suggest a small ordered TouchDesigner operator chain for a creative or technical goal from offline operator docs and workflow patterns. Returns connection hints and next tool hints; it does not create nodes. |
| validate_operator_chainA | Read-only: validate an ordered TouchDesigner operator chain against embedded operator docs, documented connections, family/category filters, and optional TouchDesigner version compatibility. It does not create or modify TD nodes. |
| draft_recipe_from_operator_chainA | Read-only: convert an ordered TouchDesigner operator chain into a RecipeSchema draft without writing files or touching the TD bridge. |
| get_technique_detailA | Read-only: inspect embedded TouchDesigner technique packs and individual techniques, with optional code snippets and setup/workflow details. |
| draft_recipe_from_techniqueA | Read-only: convert an embedded TouchDesigner technique with GLSL source into a RecipeSchema draft without writing files or touching the TD bridge. |
| draft_recipe_from_tutorialA | Read-only: extract a conservative operator chain from an embedded TouchDesigner tutorial and draft a RecipeSchema JSON without writing files or touching the TD bridge. |
| get_tutorialA | Read-only: list embedded TouchDesigner tutorials, search tutorial metadata/content, or retrieve one by id/name. With include_content, the content is capped (~30K chars) and comes with a sections_available list; pass a |
| search_python_apiA | Read-only: search TouchDesigner Python API classes, methods and members from the embedded offline knowledge base. Supports class category filters and conservative stable-version compatibility filtering where compatibility metadata exists. |
| plan_td_version_migrationA | Read-only: plan a TouchDesigner stable-version migration from offline release highlights plus operator and Python API compatibility records. Returns upgrade boundaries, focused compatibility deltas, and an operator checklist without touching TouchDesigner. |
| search_touchdesigner_knowledgeA | Read-only: search the embedded TouchDesigner knowledge router across operators, operator workflows, examples, versions, compatibility notes, technique packs, TD classes, and experimental build notes. Returns normalized results with resource URIs and tool hints for deeper lookups. |
| manage_packagesA | Search, list, inspect, doctor, dry-run install, stage, and uninstall manifest-driven TouchDesigner community packages. Dry-run is the default. Installs stage packages under ~/.tdmcp/packages and only import into TouchDesigner when the bridge is reachable and the package has a safe .tox import path. This tool never runs third-party scripts, pip installs, model downloads, or external app setup. |
| document_networkA | Document an EXISTING network: read its nodes and connections and return a readable map — counts by operator family and type, plus a Mermaid flowchart of the data flow you can paste into docs. Unlike plan_visual (which plans from a description), this describes what's actually in the project. Use it to explain or hand off a patch. |
| diff_snapshotsA | Compare two network snapshots (from snapshot_td_graph) and return a readable diff: which nodes were added or removed, which connections changed, and which parameters changed (with before/after values). Snapshot before an edit and after to see exactly what changed, or to version a patch over time. Pure analysis — touches nothing in TouchDesigner. |
| optimize_performanceA | Scan a network for cook-time bottlenecks and (optionally) fix them. By default it reports the slowest nodes with a concrete suggestion each. With apply:true it lowers the resolution of the flagged TOPs by |
| render_outputA | Save a TOP to an image file at its native, full resolution (PNG/JPG/EXR/TIFF by extension) — for exporting a finished frame, unlike get_preview which only transfers a small inline thumbnail. The file is written by TouchDesigner on the TD machine; pass an absolute path. |
| record_movieA | Record a TOP to a movie file (.mov/.mp4) via a Movie File Out TOP — for exporting a clip or a loop, where render_output only saves a single frame. start begins recording (pass file, fps); pass |
| check_operator_availabilityA | Reconcile the operator knowledge base against the RUNNING TouchDesigner's ground-truth creatable-optype list (GET /api/optypes). Flags which documented operators are actually creatable in this build vs deprecated/unavailable, and (optionally) which live optypes the knowledge base doesn't yet document. Pass a single operator name to check just that one. Survives TDMCP_BRIDGE_ALLOW_EXEC=0. |
| analyze_projectA | Diagnose a network for cleanup: report likely-dead operators (zero wired outputs, unreferenced, not displayed), broken external-file dependencies (file parameters pointing at missing files), orphan COMPs, and a dependency map of which operators reference which. Read-only and conservative — every flagged item carries a human-readable reason. Complements plan_visual (which plans a build) and snapshot_td_graph (which dumps structure). |
| generate_readmeA | Produce a Markdown project document for any COMP or project: family/type counts, custom-parameter table, inputs/outputs, child inventory, external file dependencies, and an optional preview thumbnail of the output TOP. Use |
| edit_dat_contentA | Surgically replace a substring inside a Text or Table DAT's |
| set_dat_contentA | Overwrite a Text or Table DAT's entire |
| set_parameter_expressionA | Set one or more parameters on a node to an expression, bind expression, or constant value without needing the raw-Python escape hatch. Supports five modes: 'expression' (par.expr = ...), 'bind' (par.bindExpr = ...), 'constant' (par.val = ...), 'reset' (restore the parameter default via par.reset()), and 'unbind' (freeze the current evaluated value as a constant, dropping the driver). Multiple assignments are applied fail-forward — per-item failures accumulate as warnings so a partial batch still returns useful results. Batches using reset/unbind run through the exec path and require TDMCP_BRIDGE_ALLOW_EXEC=1. Use this instead of execute_python_script when TDMCP_RAW_PYTHON is off. |
| write_agent_guideA | Emit a project-local CLAUDE.md / AGENTS.md seeded with tdmcp operator conventions and TouchDesigner render-coordinate rules, so a future agent working on this project starts with the right mental model. A small dynamic header (project name, node count, top families) is prepended to a curated static body. Pass |
| disconnect_nodesA | Remove one or more input wires from a node in TouchDesigner. By default removes every incoming wire into to_path; narrow the scope with from_path (only wires from that upstream node) and/or to_input (only that input slot index). Returns the list of removed wires (input index + upstream node path), a probe of the Connector API attributes seen at runtime, and any per-wire warnings. Fatal only when to_path is not found — partial removals with per-wire warnings still succeed. The inverse of connect_nodes. |
| get_td_node_flagsA | Read-only: report each node's operator flags (bypass / render / display / lock / allowCooking / clone) plus index-aware input wiring, network position, color and comment — the signals that explain a black/blank output that a parameter dump hides. Scan one node or a subtree (recursive); set only_problems to surface just the ops whose flags or cook errors would suppress output. Returns structuredContent for code to process. |
| get_node_state_runtimeA | Read-only: inspect a single operator's runtime telemetry — cook time, cook count, last-cook frame, resolution (TOPs), channel/sample counts (CHOPs), GPU memory usage, cook errors, and optional Info CHOP channels via include_info_chop. Complements get_td_performance (which aggregates cook times across a network) by providing deep per-op detail for the 'why is it black / why is it slow' diagnostic loop. Returns {path, type, family, cook_time_ms, cook_count, last_cook_frame, resolution, num_chans, num_samples, gpu_memory, info_chop?, errors[], warnings[], extra}. Attribute names are flagged UNVERIFIED and vary by TD build; the |
| watch_nodeA | Read-only: sample one TouchDesigner operator over a short interval and return runtime state, readable parameter values, and CHOP channel values when available. Missing TD attributes/channels are reported as warnings instead of failing the watch. Returns {path, requested_samples, collected_samples, interval_ms, window_ms, warnings[], snapshots[]} where each snapshot has {sample_index, elapsed_ms, path, type, family, state, parameters, channels, warnings}. |
| watch_parameter_changesA | Opt-in: subscribe to |
| get_bridge_logsA | Read-only: collect recent cook errors and warnings from the running TouchDesigner project for debugging. Walks the operator tree under |
| inspect_op_extensions_storageA | Read-only: inspect what a COMP exposes — its Python storage dict (keys + values), its extension class descriptors (name, promoted flag, public members), and its custom-parameter definitions (page/name/style/default). Closes the inspect side of the reusable-component loop: use after |
| serialize_networkA | Read-only: serialize a COMP's immediate children into a git-diffable JSON spec — each node's name, op type, parameters (with mode + expression, not just the evaluated value), input wires by source node name, and position — plus best-effort custom-parameter definitions. This is the serialize half of a round-trip pair: feed the output spec to rebuild_network to reconstruct the subtree. Use it to snapshot a network as text you can diff across edits or commit to version control. Returns {root, nodes[], truncated?, warnings[]}. |
| bundle_dependenciesA | Make a COMP self-contained: recursively scan its subtree for external file references (movie/image files, fonts, LUTs, externaltox links — reusing the collect_project_assets scan), COPY each existing asset into /assets/, rewrite each referencing parameter in the LIVE network to the copied relative path (assets/), then save the COMP as a .tox beside its assets with a tdmcp-component manifest. The result is a folder you can move to another machine and open without broken links. Delta vs make_portable_tox (which saves the .tox only, leaving external assets behind) and collect_project_assets (which only reports refs). Rewriting mutates the live network — set rewrite_refs=false to copy-and-report without touching parameters. |
| collect_project_assetsA | Scan a COMP subtree for every external file dependency (movie/image file pars, fonts, LUTs, externaltox links) and report each referenced file, the node+parameter that references it, and whether the file currently exists on disk. The TouchDesigner scan is read-only and copies/rewrites nothing in the network; when out_manifest is set, this tool writes that local JSON path and may overwrite an existing manifest. File-par detection uses par.style ('File'/'Folder') when readable, falling back to a suffix/exact name heuristic (file, fontfile, lut, externaltox, moviefile, imagefile) — both UNVERIFIED across TD builds; |
| project_documentation_siteA | Compose a one-folder handoff/portfolio documentation PACKAGE for a network: a README.md (title, node count, per-family summary, how-to-load note), a topology.md with a Mermaid graph of the connections, and - when include_thumbnails is set - preview PNGs of output TOPs under thumbs/ linked from gallery.md, all written into out_dir. Unlike generate_readme (a single file), this assembles a small multi-file site folder for sharing or archiving a project. |
| caption_topA | Read-only: render a TOP's preview and return a plain-text description of it — the headless 'is the output alive?' primitive. Two paths: (a) a configured vision LLM endpoint when available, (b) a DETERMINISTIC luma/colour-histogram fallback decoded from the preview PNG pixels (always works, no model needed). Reports dominant colours, mean luma, near-black fraction, a coarse classification ('black'/'very dark'/'dark'/'bright'/'colorful'/'mid'), and a friendly caption. Returns {node_path, width, height, source:'vision'|'histogram', caption, stats{...}, warnings}. Use it after a build to confirm the network is actually rendering instead of a black frame. The vision path is currently inert (no vision field on the tool context) and falls back to the histogram. |
| repair_networkA | Bounded, autonomous repair: scan cook errors under a subtree, classify each, and plan a safe fix, capped at max_steps so it can never run away. Defaults to dry_run (PLAN only, no changes). Set dry_run:false to apply the known-safe fixes — resetting a broken parameter expression to constant mode, and re-enabling a bypassed/display-off op — within the same bound; risky cases (DAT syntax errors, missing inputs, unclassified errors) are always PLAN-only. Re-checks errors after applying and stops at the bound or when errors clear. Returns {parent_path, dry_run, max_steps, errors_before, errors_after, steps[], remaining[], warnings, rolled_back}. Use it as the diagnostic 'try the obvious safe fixes' loop after a build; for raw triage use summarize_td_errors / get_td_node_errors instead. |
| lint_recipe_libraryA | Offline semantic linter for recipes/*.json. Checks schema, id/filename match, duplicate node names, unknown operator types, dangling connections, bad parents, render-outside-geometryCOMP, missing parameter nodes, unresolved control bind_to, GLSL uniforms on non-GLSL hosts, and hygiene (tags/description/preview_description). Returns a structured report; never calls TouchDesigner. |
| score_buildA | Read-only: score a built network 0–100 on a fixed rubric (palette/motion/complexity/errors/perf) and return per-criterion sub-scores plus deterministic improvement suggestions. Optional LLM critique when llmCritique=true and ctx.llm is configured. Composes existing bridge endpoints — creates nothing. |
| profile_cook_costA | Read-only: sample cook times over a window (N samples × intervalMs) and rank hotspot nodes by p95 cook time. Use this to diagnose intermittent stalls that a single get_td_performance snapshot misses. Returns {path, samples, intervalMs, targetFps, frameBudgetMs, windowMs, hotspots[], warnings[]}. |
| control_timeline_transportA | Drive the TouchDesigner project timeline: play, pause, seek to a frame, jump to a named cue, or set playback rate. Returns the timeline state after the action so a copilot can verify the change took effect. NOTE: pausing will freeze any downstream motion/feedback/frame-diff chain — expected behaviour, not a bug. |
| inspect_gpu_and_displaysA | Read-only: returns the host GPU info (name, driver, VRAM), attached monitor topology (resolution, refresh rate, primary flag, position), and whether the project is in Perform Mode. Use to plan output mapping, dome rigs, and multi-display shows without leaving the chat. Offline-safe — returns { connected: false, reason } when TD is unreachable. |
| diagnose_hardware_environmentA | Read-only: check whether TouchDesigner is reachable, whether display/projector topology matches expectations, and whether generated sensor/helper status DATs such as source_status or bridge_status are healthy. This is a room/hardware preflight for physical installations; it returns PASS/WARNING/FAIL/UNVERIFIED checks without mutating the TD project. |
| manage_component_storageA | CRUD operations on a COMP operator's .storage dictionary. Actions: list (all keys+values), get (one key), set (write a key), delete (remove a key). No operators are created; the target COMP must already exist. |
| elicit_missing_argsA | Use the schema + LLM to propose values for a tool call's missing required args. |
| extract_paletteA | Sample dominant colors from a TOP by capturing its preview PNG and running deterministic k-means on the decoded RGB pixels. Returns |
| export_sop_to_svgA | Walk a SOP's primitives via the bridge and emit an SVG document of polylines (each primitive becomes one |
| swap_operatorA | Change an operator's TYPE while preserving its name, position, incoming + outgoing wires, and any parameters that exist on the new type. Snapshots wires + params, deletes the old node, creates a new node of |
| copilot_visionA | Capture a TOP as a preview image and ask the configured multimodal LLM a question about it. Returns |
| get_inline_previewA | Read-only one-shot inspection of a TOP: small base64 thumbnail (default 256² JPEG) + parent error sweep (BFS up |
| compact_graph_digestA | Read-only: compress a TD subtree into a structured digest under max_tokens (default 500). Returns {header, nodeCount, connectionCount, primaryOutput, families{count,topTypes}, outputChain, errors{total,topGroups}, warnings, approxTokens}. Uses getNetworkTopology + getNetworkErrors — no new bridge work. Cheaper than get_td_topology / snapshot_td_graph for planning turns. |
| get_dat_contentA | Read a Text or Table DAT with pagination so a large table cannot flood context. Returns total row/col counts, a header (table DATs), a sliced page (offset/limit), an optional stable head preview (preview_rows), and a |
| get_parameter_menuA | Read-only: for each menu parameter of a node, live-fetch the menu option values ( |
| focus_network_editorA | Pan/zoom TouchDesigner's Network Editor to frame the given operators — a 'follow' move so the artist sees what the agent just built instead of hunting for it. UI-only: it points a Network Editor pane at the operators' parent, selects them, and homes on the selection with zoom. Changes nothing in the project graph. |
| create_node_chainA | Create multiple nodes and (optionally) connect them in sequence. Returns all created paths; on failure it stops and reports partial progress without deleting anything. |
| connect_nodesA | Wire one node's output connector into another node's input connector inside TouchDesigner, creating a single link between two existing nodes. Uses the bridge's batch endpoint when available and falls back to a Python connect otherwise. Use create_node_chain instead when you are creating several new nodes and want them auto-wired in sequence. Returns the source and target paths, the connector indices used, and which method made the connection. |
| create_glsl_shaderA | Create a GLSL TOP under parent_path that renders a custom fragment shader (and optional vertex shader). The shader source is placed in companion Text DATs ( |
| create_python_scriptA | Create one DAT under parent_path preloaded with your Python |
| set_parameters_batchA | Update parameters on multiple nodes in a single batch request. Each update reports its own success; a failure does not roll back the others. |
| create_containerA | Create one empty COMP under parent_path to hold a visual system, then tile it into the parent's network grid clear of existing siblings. |
| create_control_panelA | Expose live controls on a COMP: append custom parameters (sliders, toggles, menus, RGB, pulse) and bind them to node parameters so the artist can drive a generated system in real time. Point |
| create_control_surfaceA | Build a playable performance panel (a Container COMP of visual widgets) for live use, beyond the parameter dialog: vertical faders that drive parameters, and buttons that recall or morph to named cues (from manage_cue). Open the container in Perform/Panel mode for a touchable surface — faders move their parameters, cue buttons fire scenes (instantly or with a crossfade). |
| animate_parameterA | Drive one or more node parameters over time with an LFO (sine/triangle/ramp/square/pulse/random). Creates an LFO CHOP and binds each target so it oscillates between min and max with the given period — movement without manual keyframing. |
| bind_to_channelA | Drive one or more node parameters from a CHOP channel by expression — the link that makes a visual react. Point it at an audio_features channel (bass/mid/treble/level) or a tempo_sync channel (ramp/pulse/beat) with a scale and offset, and each target parameter tracks that signal live. This is how you wire extract_audio_features / create_tempo_sync into a visual system. Optionally add attack/release smoothing (in seconds) — or a single |
| manage_presetsA | Store, recall, list, or delete named snapshots of a COMP's parameter values — the live-performance preset system. Pair with create_control_panel: snapshot the knob positions and jump between looks. Snapshots are saved in the COMP's storage so they persist with the project. |
| manage_checkpointA | Store / restore / list / delete a full snapshot of a sub-network — an 'undo point' to take before risky live edits. A checkpoint captures every node's constant parameters, the wiring, and node positions. Restoring reapplies parameters, recreates nodes that were deleted since (with their wiring), and prunes nodes that were created since. Unlike manage_presets (custom-parameter looks for performance), this captures the whole network for safe experimentation. |
| manage_cueA | Live-performance scene system: store / recall / morph / list / delete named cues (snapshots of a COMP's custom-parameter values). Unlike manage_presets, a cue can be reached with a timed |
| manage_componentA | Build a reusable component library by moving COMPs to/from .tox files on disk. Two actions: 'save' writes the COMP at comp_path to file_path as a .tox (overwriting any existing file, optionally creating parent folders) and returns the saved path and byte size; 'load' reads file_path back into parent_path, either as an independent copy or a live-linked instance (via |
| add_custom_parametersA | Append a custom-parameter page (knobs, sliders, toggles, menus, pulses, RGB, XYZ) to a COMP so a generated network becomes a tunable, reusable component. Point |
| scaffold_extensionA | Give a COMP a Python extension class: create a Text DAT holding the class (with optional method stubs), wire it into an extension slot, optionally promote it (so members are callable directly on the COMP), and reinitialize. The other half of making a generated network reusable — pair with |
| create_macroA | Add one macro knob (a 0–1 custom parameter) to a COMP that drives many parameters at once, each remapped into its own [min,max] range with an optional response curve — a one-to-many control for sweeping a whole look from a single fader. Targets are bound by expression so they track the macro live. |
| randomize_controlsA | Randomize a COMP's numeric custom parameters within their slider ranges — an instant new variation for live improvisation. |
| create_phone_remoteA | Serve a mobile-friendly web panel from a Web Server DAT so you can control a COMP's numeric custom parameters from a phone — just open the URL, no app to install. Each parameter becomes a touch slider that writes back live. SECURITY: like the bridge, this listens on all interfaces and accepts writes with no auth, so use it only on a trusted network. Pair with create_control_panel (the params to expose) and manage_cue (snapshot looks you dial in from the phone). |
| create_external_ioA | Bridge TouchDesigner to the outside world: OSC/MIDI input (a control surface — bind incoming channels straight to parameters), OSC/MIDI output (send a CHOP's channels back out for bidirectional feedback to lighting desks, other apps or hardware — pass source_path), DMX/Art-Net output for lighting (dmx_out for any DMX desk; artnet_out for network Art-Net/sACN pixel-mapping of LED strips & stage fixtures), RTMP output to live-stream a TOP to Twitch/YouTube/OBS (rtmp_out — NVIDIA GPU on Windows only), or NDI / Syphon-Spout video input. To discover which channel a control sends (a 'MIDI learn'), wiggle it and read the input CHOP with get_td_nodes, then bind_to that channel. Validate live where possible, but real signal needs the hardware/sender present. |
| duplicate_networkA | Copy a node or whole COMP (and all its contents) to a new node, placed in the source's parent or another parent_path. Returns the source path and the new copy's path. Use duplicate this way to clone a built network; use create_container instead when you just need a fresh empty COMP. |
| arrange_networkA | Tidy an existing network: reposition a COMP's children into a readable left→right data-flow layout (sources on the left, output on the right). Use this to clean up nodes that are piled on top of each other. Set recursive to also arrange the contents of nested COMPs. Only moves node positions — it never adds, deletes, or rewires nodes. Returns the COMP path and how many nodes were repositioned. |
| create_panicA | Build a live-performance safety control — the 'oh no' button every VJ needs. Wraps a source in a small COMP with two instant kill switches: Blackout forces the output to black (a Level TOP's brightness1 driven to 0) and Freeze holds the last frame (a Cache TOP stops capturing, active → 0). With an input_path the source is pulled in by a Select TOP (so it can live in another container); without one a built-in Ramp TOP test source is used so it builds and previews standalone. Output is a Null TOP. Big Blackout / Freeze toggle buttons are exposed on the container so a performer can hit them instantly. Marked destructive because firing Blackout/Freeze disables the live output. Returns the container, the source/freeze/blackout/output node paths, and the initial toggle states. |
| create_clip_launcherA | Build an Ableton-style clip launcher: a grid panel (Container COMP) of clip buttons, one per named cue (from manage_cue), for fast hands-on scene switching during a live set. Open the container in Perform/Panel mode and tap a clip to fire its cue — instantly, or (with morph_time) crossfading to it over N seconds (eased, the same engine manage_cue uses). Store the cues with manage_cue / create_control_panel first. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| visual_artist_mode | Think in terms of visual composition, color, motion and aesthetics rather than code while building in TouchDesigner. |
| debug_network | Systematically debug a TD network: check errors, verify connections, inspect cook times, and suggest fixes. |
| optimize_performance | Analyze a TD network for performance: identify bottlenecks, suggest resolution changes, and recommend cooking optimizations. |
| explain_network | Generate a human-readable explanation of what a TD network does: data flow, key parameters, and artistic intent. |
| remix_visual | Take an existing visual system and create variations — change colors, swap techniques, add effects, alter timing. |
| beat_reactive_designer | Make a visual react to music — wire audio features and the beat into a visual system's parameters. |
| image_to_visual | Recreate the look of a reference image (one the user shared) as a real TouchDesigner network. |
| tweak_visual | Adjust an existing visual in plain language ('darker', 'faster', 'more chaotic') by changing the right parameters. |
| critique_visual | Evaluate a visual system and suggest concrete aesthetic and performance improvements. |
| analyze_screenshot | Look at a node's actual output and diagnose what it shows — or why it looks wrong (e.g. 'why is it black?', 'why is it frozen?') — by combining the live preview image with the network topology and node errors. |
| vj_set_builder | Assemble a complete reactive audiovisual set — scenes, audio/beat reactivity, cues and a control surface. |
| fix_shader | Diagnose and fix a GLSL TOP that won't compile: read the compiler error, check the Text DAT against TD's GLSL conventions, edit it, and re-verify with errors + preview. |
| text_to_shader | Author a GLSL TOP fragment shader from a plain-language description, then create and validate it in TD. |
| audio_to_show | Turn a track, genre or mood into a full reactive VJ show — visuals, audio/beat reactivity and section cues. |
| auto_fix | Detect, diagnose and repair errors across a network in a re-checking loop until it cooks clean. |
| text_to_recipe | Author a schema-valid recipe JSON (matching RecipeSchema) from a plain-language description, ready to save under recipes/ and instantiate with apply_recipe. |
| style_reference | Recreate a reference look or aesthetic — from a style description alone or an image the user shared — as a real TouchDesigner network. |
| fix_reactivity | Diagnose 'my visual stopped reacting to the music/camera' — the wired-but-dead signal class (paused timeline, silent source, RMS-0, a scale/offset that flattens the signal) that auto_fix and fix_shader don't cover. |
| recover_show | Mid-show emergency: the output is frozen, black, or erroring and there is an audience. A fast 'get a picture back NOW' triage loop — optimized for speed over completeness, unlike the thorough auto_fix. |
| auto_vj_director | Run a hands-free AI VJ: watch the live beat/onset event stream and fire cue recalls, transitions, and control randomization on the song's structure — an AI conductor over the create_autopilot engine, reasoning about builds/drops instead of randomizing mechanically. |
| color_story | Design a cohesive palette + color-grade ARC across a set or its sections (warm intro → cold drop → strobe-white peak) and wire it with create_palette + create_color_grade — instead of picking colors per-scene ad hoc. |
| setlist_planner | Turn a DJ tracklist / BPM + energy curve into a scene-per-track plan: which generator, palette, reactivity intensity and cue-morph time per track — then optionally drive import_setlist / manage_cue. Plans a whole night, not one track's sections. |
| explain_param | Plain-language 'what does this knob do, and what happens if I change it?' for any operator parameter — grounded in the 629-operator knowledge base plus the parameter's live value/range, not guessed. |
| visual_ab_compare | Capture two looks/cues (or before/after a tweak) with get_preview and judge which better matches a stated goal (palette, energy, focal point) — the comparative VJ decision critique_visual doesn't do. |
| lyric_show | Turn a block of lyrics/credits + a vibe into a timed kinetic-text layer — choosing create_kinetic_text mode (flash/pulse/slide), font/color from the palette, and beat-syncing the flashes. |
| genre_visual_language | Pick IDIOMATIC looks for a music genre instead of generic ones — encodes genre→visual conventions (techno = monochrome strobing geometry; ambient = slow organic feedback; DnB = RGB glitch; footwork = fast cut-up) and maps them onto concrete tdmcp tools. |
| teach_touchdesigner | Teach a TouchDesigner concept grounded in the embedded knowledge base, not generic web knowledge. |
| design_brief | Establish a persistent aesthetic direction the assistant honors across every build and tweak for the rest of the session, until the artist changes it. |
| motion_critique | Judge a look's MOTION over time, not a single frame — capture a short burst of previews (or read CHOP activity) and assess whether it's static, jittery, or musical. critique_visual looks at one still; the live thesis is movement. |
| match_reference_loop | Converge a build toward a reference image as an explicit scored loop (build → preview → self-score on named axes → adjust → re-preview) — the disciplined version of image_to_visual / style_reference's loose one-pass 'compare and adjust'. |
| creative_inspiration | Runs a Creative RAG search and returns a mood board of curated reference cards as a prompt payload ready for any Layer 1 TD-building tool. |
| project_rag_context | Runs a Project RAG search and returns a prompt payload of top-k local project cards (with provenance + license) as authoritative reference before coding an effect. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| td-cheatsheets | Compact KB-grounded reminders for common tdmcp workflows, with links to richer resources. |
| td-glsl-snippets | A vetted, license-clean catalog of embedded GLSL snippets that agents can assemble into GLSL TOP networks without guessing resource ids. |
| td-cookbook | The English prompt cookbook as Markdown, exposed as a resource for agents that want worked examples before building. |
| td-agent-commands | The command-line verbs exposed by tdmcp-agent, generated from the actual CLI dispatcher so agent clients can discover safe, mutating and unsafe commands without drift. |
| td-prompts | The MCP prompts tdmcp offers, generated from the actual prompt registry so clients and local copilot flows do not drift from the registered names. |
| td-learning-touchdesigner | A curated learning path that pairs the teach_touchdesigner prompt with embedded operator and tutorial resources. |
| td-session-profile | The artist's persistent cross-session profile at ~/.tdmcp/session-profile.json. Caches the latest outputs of style_memory, recall_similar_work, learn_conventions, and learn_from_my_corpus so an agent can load all preferences in one resource read. Use the load_session_profile tool to initialise or refresh the file. Override the path with TDMCP_SESSION_PROFILE_PATH. |
| Operators: CHOP | All CHOP operators |
| Operators: COMP | All COMP operators |
| Operators: DAT | All DAT operators |
| Operators: MAT | All MAT operators |
| Operators: POP | All POP operators |
| Operators: SOP | All SOP operators |
| Operators: TOP | All TOP operators |
| Python: App | 4 methods, 2 members |
| Python: Attribute | 2 methods, 2 members |
| Python: Attributes | 1 methods, 2 members |
| Python: Bounds | 0 methods, 0 members |
| Python: CHOP | 51 methods, 2 members |
| Python: COMP | 70 methods, 2 members |
| Python: Cell | 2 methods, 2 members |
| Python: Channel | 9 methods, 2 members |
| Python: Connector | 2 methods, 2 members |
| Python: DAT | 84 methods, 2 members |
| Python: Dependency | 0 methods, 0 members |
| Python: Error DAT | 0 methods, 0 members |
| Python: Group | 3 methods, 2 members |
| Python: License | 0 methods, 2 members |
| Python: MAT | 46 methods, 2 members |
| Python: MOD | 5 methods, 4 members |
| Python: Matrix | 25 methods, 0 members |
| Python: Monitor | 0 methods, 2 members |
| Python: Network | 0 methods, 0 members |
| Python: NetworkEditor | 13 methods, 2 members |
| Python: Node | 0 methods, 0 members |
| Python: OP | 46 methods, 2 members |
| Python: OP Viewer COMP | 0 methods, 0 members |
| Python: ObjectCOMP | 77 methods, 2 members |
| Python: Page | 35 methods, 2 members |
| Python: Pane | 2 methods, 3 members |
| Python: Panel | 0 methods, 2 members |
| Python: PanelCOMP | 78 methods, 2 members |
| Python: PanelValue | 0 methods, 2 members |
| Python: Par | 11 methods, 2 members |
| Python: ParGroup | 10 methods, 2 members |
| Python: Parameter | 0 methods, 0 members |
| Python: Parent | 0 methods, 0 members |
| Python: Pattern CHOP | 0 methods, 0 members |
| Python: Peer | 4 methods, 2 members |
| Python: Point | 1 methods, 2 members |
| Python: Position | 5 methods, 2 members |
| Python: Prim | 3 methods, 2 members |
| Python: Project | 9 methods, 2 members |
| Python: PythonOp | 6 methods, 5 members |
| Python: Quaternion | 0 methods, 2 members |
| Python: Replicator COMP | 0 methods, 0 members |
| Python: Run | 1 methods, 2 members |
| Python: Runs | 0 methods, 0 members |
| Python: SOP | 48 methods, 2 members |
| Python: ScriptOp | 7 methods, 5 members |
| Python: Segment | 0 methods, 2 members |
| Python: Sequence | 2 methods, 2 members |
| Python: Stype | 0 methods, 0 members |
| Python: SysInfo | 0 methods, 2 members |
| Python: TOP | 51 methods, 2 members |
| Python: Timecode | 10 methods, 2 members |
| Python: UI | 2 methods, 4 members |
| Python: Vertex | 0 methods, 2 members |
| Python: baseCOMP | 70 methods, 2 members |
| Python: evaluateDAT | 84 methods, 2 members |
| Python: examineDAT | 84 methods, 2 members |
| Python: glslTOP | 51 methods, 2 members |
| Python: listCOMP | 92 methods, 2 members |
| Python: midiinDAT | 85 methods, 2 members |
| Python: scriptCHOP | 0 methods, 2 members |
| Python: scriptDAT | 90 methods, 0 members |
| Python: scriptSOP | 2 methods, 0 members |
| Python: scriptTOP | 2 methods, 0 members |
| Python: serialDAT | 87 methods, 0 members |
| Python: tcpipDAT | 89 methods, 0 members |
| Python: td | 49 methods, 5 members |
| Python: td Module | 0 methods, 2 members |
| Operator compatibility: Noise CHOP | Available since earliest TD releases |
| Operator compatibility: Null CHOP | Pass-through operator, stable across all versions |
| Operator compatibility: Math CHOP | Core arithmetic operator |
| Operator compatibility: Filter CHOP | Low/high/band-pass filter |
| Operator compatibility: Audio File In CHOP | Core audio playback operator |
| Operator compatibility: Audio Device In CHOP | Hardware audio input |
| Operator compatibility: Timer CHOP | Timing and sequencing |
| Operator compatibility: Lag CHOP | Smoothing/easing operator |
| Operator compatibility: LFO CHOP | Low frequency oscillator |
| Operator compatibility: Speed CHOP | Converts derivative to velocity |
| Operator compatibility: Script CHOP | Python scripting CHOP — Python version tracks TD version |
| Operator compatibility: Movie File In TOP | Core video playback operator |
| Operator compatibility: Render TOP | 3D scene renderer |
| Operator compatibility: GLSL TOP | GPU shader operator |
| Operator compatibility: Noise TOP | Procedural texture noise |
| Operator compatibility: Blur TOP | Image blur filter |
| Operator compatibility: Composite TOP | Image compositing |
| Operator compatibility: Level TOP | Color level adjustments |
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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