td-atlas
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
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 |
|---|---|
| td_search_operatorsA | Find TouchDesigner operators by what they do. Searches names, labels, summaries and full documentation. Use this first,
in plain language ("blur an image", "read a MIDI device", "instance
geometry"). |
| td_operator_schemaA | Every parameter of an operator: exact names, defaults, menu options, ranges. Read this before creating or configuring an operator — it gives the names
TouchDesigner actually accepts. Note that TouchDesigner's own documentation
describes parameter groups (such as 't' for Translate) while the settable
parameters are the members ('tx', 'ty', 'tz'); this returns the members.
|
| td_search_parametersA | Find which operators have a parameter matching a description. Useful when you know the effect you want but not which operator provides it — "feedback amount", "sample rate", "instancing". |
| td_python_apiA | Python members and methods available on a class, with inherited ones.
|
| td_docsA | Search or read TouchDesigner's documentation, mirrored offline. Pass |
| td_expression_helpC | Look up TouchDesigner expression and command syntax. |
| td_statusA | Whether TouchDesigner is reachable, what project it has open, and whether its timeline is playing. Read the |
| td_logA | Your own trail: every bridge call this host has made, and how it went. Reach for this when something is wrong and you do not know what you did —
an operator is missing, a parameter is not what you set, the artist says
"it broke after you touched it". Every call that changed the project is listed with what it changed:
Also reach for it before repeating a call that failed.
Not everything is here, and the gap matters: only calls that reached the bridge are recorded. The offline tools (td_project_read, td_docs, td_search_operators) never dial it and leave no trace, so an empty journal means no live work, not no work. |
| td_instancesA | Which TouchDesigner instances are running, and which one these tools reach. Reach for this whenever the artist may have more than one project open —
and always before believing that an edit went where you meant. Every
other bridge tool here dials a single bridge chosen on this host (the
session file, or a |
| td_doctorA | Check the whole chain — install, index, probe pass, bridge, this server. Run this when something is wrong and it is not obvious which link broke, or before trusting a long build session. The trap it exists for is the one that raises nothing: an index built from a different TouchDesigner build still answers every question, with defaults and menu options that describe the other build, so an agent configures parameters that may not exist and the only symptom is a network that quietly does not work. It also separates 'not running' (a state) from 'registered but silent' and 'answering but refusing the token', which need different repairs. Each line names the command that fixes it. |
| td_networkA | List the operators inside a component and how they are wired. |
| td_op_infoA | Inspect one operator in the running project: type, wiring, live parameter values. |
| td_buildA | Apply several edits to the project as one atomic, undoable block. Prefer this over separate calls: if any step fails the whole batch is rolled back, so the project never ends up half-modified, and a successful batch is a single Ctrl+Z for the person using TouchDesigner. Each operation is {"method": ..., "params": {...}} where method is one of op_create, op_delete, op_connect, op_disconnect, par_set. op_create takes parent, type, name, optional pars {name: value}, optional position [x, y], optional connect [{"from": path, "index": 0}], and optional text for a DAT's contents — shader and script source belongs there, not in a separate td_exec, so it lands inside this undo block. Values may be a constant, {"expr": "..."} for an expression, {"bind": "..."} or {"pulse": true}. Parameter names are validated against the index first. Pass the same |
| td_set_paramsA | Set parameters on an existing operator, checked against the index first. Values may be a constant, {"expr": "..."} for an expression, {"bind": "..."}
or {"pulse": true}. Names and '../' OP references are validated against
the index before anything is sent; without |
| td_renderA | Render a TOP and return the image, so you can see what you built. TouchDesigner is a visual tool: check your work with this rather than
inferring it from parameter values.
|
| td_timeline_runA | Walk the timeline frame by frame and save a TOP's frames — as a job. Reach for this instead of a td_exec loop whenever frames depend on what came before them: live audio analysis, Feedback TOPs, trails, anything with history. It returns at once with a job id; poll td_timeline_status, stop with td_timeline_cancel. No request holds TouchDesigner for more than one step, so the 30 s limit on a call does not apply to the walk.
What it handles so you do not have to: it pauses the timeline and gives
the play mode back at the end (so live audio is repeatable); it walks
every frame consecutively, from the start of
|
| td_timeline_statusA | Progress of a td_timeline_run job: frame, pass, files saved, errors. For a td_timeline_profile job, the table measured so far. Without |
| td_timeline_cancelA | Stop a td_timeline_run job now; the crop and the play mode go back. Files already written stay. Without |
| td_timeline_profileA | What each operator costs per frame, on real timeline frames — as a job. Reach for this when the frame rate drops and you need to know who spends
the frame. Do not time
The timeline is paused for the walk and its play mode given back; each
step forces the whole list, so a heavy network makes each step as long as
its frame. Every operator cooks once more per frame than it would, so a
Script operator or a network/file out runs its side effect again — profile
a branch without those, or accept it. Profile a component, not |
| td_healthA | Find what is quietly broken — the failures nothing reports. Run this after building anything, and whenever a composition "looks fine but does nothing". td_errors only covers what TouchDesigner calls an error; this additionally catches:
|
| td_paletteA | Search the ready-made components TouchDesigner ships in its palette. 277 finished tools — projection mappers, corner-pinners, colour pickers, audio analysers, UI widgets. Check here before building something from scratch, then install the one you want with td_palette_load. |
| td_palette_loadA | Install one of TouchDesigner's palette components into the project. Reach for this the moment td_palette shows a component that does what you
were about to build by hand — it is one call, where the alternative is
td_exec with a
The node's final name is reported back rather than assumed: TouchDesigner
names a loaded component after its file, and numbers it ( Loading is not free: measured 0.006 s for a 20-operator component and 1.08 s for kantanMapper's 4,079, all of it on TouchDesigner's main thread. |
| td_glossaryA | Look up TouchDesigner terminology. 185 glossary entries defining the vocabulary the rest of the docs assume: Cook, Time Slice, Par, CHOP, Clone, Tox, Perform Mode, Sample. |
| td_errorsA | Every operator at or under Node errors are shown as colours in the TouchDesigner UI and are otherwise invisible to you; check this after building something. The default is the project, not |
| td_traceA | Why is this TOP black, or darker than its parameters say? Find the node. Reach for it when td_render shows black, a washed-out or a dimmed image
and every parameter looks right. Starting at the TOP at
A |
| td_execA | Run Python inside TouchDesigner and return its output. The full A script that raises still returns what it printed before the error, and
|
| td_project_readA | Read a .toe or .tox from disk, without TouchDesigner running. Returns the operator tree with wiring. |
| td_project_textA | Dump a whole .toe/.tox network as JSON, without TouchDesigner running. ' to get the file back byte for byte. Standard JSON otherwise. |
| td_project_writeA | Write an edited td_project_text dump back into a new .toe/.tox. The return leg of td_project_text: edit the JSON, hand the whole document back here, and get a file TouchDesigner opens — with no instance running. Three things to know before reaching for it, because each one is a silent wrong answer otherwise:
Changing a parameter, its expression, a DAT's code, a table cell, the wiring, the flags, the placement or the colour all work, as does deleting an operator. |
| td_variant_saveA | Keep the current state of a .toe/.tox so it can be returned to and compared. Take one before trying a direction, another after, and td_variant_diff says exactly what the direction changed. Nothing of the user's is touched: the variant is the network text plus a byte copy of the file, kept under ~/.td-atlas/variants and grouped by the project's path. That copy is what makes a restore possible at all: the rebuild is a patcher, so the text alone cannot produce a .toe. It is also cheap — measured across the shipped palette, the copy adds a median 19% on top of the text and no measurable time.
|
| td_variant_listA | List saved variants — of one .toe/.tox, or of every project that has any. Each line carries when it was saved, how large it is, and whether the original file has changed since. That last one is information rather than a warning: a restore reads the variant's own copy, so a changed original cannot affect it. |
| td_variant_restoreA | Write a saved variant back out as a .toe/.tox file. A byte copy of what was saved, not a repack: nothing is collapsed, so
TouchDesigner's toecollapse never runs and never moves a user's file aside
to a .bkp1 name. |
| td_variant_diffA | Compare two saved variants of the same project. The same semantic comparison td_project_diff runs, aimed at two saved states instead of two files: added, removed, retyped, rewired and re-parameterised operators, plus a line diff of changed DAT code. Nodes that only moved are counted separately so they cannot bury a real change. |
| td_project_grepA | Search the Python and GLSL held inside a project's DATs. Ordinary file search cannot reach this code: it lives inside the .toe
container, not on disk. |
| td_project_diffA | Compare two .toe/.tox files and report what actually changed. Reports added, removed, retyped, rewired and re-parameterised operators, plus a line diff of any changed DAT code. Nodes that were only dragged to a new position are counted separately so they cannot bury a real change. To compare a live branch before and after some edits, pass two td_snapshot
files of the same COMP. A parameter line shows what drives the parameter:
its constant, or its expression or bind text, with no mark saying which.
A file keeps only parameters that are off their default, so |
| td_snapshotA | Save a component to a file so it can be diffed later. This is how to keep "every parameter of this branch" before changing it,
instead of dumping them to text by hand. The before snapshot is also the roll-back point. td_project_text on it gives each parameter in the form td_set_params takes, with {"expr": ...} where the diff shows only the expression's text. The diff does not mark which values are expressions, so put values back from the text, not from the diff. Paths in the file start at the COMP's own name, so a snapshot of /project1/branch holds /branch/blur1, which is /project1/branch/blur1 live. td_undo is shorter while the edits are still on the undo stack. A component is written rather than the whole session because saving the session is a Save As: it repoints TouchDesigner at the snapshot file and leaves the artist working in ~/.td-atlas instead of their own project. |
| td_exampleA | Show a working example network for an operator. TouchDesigner ships an example .tox for most operators. This reads one offline and describes how it is wired and configured — a real usage reference rather than a parameter list. |
| td_undoA | Undo (or redo) the last change, including whole td_build batches. |
| td_claim_scopeA | Announce one subtree of the network as yours while you work in it. Reach for this before a run of edits whenever another agent or session may
be touching the same project: without a claim, two agents editing the same
nodes overwrite each other and neither result reports anything wrong.
The claim covers everything below Write calls must carry the same |
| td_release_scopeA | Give a claimed subtree back before its claim expires. Call it as soon as a run of edits is finished — otherwise the next agent waits out the whole time-to-live for nothing. Only the owner named on the claim can release it. |
| td_scopesA | Which subtrees other agents have claimed, and until when. Check this before editing a project someone else may be in — it is the only way to see a claim before a write bounces off it, and it names the owner to coordinate with. |
| td_extension_addA | Attach a Python class to a COMP as an extension, in one call. Reach for this instead of td_exec whenever a component needs methods or
state of its own. Done by hand it is five steps — create the COMP, create
the DAT, write the text, set three parameters on the Extensions page,
re-initialise — and the last one fails silently: measured on 2025.32460, a
wrong Extension Object expression or a class that raises in Aim it either at The class name doubles as the name of the textDAT holding the code, which
is what the generated Extension Object expression points at
( The code is parsed on this host before anything is sent, so a typo costs
no round trip. That check is not a guarantee TouchDesigner accepts it:
this host's Python may be newer than TouchDesigner's embedded 3.11, so
3.12+ syntax passes here and fails there — which is caught, but only by
the read-back above. Pass the same |
| td_annotateA | Leave a note in the network saying what you built and why. Reach for this at the end of a build, not as decoration: the network you made records what it does and nothing about why, and the person who opens the project next reads the network editor, not this conversation. An Annotate is a coloured box with your text in it, sitting beside the nodes it describes.
Pass
|
| td_annotationsA | Read the notes in a network — including the ones a person left for you. Check this before building in a project you did not build. An artist can leave a brief as an Annotate beside the nodes it concerns, which is the natural place to put it and completely invisible to every other tool here: it is not an error, not a parameter and not a name. Each note comes back with the nodes its box sits over, so a note saying "this chain is the one to keep" can be matched to the chain. That list is geometric — the tiles whose centre falls inside the box — so a node the artist dragged half out of the box counts as outside. |
| td_flagsA | Read the flags that decide whether a node runs and what is visible. Run this when a network looks right and produces nothing. A bypassed operator, a COMP with its display or render flag off, and a COMP with cooking disabled are all invisible in a parameter dump and in td_network, and each of them makes a correct network output nothing — the kind of silent failure that costs an hour of re-reading parameters.
|
| td_set_flagsA | Turn node flags on or off — bypass a node, hide it, stop it cooking. The write half of td_flags, and the way to bypass an operator without
deleting it. Every write is read back before this reports success, because the failure
it exists to prevent is silence: TouchDesigner accepts Pass the same |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 46 tools
Most tools have distinct purposes, but several overlapping pairs exist: td_health vs td_errors, td_project_read vs td_project_text, td_snapshot vs td_variant_save, and td_project_diff vs td_variant_diff all require careful reading to pick correctly. The long descriptions help, but the sheer number of near-neighbor inspection and versioning tools creates real misselection risk.
All tools share the td_ prefix, and families like timeline_run/status/cancel/profile and variant_save/list/restore/diff follow parallel patterns. However, naming mixes bare verbs (exec, render, undo, trace, build) with noun-style names (status, errors, log, scopes), and the order varies between verb_noun (set_flags) and noun_verb (project_read).
At 46 tools, this is well past the 25+ threshold for 'too many' and approaches extreme territory. Even though TouchDesigner is a broad domain, an agent will spend significant effort just selecting among this many options, and many tools are highly specialized sub-utilities that could be consolidated.
The tool surface is remarkably comprehensive: live state inspection, error checking, editing via batch, rendering, timeline jobs, offline project read/write, versioning, scopes, annotations, palette loading, and a doctor/diagnostics tool. Minor gaps exist (e.g., no direct single-op delete outside td_build, parameter reads only via td_op_info), but the full lifecycle of inspecting, editing, verifying, and documenting a project is covered.