@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 +150 -143
- package/dist/cli/agent.d.ts +24 -1
- package/dist/cli/agent.js +423 -365
- package/dist/cli/agent.js.map +1 -1
- package/dist/index.js +1723 -491
- package/dist/index.js.map +1 -1
- package/dist/knowledge/data/meta.json +1 -1
- package/dist/recipes/feedback_tunnel.json +4 -4
- package/dist/recipes/noise_landscape.json +102 -1
- package/dist/recipes/performable_feedback_tunnel.json +92 -0
- package/dist/recipes/webcam_glitch.json +5 -1
- package/package.json +1 -1
- package/recipes/feedback_tunnel.json +4 -4
- package/recipes/noise_landscape.json +102 -1
- package/recipes/performable_feedback_tunnel.json +92 -0
- package/recipes/webcam_glitch.json +5 -1
- package/td/modules/mcp/controllers/api_controller.py +29 -1
- package/td/modules/mcp/services/analysis_service.py +7 -2
- package/td/modules/mcp/services/api_service.py +25 -3
- package/td/modules/mcp/services/batch_service.py +36 -2
- package/td/modules/mcp/services/preview_service.py +84 -11
- package/td/tests/test_api_controller.py +34 -0
- package/td/tests/test_services.py +209 -0
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
|
-
|
|
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)**
|
|
48
|
-
edition is fine
|
|
49
|
-
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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
|
-
|
|
59
|
-
|
|
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
|
-
|
|
63
|
-
|
|
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
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
|
|
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
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
-
|
|
87
|
+
### Step 1 — Connect tdmcp to your AI
|
|
78
88
|
|
|
79
|
-
|
|
89
|
+
Pick the one tab that matches your client.
|
|
80
90
|
|
|
81
|
-
<details>
|
|
82
|
-
<summary
|
|
91
|
+
<details open>
|
|
92
|
+
<summary><b>🟢 Claude Desktop — one-click <code>.dxt</code> (easiest: no terminal, no Node)</b></summary>
|
|
83
93
|
|
|
84
|
-
|
|
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
|
-
|
|
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
|
-
|
|
94
|
-
**
|
|
95
|
-
|
|
96
|
-
**
|
|
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
|
-
|
|
99
|
-
|
|
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
|
-
|
|
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
|
-
|
|
116
|
+
<br />
|
|
108
117
|
|
|
109
|
-
|
|
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
|
|
115
|
-
npm run build
|
|
124
|
+
npm run setup
|
|
116
125
|
```
|
|
117
126
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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
|
-
|
|
131
|
+
- **Claude Code:**
|
|
130
132
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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
|
-
|
|
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
|
-
|
|
148
|
-
|
|
149
|
-
|
|
139
|
+
```bash
|
|
140
|
+
codex mcp add tdmcp -- node <project-path>/dist/index.js
|
|
141
|
+
```
|
|
150
142
|
|
|
151
|
-
|
|
143
|
+
Prefer editing config by hand? Add this to `~/.codex/config.toml`:
|
|
152
144
|
|
|
153
|
-
```
|
|
154
|
-
[tdmcp]
|
|
155
|
-
|
|
145
|
+
```toml
|
|
146
|
+
[mcp_servers.tdmcp]
|
|
147
|
+
command = "node"
|
|
148
|
+
args = ["<project-path>/dist/index.js"]
|
|
149
|
+
```
|
|
156
150
|
|
|
157
|
-
|
|
151
|
+
- **Cursor** — create `.cursor/mcp.json` in your workspace:
|
|
158
152
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
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
|
-
|
|
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
|
-
|
|
171
|
-
fetches the bridge and starts it for you:
|
|
164
|
+
</details>
|
|
172
165
|
|
|
173
|
-
|
|
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
|
-
|
|
178
|
-
|
|
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
|
-
|
|
171
|
+
1. **Open TouchDesigner.**
|
|
172
|
+
2. Open the **Textport** (`Dialogs → Textport and DATs`), paste this **one line**
|
|
173
|
+
and press Enter:
|
|
183
174
|
|
|
184
|
-
|
|
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
|
-
|
|
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
|
-
|
|
185
|
+
Done — a `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
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
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
|
-
|
|
208
|
+
</details>
|
|
225
209
|
|
|
226
|
-
### Step
|
|
210
|
+
### Step 3 — Make something
|
|
227
211
|
|
|
228
|
-
With TouchDesigner open and your AI
|
|
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'`** |
|
|
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** —
|
|
273
|
-
`
|
|
274
|
-
|
|
275
|
-
`
|
|
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
|
-
- ✅
|
|
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).
|
package/dist/cli/agent.d.ts
CHANGED
|
@@ -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;
|