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. |
| system_infoA | TD version, cook rate, realtime flag and the full registered method list. |
| node_createA | 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. |
| 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. |
| node_getC | Full metadata for one operator (params, connections, position). path (<class 'str'>): Full path of the operator. |
| 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. |
| node_renameC | Rename a node. path (<class 'str'>): Full path of the operator. name (<class 'str'>): New name for the operator. |
| 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). |
| node_errorsB | Errors/warnings for a node, optionally including children. path (<class 'str'>): Full path of the operator. includeChildren (bool | None): Also collect child errors. |
| node_set_flagsA | 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. |
| par_getC | Read parameter values, optionally filtered by glob. path (<class 'str'>): Operator path. pattern (str | None): Glob like 't[xyz]'; None = all. |
| par_setB | Set one or more parameter values on an operator. path (<class 'str'>): Operator path. values (dict[str, typing.Any]): Mapping of parameter name -> value. |
| par_get_allB | Full metadata (mode, bounds, menu names) for every par. path (<class 'str'>): Operator path. |
| par_infoB | Metadata for named parameters (or all if names omitted). path (<class 'str'>): Operator path. names (list[str]): Parameter names; None = all. |
| 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. |
| par_pulseC | Pulse a momentary parameter. path (<class 'str'>): Operator path. name (<class 'str'>): Parameter name. |
| 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). |
| 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. |
| conn_getB | Read all input/output connections of a node. path (<class 'str'>): Operator path. |
| 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). |
| connection_deleteC | Alias of conn.delete. path (<class 'str'>): Operator path. inputIndex (int | None): Disconnect this input. outputIndex (int | None): Disconnect this output. |
| connection_getD | Alias of conn.get. path (<class 'str'>): Operator path. |
| data_chopB | Read CHOP channel values (uniformly downsampled). path (<class 'str'>): CHOP operator path. max_samples (int | None): Max samples per channel (default 1024). |
| data_topD | 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). |
| data_sopC | SOP point count/positions and bounds. path (<class 'str'>): SOP operator path. |
| data_datB | 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. |
| data_dat_writeB | 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. |
| script_class_listA | List names in the td module (optional substring filter). pattern (str | None): Case-insensitive substring. |
| script_class_detailC | Methods/properties/docstring for a td class. name (<class 'str'>): Class or attribute name. |
| script_module_helpC | help() output for a td name. name (<class 'str'>): Name to look up. |
| timeline_getB | Current timeline / playback state. |
| 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. |
| timeline_playA | Start timeline playback. |
| timeline_pauseA | Pause timeline playback. |
| render_screenshotB | 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. |
| 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). |
| project_infoB | Project + app metadata (name, folder, version, cook rate). |
| project_snapshotB | Save a timestamped, collision-free backup .toe. dest (str | None): Backup folder; 'snapshots/' next to the project. |
| project_versionsB | List saved .toe versions in the project folder, newest-first. folder (str | None): Folder to scan (default project folder). |
| measure_gpuA | GPU util/VRAM + whether TD is really rendering. The 'looks healthy but isn't' detector. require_render (bool | None): Error if TD is not rendering (default true). |
| measure_chainA | Per-device topology: Bypass/Src/Srcpath truth + chain orphan detection for chained COMPs. path (str | None): Root container to scan (default '/'). |
| measure_fpsD | FPS, realtime flag, cook rate, throttle queue. |
| measure_verifyB | 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). |
| 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). |
| 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). |
| 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. |
| measure_cooktimesB | 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. |
| 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). |
| 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'). |
| 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. |
| 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). |
| layout_set_positionC | Set network-editor position of one or more nodes. nodes (list[typing.Any]): [{path, x, y}, ...]. |
| 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). |
| bridge_statusB | Bridge heartbeat state: alive, age (s), project, build. |
| bridge_stateC | TD three-state probe: ok | starting | down | off. |
| 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). |
| bridge_snapshotA | Copy the current show .toe to a timestamped backup (never overwrites anything). |
| bridge_snapshotsA | List existing backups, newest-first. |
| bridge_restoreB | 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. |
| 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). |
| 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. |
| 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. |
| bridge_router_versionA | Router surface version + method count (capability negotiation; soft-warn on mismatch, never hard-lock). |
| bridge_sendD | Raw bridge send: op + payload (eval/python/...). For power users only. op (<class 'str'>): Bridge opcode (eval, python, ...). payload (dict[str, typing.Any]): Payload dict. |
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 64 tools
Several tool clusters have unclear boundaries: conn_* tools have exact connection_* aliases, system_ping/bridge_status/bridge_state/measure_verify all report health-ish state, and project_snapshot/bridge_snapshot/bridge_snapshots overlap heavily. Descriptions are detailed, but an agent can easily select the wrong health or backup tool.
Nearly all tools follow a predictable snake_case domain-prefix + action pattern (node_create, par_set, timeline_play, bridge_restore), which makes the surface navigable. The main inconsistencies are the connection_* alias duplicates, batch_execute being verb-first, and data_chop/top/sop using family names rather than actions.
64 tools is far above the typical well-scoped MCP surface, and the set includes duplicate aliases plus raw escape-hatch methods that inflate the count. The broad TouchDesigner domain justifies many distinct operations, but the surface would be cleaner and more usable at roughly half this size.
The server covers node, parameter, connection, data, script, timeline, render, project, measure, and bridge operations, so most workflows are supported. However, there are notable gaps: no node_delete/destroy tool, no dedicated script execution except the raw bridge_send, and backup functionality is split across overlapping snapshot tools.