@dpantani/tdmcp 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -17,7 +17,9 @@ It works because it pairs two things every other tool was missing:
17
17
  TouchDesigner operators instead of guessing.
18
18
  - **Real execution** — a small **bridge** running inside TouchDesigner that
19
19
  actually creates, connects, inspects and previews nodes — with a
20
- create → verify → preview loop so the AI can see and fix its own work.
20
+ create → verify → preview loop so the AI can see and fix its own work. Every
21
+ generated network is auto-arranged into a readable left→right layout instead
22
+ of piling nodes on top of each other.
21
23
 
22
24
  ---
23
25
 
@@ -38,194 +40,176 @@ Three pieces talk to each other on your computer:
38
40
  3. **The bridge** — a tiny piece that runs *inside* TouchDesigner so the server
39
41
  can actually drive it. You switch it on once per machine.
40
42
 
41
- You set all three up below. It takes about 5 minutes.
43
+ The steps below wire these together about 5 minutes (less with the one-click
44
+ Claude Desktop extension, which bundles the server for you).
42
45
 
43
46
  ---
44
47
 
45
48
  ## What you'll need
46
49
 
47
- - **[TouchDesigner](https://derivative.ca/download)** (free non-commercial
48
- edition is fine).
49
- - **[Node.js](https://nodejs.org) version 20 or newer** this runs the server.
50
- Not sure if you have it? Open a terminal and run `node -v`. If it prints a
51
- number ≥ 20 you're set; otherwise install it from the link.
52
- - An MCP-capable AI client: **Claude Code**, **Claude Desktop**, or **Cursor**.
50
+ - **[TouchDesigner](https://derivative.ca/download)** — the free non-commercial
51
+ edition is fine.
52
+ - An MCP-capable AI assistant: **Claude Desktop** (easiest), **Claude Code**,
53
+ **Codex**, or **Cursor**.
54
+
55
+ **Do I need Node.js?** Only for the build-from-source path (Claude Code, Codex,
56
+ or Cursor), which needs **[Node.js 20+](https://nodejs.org)** — check with
57
+ `node -v`. The
58
+ one-click Claude Desktop extension needs **nothing extra**: Claude Desktop ships
59
+ with its own Node, and the server is bundled inside the `.dxt`.
53
60
 
54
61
  ---
55
62
 
56
63
  ## Get started
57
64
 
58
- Setup is **two pieces**: the **bridge** inside TouchDesigner (so it can be
59
- driven) and the **tdmcp server** connected to your AI. Below, pick the path for
60
- your AI client — **every path also needs the bridge in Step 2.** Budget ~5 min.
65
+ You set up **two sides**: your **AI** (so it gets the tdmcp tools) and
66
+ **TouchDesigner** (so the AI can drive it). Pick whichever way is easiest for you.
61
67
 
62
- > **Which path?** Claude Desktop the one-click extension just below. Claude
63
- > Code or Cursor Steps 1–3.
68
+ **🤖 The easiest way let your AI install it for you.** If you already use
69
+ **Claude Code**, **Codex**, or **Cursor**, you don't have to do any of the manual
70
+ steps below. Just **paste this one message** into it:
64
71
 
65
- > 🤖 **Or let an AI do it for you.** Hand
66
- > [`tdmcp-install-prompt.md`](tdmcp-install-prompt.md) to Claude Code, Codex, or
67
- > Cursor and it runs the install and client wiring itself — you only paste one
68
- > line into TouchDesigner at the end. The manual steps below are the alternative
69
- > if you'd rather drive it yourself.
72
+ ```text
73
+ Install and connect tdmcp for me by reading and following
74
+ https://raw.githubusercontent.com/Pantani/tdmcp/main/tdmcp-install-prompt.md
75
+ Do every step yourself; only stop when you need me to paste one line into TouchDesigner.
76
+ ```
70
77
 
71
- ### Claude Desktop: the one-click extension (`.dxt`) easiest
78
+ **That's the whole install.** Your AI clones, builds, and wires everything up on
79
+ its own. The *only* thing it will ask you to do is paste one line into
80
+ TouchDesigner's Textport when it's ready — nothing else. (It's the
81
+ [`tdmcp-install-prompt.md`](tdmcp-install-prompt.md) runbook doing the work.)
72
82
 
73
- A `.dxt` is a single file that Claude Desktop installs as an **extension**. The
74
- tdmcp server is **bundled inside it**, and you set the TouchDesigner host/port in
75
- a settings form — no JSON, no `claude mcp add`, nothing to keep running yourself.
83
+ **Prefer to do it yourself, or using Claude Desktop?** Follow the three manual
84
+ steps below Step 1's one-click `.dxt` is the no-terminal, no-Node route for
85
+ Claude Desktop.
76
86
 
77
- **1. Get the `tdmcp.dxt` file.** Download the latest prebuilt bundle:
87
+ ### Step 1 Connect tdmcp to your AI
78
88
 
79
- **[⬇ Download tdmcp.dxt](https://github.com/Pantani/tdmcp/releases/latest/download/tdmcp.dxt)** always the newest release.
89
+ Pick the one tab that matches your client.
80
90
 
81
- <details>
82
- <summary>Or build it yourself (needs <a href="https://nodejs.org">Node 20+</a>)</summary>
91
+ <details open>
92
+ <summary><b>🟢 Claude Desktop one-click <code>.dxt</code> (easiest: no terminal, no Node)</b></summary>
83
93
 
84
- ```bash
85
- git clone https://github.com/Pantani/tdmcp.git
86
- cd tdmcp
87
- npm install
88
- npm run build:dxt # writes tdmcp.dxt into this folder
89
- ```
94
+ <br />
90
95
 
91
- </details>
96
+ A `.dxt` is **one file** Claude Desktop installs as an extension. The tdmcp server
97
+ is **bundled inside it** — no terminal, no Node install, nothing to keep running
98
+ yourself.
92
99
 
93
- **2. Install it in Claude Desktop.** Open **Settings Extensions**, choose
94
- **Install from file** (or drag `tdmcp.dxt` onto the window). When asked, set the
95
- TouchDesigner **host** / **port** if they differ from `127.0.0.1` / `9980`, then
96
- **enable** the extension.
100
+ 1. **Download** the bundle
101
+ **[⬇ tdmcp.dxt](https://github.com/Pantani/tdmcp/releases/latest/download/tdmcp.dxt)**
102
+ (always the latest release).
103
+ 2. **Install it:** in Claude Desktop open **Settings Extensions**, then drag
104
+ `tdmcp.dxt` onto the window (or click **Install from file**).
105
+ 3. **Enable it.** Leave the TouchDesigner **host** / **port** at `127.0.0.1` /
106
+ `9980` unless you changed them.
97
107
 
98
- **3. Turn on the bridge** inside TouchDesigner — do **Step 2** below. The
99
- extension *drives* TouchDesigner; the bridge is what lets it in.
108
+ Connected **now do Step 2** to turn on the bridge. (Docker/HTTP options live in
109
+ [`docs/DEPLOYMENT.md`](docs/DEPLOYMENT.md).)
100
110
 
101
- That's the whole Claude Desktop setup — skip to **Step 4** and start creating.
102
- More detail (and the Docker/HTTP options) live in
103
- [`docs/DEPLOYMENT.md`](docs/DEPLOYMENT.md).
111
+ </details>
104
112
 
105
- ---
113
+ <details>
114
+ <summary><b>Claude Code, Codex, or Cursor — build from source (needs Node 20+)</b></summary>
106
115
 
107
- ### Step 1 — Install the tdmcp server (once) · Claude Code / Cursor
116
+ <br />
108
117
 
109
- Open a terminal and run these four lines. You only ever do this once.
118
+ This path builds the server locally, so you need
119
+ **[Node.js 20+](https://nodejs.org)** (`node -v` to check).
110
120
 
111
121
  ```bash
112
122
  git clone https://github.com/Pantani/tdmcp.git
113
123
  cd tdmcp
114
- npm install
115
- npm run build
124
+ npm run setup
116
125
  ```
117
126
 
118
- When it finishes you'll have a ready-to-run server at `dist/index.js`.
119
-
120
- > ⚡ **Shortcut:** instead of `npm install && npm run build`, run **`npm run
121
- > setup`** (or `./setup.sh`). It installs, builds, and then prints the exact line
122
- > to connect your AI — with your real paths already filled in.
123
-
124
- > 💡 **Tip — you'll need this folder's full path twice below.** While you're
125
- > still in the `tdmcp` folder, run `pwd`. Copy what it prints (e.g.
126
- > `/Users/you/tdmcp`) — that's your **project path**. Wherever the steps below
127
- > say `<project-path>`, paste it in.
127
+ `npm run setup` installs, builds, and then **prints the exact line to connect your
128
+ AI**, with your real paths already filled in — paste it and you're done. The manual
129
+ equivalents:
128
130
 
129
- ### Step 2 — Switch on the bridge inside TouchDesigner
131
+ - **Claude Code:**
130
132
 
131
- This lets the server actually control TouchDesigner. The easy, set-and-forget way:
132
-
133
- 1. **Open TouchDesigner.**
134
- 2. Open **Preferences** (`Edit → Preferences`, or the **TouchDesigner** menu on
135
- macOS). In the **General** section, find **"Python 64-bit Module Path"** and
136
- paste:
137
-
138
- ```
139
- <project-path>/td/modules
140
- ```
133
+ ```bash
134
+ claude mcp add tdmcp -- node <project-path>/dist/index.js
135
+ ```
141
136
 
142
- (That's the `tdmcp` folder you cloned — e.g. `/Users/you/tdmcp/td/modules`; run
143
- `pwd` inside it if you're unsure of the full path.) Click OK.
144
- 3. Open the **Textport** (`Dialogs → Textport and DATs`), type this one line and
145
- press Enter:
137
+ - **Codex CLI:**
146
138
 
147
- ```python
148
- from mcp import install; install.run()
149
- ```
139
+ ```bash
140
+ codex mcp add tdmcp -- node <project-path>/dist/index.js
141
+ ```
150
142
 
151
- You should see:
143
+ Prefer editing config by hand? Add this to `~/.codex/config.toml`:
152
144
 
153
- ```
154
- [tdmcp] bridge running on port 9980 (/project1/tdmcp_bridge)
155
- ```
145
+ ```toml
146
+ [mcp_servers.tdmcp]
147
+ command = "node"
148
+ args = ["<project-path>/dist/index.js"]
149
+ ```
156
150
 
157
- Donea `tdmcp_bridge` node now lives in your network and is listening. ✅
151
+ - **Cursor** create `.cursor/mcp.json` in your workspace:
158
152
 
159
- > This is **safe and reversible**: it only adds one tidy `tdmcp_bridge` component.
160
- > Re-running the line just reconfigures it. To remove it later, run
161
- > `from mcp import install; install.uninstall()`.
162
- >
163
- > Want it to start automatically in *every* project? Save the project (with that
164
- > Module Path preference) as your **Default Project**, or see
165
- > [`td/README.md`](td/README.md) for the Execute-DAT auto-start and the fully
166
- > manual Web Server DAT setup.
153
+ ```json
154
+ {
155
+ "mcpServers": {
156
+ "tdmcp": { "command": "node", "args": ["<project-path>/dist/index.js"] }
157
+ }
158
+ }
159
+ ```
167
160
 
168
- **Two even-easier ways to do Step 2:**
161
+ `<project-path>` is the folder you cloned — run `pwd` inside it for the full path.
162
+ Restart your client afterward so it loads the server. **Now do Step 2.**
169
163
 
170
- - **No clone, no Preferences** — paste this single line into the Textport. It
171
- fetches the bridge and starts it for you:
164
+ </details>
172
165
 
173
- ```python
174
- import urllib.request; exec(urllib.request.urlopen("https://raw.githubusercontent.com/Pantani/tdmcp/main/td/bootstrap.py").read().decode())
175
- ```
166
+ ### Step 2 — Turn on the bridge inside TouchDesigner (everyone)
176
167
 
177
- - **From the terminal** if you installed the server with `npx` (so there's no
178
- local `td/modules`), run `npx @dpantani/tdmcp install-bridge` (or
179
- `node <project-path>/dist/index.js install-bridge` from a clone). It copies the
180
- bridge to `~/tdmcp-bridge` and prints the exact line to paste in the Textport.
168
+ This is the **same one line** no matter which client you set up in Step 1 it's
169
+ what lets the server actually drive TouchDesigner.
181
170
 
182
- ### Step 3 — Connect your AI assistant
171
+ 1. **Open TouchDesigner.**
172
+ 2. Open the **Textport** (`Dialogs → Textport and DATs`), paste this **one line**
173
+ and press Enter:
183
174
 
184
- Point your AI client at the server you built in Step 1. Pick your client:
175
+ ```python
176
+ import urllib.request; exec(urllib.request.urlopen("https://raw.githubusercontent.com/Pantani/tdmcp/main/td/bootstrap.py").read().decode())
177
+ ```
185
178
 
186
- **Claude Code**
179
+ You should see:
187
180
 
188
- ```bash
189
- claude mcp add tdmcp -- node <project-path>/dist/index.js
190
181
  ```
191
-
192
- > Once tdmcp is published to npm this becomes path-free:
193
- > `claude mcp add tdmcp -- npx -y @dpantani/tdmcp`.
194
-
195
- **Claude Desktop** — the easiest route is the **one-click `.dxt` extension**
196
- described at the top of *Get started* (no config file needed). To wire it up
197
- manually instead, edit `claude_desktop_config.json`
198
- (`Settings → Developer → Edit Config`) and add:
199
-
200
- ```json
201
- {
202
- "mcpServers": {
203
- "tdmcp": {
204
- "command": "node",
205
- "args": ["<project-path>/dist/index.js"]
206
- }
207
- }
208
- }
182
+ [tdmcp] bridge running on port 9980 (/project1/tdmcp_bridge)
209
183
  ```
210
184
 
211
- **Cursor**create `.cursor/mcp.json` in your workspace:
185
+ Donea `tdmcp_bridge` node now lives in your network and is listening. ✅ It's
186
+ safe and reversible: it only adds that one tidy component, and re-running the line
187
+ just reconfigures it.
212
188
 
213
- ```json
214
- {
215
- "mcpServers": {
216
- "tdmcp": {
217
- "command": "node",
218
- "args": ["<project-path>/dist/index.js"]
219
- }
220
- }
221
- }
222
- ```
189
+ <details>
190
+ <summary>Keep it on across restarts · other install methods · removing it</summary>
191
+
192
+ <br />
193
+
194
+ - **Start it automatically in every project:** save your project as your
195
+ **Default Project**, or use the Execute-DAT auto-start in
196
+ [`td/README.md`](td/README.md).
197
+ - **If you cloned the repo** and want a set-and-forget install: add
198
+ `<project-path>/td/modules` to TouchDesigner's **Python 64-bit Module Path**
199
+ (`Edit → Preferences → General`), then run
200
+ `from mcp import install; install.run()` in the Textport.
201
+ - **From a terminal:** `npx @dpantani/tdmcp install-bridge` (or
202
+ `node <project-path>/dist/index.js install-bridge` from a clone) copies the
203
+ bridge to `~/tdmcp-bridge` and prints the Textport line.
204
+ - **Remove it later:** `from mcp import install; install.uninstall()`.
205
+ - **Port 9980 taken?** Set it in both places — the bridge
206
+ (`install.run(port=9981)`) and the client (`TDMCP_TD_PORT=9981`).
223
207
 
224
- Restart your AI client so it picks up the new server.
208
+ </details>
225
209
 
226
- ### Step 4 — Make something
210
+ ### Step 3 — Make something
227
211
 
228
- With TouchDesigner open and your AI client connected, just ask in plain language:
212
+ With TouchDesigner open and your AI connected, just ask in plain language:
229
213
 
230
214
  > *"Create an audio-reactive particle galaxy and show me a preview."*
231
215
 
@@ -233,6 +217,9 @@ The AI builds the network in your project, checks it for errors, and returns a
233
217
  thumbnail. Iterate from there: *"make it warmer,"* *"add a feedback trail,"*
234
218
  *"output it fullscreen."*
235
219
 
220
+ > 💡 Once tdmcp is published to npm, the Claude Code wiring becomes path-free:
221
+ > `claude mcp add tdmcp -- npx -y @dpantani/tdmcp`.
222
+
236
223
  ---
237
224
 
238
225
  ## Troubleshooting
@@ -240,7 +227,7 @@ thumbnail. Iterate from there: *"make it warmer,"* *"add a feedback trail,"*
240
227
  | What you see | What to do |
241
228
  | --- | --- |
242
229
  | The AI says **"TouchDesigner isn't reachable."** | Make sure TD is open and the bridge is on (Step 2). Test it: `curl http://127.0.0.1:9980/api/info` should return JSON. |
243
- | `from mcp import install` → **`No module named 'mcp'`** | The Module Path isn't set. Re-check Step 2.2 — it must point at `<project-path>/td/modules`, then restart TouchDesigner. |
230
+ | `from mcp import install` → **`No module named 'mcp'`** | You're using the Module-Path method but it isn't set point it at `<project-path>/td/modules` (see Step 2's collapsed options) and restart TouchDesigner. Or just use the one-line bootstrap in Step 2 instead. |
244
231
  | **`command not found: node` / `npm`** | Node isn't installed (or is too old). Install Node ≥ 20 from [nodejs.org](https://nodejs.org) and reopen the terminal. |
245
232
  | **Your AI client doesn't list any tdmcp tools** | Restart the client after adding the server, and double-check the path to `dist/index.js` is the full absolute path. |
246
233
  | **Port 9980 is already taken** | Set a different port in *both* places: the bridge (`install.run(port=9981)`) and the client (`TDMCP_TD_PORT=9981`). |
@@ -255,11 +242,24 @@ return a friendly "not reachable" message instead of crashing.
255
242
  **Artist tools** (describe the result, get a whole network):
256
243
  `create_visual_system`, `create_feedback_network`, `create_generative_art`,
257
244
  `create_audio_reactive`, `create_particle_system`, `create_data_visualization`,
258
- `apply_post_processing`, `setup_output`, `get_preview`, `plan_visual`.
245
+ `apply_post_processing`, `setup_output`, `get_preview`, `plan_visual`. Feedback,
246
+ particle, generative and audio-reactive systems arrive already playable — they
247
+ auto-expose a control panel (a Feedback knob, particle Drag/Turbulence/Gravity/Lifetime,
248
+ an evolution-Speed knob, an audio Sensitivity knob) you can tweak, animate, preset, or
249
+ map to a controller. Pass `expose_controls: false` to opt out.
259
250
 
260
251
  **Building blocks**: `create_node_chain`, `connect_nodes`, `create_glsl_shader`,
261
252
  `create_python_script`, `set_parameters_batch`, `create_container`,
262
- `duplicate_network`.
253
+ `duplicate_network`, `arrange_network` (tidy a messy network into a readable
254
+ left→right layout).
255
+
256
+ **Live control, animation & I/O** (make a generated system playable):
257
+ `create_control_panel` (add knobs/sliders/toggles to a COMP and bind them to node
258
+ parameters), `manage_presets` (store/recall/list named snapshots of those controls),
259
+ `animate_parameter` (drive parameters with an LFO over time — no manual keyframing),
260
+ `create_external_io` (OSC/MIDI input mapped straight to parameters, DMX/Art-Net out
261
+ for lighting, NDI/Syphon-Spout video in), and `manage_component` (save/load reusable
262
+ `.tox` components).
263
263
 
264
264
  **Atomic operations**: `create_td_node`, `delete_td_node`,
265
265
  `update_td_node_parameters`, `execute_python_script`, `exec_node_method`.
@@ -269,10 +269,12 @@ return a friendly "not reachable" message instead of crashing.
269
269
  `get_td_class_details`, `get_module_help` (plus search / summary / compare /
270
270
  snapshot helpers).
271
271
 
272
- **Recipes** — 10 validated, ready-to-build templates: `feedback_tunnel`,
273
- `reaction_diffusion`, `noise_landscape`, `audio_spectrum_bars`, `particle_galaxy`,
274
- `webcam_glitch`, `data_sonification`, `kinect_silhouette`, `led_strip_mapper`,
275
- `projection_mapping`.
272
+ **Recipes** — 11 validated, ready-to-build templates: `feedback_tunnel`,
273
+ `performable_feedback_tunnel` (the same tunnel pre-wired with live knobs for
274
+ decay/zoom/spin/blur ready to perform, animate with an LFO, or snapshot as
275
+ presets), `reaction_diffusion`, `noise_landscape`, `audio_spectrum_bars`,
276
+ `particle_galaxy`, `webcam_glitch`, `data_sonification`, `kinect_silhouette`,
277
+ `led_strip_mapper`, `projection_mapping`.
276
278
 
277
279
  **Knowledge resources** the AI reads from:
278
280
  `tdmcp://operators/{category|name}`, `tdmcp://python-api/{class}`,
@@ -337,6 +339,11 @@ machine TD runs on:
337
339
  holds even without a token); the structured endpoints keep working.
338
340
  - The MCP server itself binds to loopback (`127.0.0.1`) for both stdio and HTTP
339
341
  transports and enables DNS-rebinding protection on HTTP.
342
+ - **The bridge refuses browser cross-origin requests.** Any request carrying an
343
+ `Origin` header that isn't loopback (`127.0.0.1`/`localhost`) is rejected (HTTP
344
+ `401`), so a malicious web page open in your browser can't quietly POST to the
345
+ bridge (CSRF / DNS-rebinding → drive-by code execution). The MCP server sends no
346
+ `Origin`, so normal use is unaffected.
340
347
 
341
348
  ### Command-line agent (`tdmcp-agent`)
342
349
 
@@ -385,7 +392,7 @@ npm run smoke:live # creates a Noise→Null chain in /project1 and grabs a pre
385
392
 
386
393
  ## Current state
387
394
 
388
- - ✅ 35 tools across 3 layers, 6 resource families, 5 prompts, 10 recipes, a
395
+ - ✅ 41 tools across 3 layers, 6 resource families, 5 prompts, 11 recipes, a
389
396
  feedback engine, and the TouchDesigner Python bridge.
390
397
  - ✅ Two transports: **stdio** (default) and **Streamable HTTP**; plus an optional
391
398
  **WebSocket event stream** (TD → MCP logging notifications).
@@ -252,6 +252,24 @@ declare const RecipeSchema: z.ZodObject<{
252
252
  }, z.core.$strip>>>;
253
253
  glsl_code: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
254
254
  python_code: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
255
+ controls: z.ZodDefault<z.ZodArray<z.ZodObject<{
256
+ name: z.ZodString;
257
+ type: z.ZodDefault<z.ZodEnum<{
258
+ string: "string";
259
+ int: "int";
260
+ float: "float";
261
+ toggle: "toggle";
262
+ menu: "menu";
263
+ rgb: "rgb";
264
+ pulse: "pulse";
265
+ }>>;
266
+ label: z.ZodOptional<z.ZodString>;
267
+ min: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
268
+ max: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
269
+ default: z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodBoolean, z.ZodString]>>;
270
+ menu_items: z.ZodOptional<z.ZodArray<z.ZodString>>;
271
+ bind_to: z.ZodOptional<z.ZodArray<z.ZodString>>;
272
+ }, z.core.$strip>>>;
255
273
  preview_description: z.ZodDefault<z.ZodString>;
256
274
  }, z.core.$strip>;
257
275
  type Recipe = z.infer<typeof RecipeSchema>;
@@ -346,6 +364,7 @@ declare class TouchDesignerClient {
346
364
  path: string;
347
365
  type: string;
348
366
  name: string;
367
+ parameter_warnings?: string[] | undefined;
349
368
  }>;
350
369
  deleteNode(path: string): Promise<{
351
370
  deleted: string;
@@ -355,6 +374,7 @@ declare class TouchDesignerClient {
355
374
  path: string;
356
375
  type: string;
357
376
  name: string;
377
+ parameter_warnings?: string[] | undefined;
358
378
  }[];
359
379
  }>;
360
380
  getNode(path: string): Promise<{
@@ -362,6 +382,7 @@ declare class TouchDesignerClient {
362
382
  type: string;
363
383
  name: string;
364
384
  parameters: Record<string, unknown>;
385
+ parameter_warnings?: string[] | undefined;
365
386
  inputs?: string[] | undefined;
366
387
  outputs?: string[] | undefined;
367
388
  family?: string | undefined;
@@ -372,6 +393,7 @@ declare class TouchDesignerClient {
372
393
  type: string;
373
394
  name: string;
374
395
  parameters: Record<string, unknown>;
396
+ parameter_warnings?: string[] | undefined;
375
397
  inputs?: string[] | undefined;
376
398
  outputs?: string[] | undefined;
377
399
  family?: string | undefined;
@@ -420,6 +442,7 @@ declare class TouchDesignerClient {
420
442
  path: string;
421
443
  type: string;
422
444
  name: string;
445
+ parameter_warnings?: string[] | undefined;
423
446
  }[];
424
447
  connections: {
425
448
  source_path: string;
@@ -428,7 +451,7 @@ declare class TouchDesignerClient {
428
451
  target_input: number;
429
452
  }[];
430
453
  }>;
431
- getNetworkPerformance(path: string): Promise<{
454
+ getNetworkPerformance(path: string, recursive?: boolean): Promise<{
432
455
  nodes: {
433
456
  path: string;
434
457
  cook_time_ms: number;