touchbridge
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| TOUCHBRIDGE_DIR | No | Path to the bridge folder used by the touchbridge MCP server. Defaults to ~/.touchbridge/bridge. | ~/.touchbridge/bridge |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| system_pingA | Liveness canary. Returns pong + TD frame. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| system_infoA | TD version, cook rate, realtime flag and the full registered method list. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| node_createB | Create an operator in a parent COMP (e.g. 'noiseCHOP'). Auto-placed to the right of siblings. parentPath (<class 'str'>): Full path of the parent COMP. type (<class 'str'>): Operator type string (e.g. 'noiseCHOP'). name (str | None): Desired name; TD assigns one if omitted. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| node_listA | List children of a container, optionally filtered by family. path (str | None): Parent container path (default '/'). family (str | None): Filter by operator family (CHOP/TOP/...). depth (int | None): Recursion depth; 1 = direct children. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| node_getA | Full metadata for one operator (params, connections, position). path (<class 'str'>): Full path of the operator. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| node_copyA | Copy a node into a destination parent. sourcePath (<class 'str'>): Path of the operator to copy. destParentPath (<class 'str'>): Destination parent COMP path. name (str | None): Name for the copy; TD assigns if omitted. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| node_renameA | Rename a node. path (<class 'str'>): Full path of the operator. name (<class 'str'>): New name for the operator. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| node_findA | Search for nodes matching name/type/family, recursively. path (str | None): Root container to search (default '/'). name (str | None): Case-insensitive substring on node name. type (str | None): Exact operator type (case-insensitive). family (str | None): 'CHOP'/'TOP'/'DAT'/'SOP'/... depth (int | None): Max recursion depth (default 5). detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| node_errorsA | Errors/warnings for a node, optionally including children. path (<class 'str'>): Full path of the operator. includeChildren (bool | None): Also collect child errors. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| node_set_flagsB | Set display / render / bypass flags on a node. path (<class 'str'>): Full path of the operator. display (bool | None): Set display flag. render (bool | None): Set render flag. bypass (bool | None): Set bypass flag. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| par_getA | Read parameter values, optionally filtered by glob. path (<class 'str'>): Operator path. pattern (str | None): Glob like 't[xyz]'; None = all. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| par_setA | Set one or more parameter values on an operator. path (<class 'str'>): Operator path. values (dict[str, typing.Any]): Mapping of parameter name -> value. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| par_get_allA | Full metadata (mode, bounds, menu names) for every par. path (<class 'str'>): Operator path. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| par_infoA | Metadata for named parameters (or all if names omitted). path (<class 'str'>): Operator path. names (list[str]): Parameter names; None = all. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| par_set_expressionC | Put a parameter into expression mode. path (<class 'str'>): Operator path. name (<class 'str'>): Parameter name. expression (<class 'str'>): Python expression string. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| par_pulseA | Pulse a momentary parameter. path (<class 'str'>): Operator path. name (<class 'str'>): Parameter name. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| conn_createA | Wire two ops together (output -> input). fromPath (<class 'str'>): Source operator path. toPath (<class 'str'>): Destination operator path. fromOutput (int | None): Source output index (default 0). toInput (int | None): Destination input index (default 0). detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| conn_deleteB | Disconnect an input and/or output of a node. path (<class 'str'>): Operator path. inputIndex (int | None): Disconnect this input. outputIndex (int | None): Disconnect this output. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| conn_getA | Read all input/output connections of a node. path (<class 'str'>): Operator path. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| connection_createB | Alias of conn.create (kept for MCP-side compat). fromPath (<class 'str'>): Source operator path. toPath (<class 'str'>): Destination operator path. fromOutput (int | None): Source output index (default 0). toInput (int | None): Destination input index (default 0). detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| connection_deleteB | Alias of conn.delete. path (<class 'str'>): Operator path. inputIndex (int | None): Disconnect this input. outputIndex (int | None): Disconnect this output. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| connection_getD | Alias of conn.get. path (<class 'str'>): Operator path. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| data_chopA | Read CHOP channel values (uniformly downsampled). path (<class 'str'>): CHOP operator path. max_samples (int | None): Max samples per channel (default 1024). detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| data_topA | TOP resolution, optionally base64 PNG pixel capture. path (<class 'str'>): TOP operator path. pixels (bool | None): Capture pixels as base64 PNG. max_width (int | None): Downscale if wider (default 512). max_height (int | None): Downscale if taller (default 512). detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| data_sopA | SOP point count/positions and bounds. path (<class 'str'>): SOP operator path. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| data_datA | Read text or table DAT content. path (<class 'str'>): DAT operator path. row_start (int | None): First table row (default 0). row_end (int | None): Last table row, exclusive. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| data_dat_writeA | Write text / append a row / clear a DAT. path (<class 'str'>): DAT operator path. text (str | None): Replace full text content. appendRow (list[typing.Any]): Append a row to a table DAT. clear (bool | None): Clear before writing. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| script_class_listA | List names in the td module (optional substring filter). pattern (str | None): Case-insensitive substring. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| script_class_detailA | Methods/properties/docstring for a td class. name (<class 'str'>): Class or attribute name. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| script_module_helpA | help() output for a td name. name (<class 'str'>): Name to look up. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| timeline_getB | Current timeline / playback state. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| timeline_setA | Set cookRate, realTime and/or jump to a frame. cookRate (float | None): Desired cook rate (fps). realTime (bool | None): Enable/disable real-time playback. frame (int | None): Jump to this absolute frame. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| timeline_playA | Start timeline playback. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| timeline_pauseB | Pause timeline playback. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| render_screenshotA | Save a TOP's current frame to a PNG file. path (<class 'str'>): TOP operator path. save_path (str | None): Output PNG path; tempfile if omitted. overwrite (bool | None): Replace an existing save_path (default false; .toe/.tox never). detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| render_exportB | Export a TOP frame to a file (extension picks format). path (<class 'str'>): TOP operator path. save_path (<class 'str'>): Output path (.png/.jpg/.exr...). quality (int | None): JPEG quality 0-100 (default 90). overwrite (bool | None): Replace an existing file (default false; .toe/.tox never). detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| project_infoA | Project + app metadata (name, folder, version, cook rate). detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| project_snapshotA | Save a timestamped, collision-free backup .toe. dest (str | None): Backup folder; 'snapshots/' next to the project. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| project_versionsA | List saved .toe versions in the project folder, newest-first. folder (str | None): Folder to scan (default project folder). detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| measure_gpuA | GPU util/VRAM (NVIDIA, measured host-side so TD never blocks) + whether TD is really rendering. The 'looks healthy but isn't' detector. require_render (bool | None): Error instead of returning empty stats when TD is not rendering and no GPU numbers are available (default false). detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| measure_chainA | Per-device topology: Bypass/Src/Srcpath truth + chain orphan detection for chained COMPs. path (str | None): Root container to scan (default '/'). detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| measure_fpsC | FPS, realtime flag, cook rate, throttle queue. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| measure_verifyA | Round-trip canary over the file bridge: rtt_ms + a live TD value (absTime.seconds by default). expr (str | None): Expression to eval (default absTime.seconds). detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| node_errors_deepA | Walk a whole subtree; report every node with cook errors, warnings, parameter-expression errors or script errors. Only nodes with a problem are returned. path (str | None): Root of the walk (default '/project1'). max_depth (int | None): Recursion limit (default 32). max_nodes (int | None): Visit cap (default 5000). detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| node_clear_script_errorsA | Clear a node's accumulated script-error log, force a cook, re-read. path (<class 'str'>): Operator path. force_cook (bool | None): cook(force=True) after clearing (default true). detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| node_snapshotA | Complete parameter state (value/mode/expr/evalError) + flags, optionally written to a JSON file (never overwrites). Diff two snapshots around a risky edit. path (<class 'str'>): Operator path. out (str | None): JSON file under the project folder. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| measure_cooktimesA | Per-operator cook cost (ms) sorted most-expensive first: which device is eating the frame. paths (list[str]): Operator paths to measure. path (str | None): Parent whose children are measured. top (int | None): Return only the N most expensive. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| data_pixel_sampleA | Luma statistics of a TOP (mean/min/max/std) with dark / solid / clipped flags. The 'is the output actually black?' verifier. path (<class 'str'>): TOP operator path. grid (int | None): Samples per axis (default 16). numpy (bool | None): Full-frame read via numpyArray(). dark_below (float | None): Mean luma below this = dark (0.02). solid_std (float | None): Std below this = solid (0.005). detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| project_import_toxA | Load a .tox into a parent COMP. Path must be under the project folder or $TOUCHBRIDGE_TOX_ROOTS; .toe refused. path (<class 'str'>): The .tox file. parentPath (str | None): COMP to load into (default '/project1'). detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| project_export_toxA | Save a COMP to a .tox. Never a .toe; never overwrites unless overwrite=true. path (<class 'str'>): COMP operator path. out (<class 'str'>): Destination .tox under the project folder. overwrite (bool | None): Allow replacing an existing file. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| batch_executeA | Run a list of router requests in ONE bridge round trip (transport batching, not a rollback transaction: failures are reported per item). ops (list[typing.Any]): [{method, params}, ...] — the ops to run. abort_on_error (bool | None): Stop at the first failure (default false). detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| layout_set_positionA | Set network-editor position of one or more nodes. nodes (list[typing.Any]): [{path, x, y}, ...]. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| layout_alignA | Distribute nodes along a horizontal or vertical axis. paths (list[str]): Ordered operator paths. axis (str | None): 'horizontal' (default) or 'vertical'. start_x (float | None): X of the first node. start_y (float | None): Y of the first node. spacing (float | None): Gap between centres (default 200). detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| bridge_statusA | Bridge heartbeat state: alive, age (s), project, build. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| bridge_stateB | TD three-state probe: ok | starting | down | off. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| bridge_modeA | Current bridge mode: prep (normal editing) or show (live performance lock: reads + allowlisted params only), with the allowlist and since-when. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| bridge_set_modeA | Enter SHOW mode (lock the bridge for a live performance: reads and the allowlisted parameters only; enforced inside TD for every client) or return to PREP. Leaving show mode needs confirm='END SHOW' TYPED BY THE HUMAN OPERATOR: never supply it on your own initiative. mode (<class 'str'>): 'show' or 'prep'. allow (list[str]): Entering show: params that may still change, as '/path:ParName' globs (e.g. '/project1/master:Opacity', '/project1/fx*:Mix'). confirm (str | None): Leaving show: the exact phrase END SHOW, from the operator. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| bridge_healthA | Show health in one call: bridge alive / TD frozen / TD gone, REAL fps vs cook rate, frame time vs budget, dropped frames, GPU memory/temp (TD's Perform CHOP), mode, and optionally whether an output TOP is black or solid. output (str | None): TOP path of the show output to check for black/solid. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| bridge_save_incrementA | SAFE save: write the next numbered Show.<N+1>.toe and structurally refuse to overwrite an existing file. The preferred way to persist bridge edits. timeout (float | None): Seconds to wait (default 45). detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| bridge_snapshotA | Copy the current show .toe to a timestamped backup (never overwrites anything). detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| bridge_snapshotsA | List existing backups, newest-first. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| bridge_restoreA | Restore a backup into the show folder as a NEW restored..toe sibling (never overwrites the live file). backup (<class 'str'>): Absolute path to a backup .toe. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| bridge_ensure_aliveA | Open the show in TD (if needed) and wait for the bridge heartbeat. Returns alive status. timeout (float | None): Max seconds to wait (default 45). detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| bridge_open_showA | Launch the resolved show .toe in TouchDesigner (refuses if TD is already running unless force). force (bool | None): Launch even if TD is running. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| bridge_router_callA | Raw router call for ANY router method (escape hatch; prefer the typed tools). Destructive methods stay gated by safe mode. method (<class 'str'>): Router method name (e.g. 'node.get'). params (dict[str, typing.Any]): Method parameters as a dict. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| bridge_router_versionA | Router surface version + method count (capability negotiation; soft-warn on mismatch, never hard-lock). detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
| bridge_sendA | Raw bridge send: op + payload. In safe mode only catalogued non-destructive router methods pass; the raw python/eval opcodes need --allow-destructive. op (<class 'str'>): Bridge opcode (eval, python, ...). payload (dict[str, typing.Any]): Payload dict. detail (str | None): full (default) | summary (long lists cut to 25 + count) | minimal (top-level scalars only). response_format (str | None): yaml (default, token-cheap) | json. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| diagnose_dark_output | |
| wire_feedback_safely | |
| save_before_editing |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| Project | Resolved show .toe, family name, and bridge liveness. |
| Project versions | Saved .toe versions (newest-first) in the project folder. |
| Snapshots | Timestamped touchbridge backups, newest-first. |
TDQS
Scored across 67 tools
There are several pairs of tools with overlapping purposes: node_get vs node_snapshot (both read node state), par_get vs par_info vs par_get_all (all read parameter info), and the connection_* aliases duplicate conn_* tools. However, many tools have distinct purposes (node_create vs node_copy vs node_rename). The presence of aliases and similar read endpoints creates some ambiguity.
The naming is mostly consistent with verb_noun pattern (e.g., node_get, par_set, data_chop), but there are deviations: some tools use 'get' (node_get) while others use 'list' (node_list), and the use of 'connection_*' aliases alongside 'conn_*' breaks consistency. Also, 'par_get_all' versus 'par_info' are not clearly differentiated by name.
With 57 tools, this is far beyond the typical 3-15 range and even exceeds the 25+ threshold. The server covers a broad domain (TouchDesigner automation), but many tools are highly specialized (e.g., measure_chain, data_pixel_sample) and could be consolidated. The count feels overwhelming and undermines usability.
The tool surface is quite comprehensive: it covers node CRUD (create, copy, rename, delete? no delete but set_flags), parameter operations (get, set, expression, pulse), connections, data reading for all families, timeline control, rendering, project save/restore, and performance measurement. Minor gaps include no explicit node delete or connection listing beyond conn_get, but the breadth is strong.