Server has 12 well-named tools with clear verb-noun patterns (td_get_*, td_create_*, td_delete_*, td_set_*, td_connect_*, td_disconnect_*, td_execute_*, td_list_*, td_find_*). All tools have descriptions (avg ~120 chars, within 10-1024 range). Input schemas are present with type definitions and parameter descriptions. However, output schemas are NOT documented, responses are inferred from code but not formally declared. Error handling is minimal; no recovery guidance or error categorization. Token-efficiency optimizations (default field sets, pagination) are good, but missing structured error responses and confirmation patterns for destructive ops.
Connect two operators.
Create a new operator in TouchDesigner.
Delete an operator.
Disconnect an operator's connector.
Execute Python code inside TouchDesigner.
Find an empty (non-overlapping) position for a new operator in the network editor. Returns nodeX, nodeY coordinates that can be passed directly to td_create_op.
Get info about an operator. Returns minimal fields by default for token efficiency.
Output schemas not documented. Tool descriptions state what is returned (e.g., 'Returns nodeX, nodeY coordinates') but formal response schemas are absent. LLMs cannot plan downstream tool calls or extract fields reliably without documented output structure.
Destructive operations (td_delete_op, td_execute with arbitrary code) lack confirmation or dry-run patterns. No recovery guidance in error responses. Agents can irreversibly delete operators or execute untrusted code without safeguards.
Error handling is minimal. Code shows basic error returns (e.g., 'Operator not found: {path}') but no categorization (retryable vs. fatal), no recovery guidance, and no actionable next steps for LLMs. Errors like 'Invalid op_type' do not suggest fuzzy matching or discovery tools.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2026-07-28+ | v2 |
Get parameters from an operator. Returns only non-default values by default for token efficiency.
Get the actual project root path. Call this FIRST before using any other tool that requires a path. Returns the path of the top-level project COMP (e.g. "/project1" or whatever the user named it). Do not assume "/project1" — always discover the real path with this tool.
Get a screenshot of a TOP operator as base64 image.
List child operators with optional filtering and pagination.
Set multiple parameters on an operator in a single batch call.
td_execute accepts arbitrary Python code with no sandboxing, validation, or permission checks. This is a critical security risk, agents can be tricked into executing malicious code. Requires scope declaration and permission gating.
Parameter descriptions lack format/constraint details. E.g., 'op_type' says 'TD operator class name (e.g. "noiseCHOP")' but does not specify case sensitivity, valid families, or how to discover available types. 'direction' in td_find_empty_space lacks enum constraint in description.