← WebMCP Directory

Tool tree

webmcp-visual-yard.ashmangamer0406.workers.dev

Media & PersonalTools verified
Website
Visual Graph Lab
Explore capabilities
    inspect_graphAnswer

    Read the live patch: every operator node with its id, operator, name, enabled/bypass state, changed parameters, what is wired into each input, which signal operator drives which parameter, and whether it is actually executing this frame. Also lists the compiler issue list and which nodes are idle because no output needs them. Start here before changing anything. Pass nodeId to get full detail for one node (every parameter, its value, range, and whether a signal can drive it). Use get_media_topology instead when the question is about cameras and outputs.

    View tool JSON
    {
      "name": "inspect_graph",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read the live patch: every operator node with its id, operator, name, enabled/bypass state, changed parameters, what is wired into each input, which signal operator drives which parameter, and whether it is actually executing this frame. Also lists the compiler issue list and which nodes are idle because no output needs them. Start here before changing anything. Pass nodeId to get full detail for one node (every parameter, its value, range, and whether a signal can drive it). Use get_media_topology instead when the question is about cameras and outputs.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "nodeId": {
            "type": "string",
            "description": "Optional. A node id (\"glitch-1\") or a node name (\"Glitch\"). Names are matched case-insensitively; if a name is ambiguous the error lists the candidates. Focuses the report on that one node."
          }
        },
        "required": [],
        "additionalProperties": false
      }
    }
    list_operatorsAnswer

    Browse the operator catalog — the set of things this application can do. Grouped by category (sources, generators, filters, warp, composite, control, audio, outputs) with operator id, label, a one-line description, the TouchDesigner equivalent, input ports, and which parameters a signal can drive. Filter with query (free text over labels, descriptions, keywords and TD names) or category. Narrow results get the detailed form; broad results get a compact one — call describe_operator for a single operator in full.

    View tool JSON
    {
      "name": "list_operators",
      "kind": "answer",
      "impl": "imperative",
      "description": "Browse the operator catalog — the set of things this application can do. Grouped by category (sources, generators, filters, warp, composite, control, audio, outputs) with operator id, label, a one-line description, the TouchDesigner equivalent, input ports, and which parameters a signal can drive. Filter with query (free text over labels, descriptions, keywords and TD names) or category. Narrow results get the detailed form; broad results get a compact one — call describe_operator for a single operator in full.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "Optional free text, e.g. \"blur\", \"feedback\", \"audio\", \"Movie File In TOP\"."
          },
          "category": {
            "type": "string",
            "description": "Optional category filter. One of: source, generator, filter, warp, composite, control, audio, output."
          }
        },
        "required": [],
        "additionalProperties": false
      }
    }
    describe_operatorAnswer

    Full reference for one operator: what it does, its TouchDesigner equivalent, every input and output port with its type (including delayed feedback ports), and every parameter with kind, range, unit, default, menu options, help text, and whether a signal operator can drive it. Call this before set_parameter on an operator you have not used yet.

    View tool JSON
    {
      "name": "describe_operator",
      "kind": "answer",
      "impl": "imperative",
      "description": "Full reference for one operator: what it does, its TouchDesigner equivalent, every input and output port with its type (including delayed feedback ports), and every parameter with kind, range, unit, default, menu options, help text, and whether a signal operator can drive it. Call this before set_parameter on an operator you have not used yet.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "operator": {
            "type": "string",
            "description": "Operator id (\"glitch\") or label (\"Glitch\"). See list_operators."
          }
        },
        "required": [
          "operator"
        ],
        "additionalProperties": false
      }
    }
    get_media_topologyAnswer

    The end-to-end signal path, from external sources to outputs: cameras, video files, screen capture and remote phone streams with their live status and resolution; the generators feeding the texture graph; and every output with the chain that reaches it, whether it currently has a live signal, and where the picture is going (program monitor or a /output projector link). Use this to answer "is anything on screen?" and "where does the stream output come from?".

    View tool JSON
    {
      "name": "get_media_topology",
      "kind": "answer",
      "impl": "imperative",
      "description": "The end-to-end signal path, from external sources to outputs: cameras, video files, screen capture and remote phone streams with their live status and resolution; the generators feeding the texture graph; and every output with the chain that reaches it, whether it currently has a live signal, and where the picture is going (program monitor or a /output projector link). Use this to answer \"is anything on screen?\" and \"where does the stream output come from?\".",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      }
    }
    inspect_sourceAction

    Detail on one input source (camera, video file, image, screen capture, remote phone stream or text layer): live media status and resolution, the device or URL it is using, everything downstream of it, and any problem stopping it from producing frames. Use get_media_topology first if you do not know which sources exist.

    View tool JSON
    {
      "name": "inspect_source",
      "kind": "act",
      "impl": "imperative",
      "description": "Detail on one input source (camera, video file, image, screen capture, remote phone stream or text layer): live media status and resolution, the device or URL it is using, everything downstream of it, and any problem stopping it from producing frames. Use get_media_topology first if you do not know which sources exist.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "node": {
            "type": "string",
            "description": "The source node. A node id (\"glitch-1\") or a node name (\"Glitch\"). Names are matched case-insensitively; if a name is ambiguous the error lists the candidates."
          }
        },
        "required": [
          "node"
        ],
        "additionalProperties": false
      }
    }
    inspect_outputAction

    Detail on one output: whether it currently has a live signal, the whole chain feeding it, the display grade parameters applied to it, and where the picture is going (program monitor, or a /output link for a projector). Use this when someone says a screen is black.

    View tool JSON
    {
      "name": "inspect_output",
      "kind": "act",
      "impl": "imperative",
      "description": "Detail on one output: whether it currently has a live signal, the whole chain feeding it, the display grade parameters applied to it, and where the picture is going (program monitor, or a /output link for a projector). Use this when someone says a screen is black.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "node": {
            "type": "string",
            "description": "The output node. A node id (\"glitch-1\") or a node name (\"Glitch\"). Names are matched case-insensitively; if a name is ambiguous the error lists the candidates."
          }
        },
        "required": [
          "node"
        ],
        "additionalProperties": false
      }
    }
    trace_dependenciesAction

    Everything that contributes to a node and everything it affects, nearest first, with each link marked as a texture link or a signal (parameter) link, and delayed feedback links called out. Use this before deleting or rewiring something, to see what you would break.

    View tool JSON
    {
      "name": "trace_dependencies",
      "kind": "act",
      "impl": "imperative",
      "description": "Everything that contributes to a node and everything it affects, nearest first, with each link marked as a texture link or a signal (parameter) link, and delayed feedback links called out. Use this before deleting or rewiring something, to see what you would break.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "node": {
            "type": "string",
            "description": "The node to trace. A node id (\"glitch-1\") or a node name (\"Glitch\"). Names are matched case-insensitively; if a name is ambiguous the error lists the candidates."
          }
        },
        "required": [
          "node"
        ],
        "additionalProperties": false
      }
    }
    get_system_healthAnswer

    The diagnostic tool: call it whenever something looks wrong. GPU adapter, engine state, fps and frame time, texture and pipeline counts, shader compile errors with the node they belong to, audio input state with live level and detected BPM, MIDI state and devices, remote session state and connected publishers, and the full compiler issue list for the patch.

    View tool JSON
    {
      "name": "get_system_health",
      "kind": "answer",
      "impl": "imperative",
      "description": "The diagnostic tool: call it whenever something looks wrong. GPU adapter, engine state, fps and frame time, texture and pipeline counts, shader compile errors with the node they belong to, audio input state with live level and detected BPM, MIDI state and devices, remote session state and connected publishers, and the full compiler issue list for the patch.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      }
    }
    get_recent_changesAnswer

    The change log, newest first: who changed what and when, with the nodes each change touched. Human edits and agent edits are both recorded, so use this to see what a collaborator just did before you change the same thing, or to check what you yourself changed before calling revert_agent_changes.

    View tool JSON
    {
      "name": "get_recent_changes",
      "kind": "answer",
      "impl": "imperative",
      "description": "The change log, newest first: who changed what and when, with the nodes each change touched. Human edits and agent edits are both recorded, so use this to see what a collaborator just did before you change the same thing, or to check what you yourself changed before calling revert_agent_changes.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "sinceSeconds": {
            "type": "number",
            "description": "Optional. Only changes newer than this many seconds ago."
          },
          "actorKind": {
            "type": "string",
            "description": "Optional filter: \"human\" or \"agent\"."
          },
          "limit": {
            "type": "number",
            "description": "Optional maximum number of entries to return (default 25)."
          }
        },
        "required": [],
        "additionalProperties": false
      }
    }
    read_signalsAnswer

    The current numeric value of every signal (CHOP) operator, plus what each one drives and the live audio analysis behind it. Call this before wiring audio reactivity, to see whether the music is actually reaching the app and which band is moving.

    View tool JSON
    {
      "name": "read_signals",
      "kind": "answer",
      "impl": "imperative",
      "description": "The current numeric value of every signal (CHOP) operator, plus what each one drives and the live audio analysis behind it. Call this before wiring audio reactivity, to see whether the music is actually reaching the app and which band is moving.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      }
    }
    list_sketchesAnswer

    Lists all creative preloaded sketches available in Signal Yard, showcasing different aspects like audio reactivity, hand tracking gestures, recursive feedback loops, fluid simulation, and retro shaders.

    View tool JSON
    {
      "name": "list_sketches",
      "kind": "answer",
      "impl": "imperative",
      "description": "Lists all creative preloaded sketches available in Signal Yard, showcasing different aspects like audio reactivity, hand tracking gestures, recursive feedback loops, fluid simulation, and retro shaders.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      }
    }
    create_nodeAction

    Place a new operator on the canvas. Optionally name it, position it, set parameters, and connect it immediately. The operator id must come from list_operators; on a miss the error suggests the closest matches. Use insert_effect instead when you want the new operator spliced into an existing link, and route_source_to_output when you want a whole chain built.

    View tool JSON
    {
      "name": "create_node",
      "kind": "act",
      "impl": "imperative",
      "description": "Place a new operator on the canvas. Optionally name it, position it, set parameters, and connect it immediately. The operator id must come from list_operators; on a miss the error suggests the closest matches. Use insert_effect instead when you want the new operator spliced into an existing link, and route_source_to_output when you want a whole chain built.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "operator": {
            "type": "string",
            "description": "Operator id from list_operators, e.g. \"blur\", \"camera\", \"audio-band\", \"out\"."
          },
          "name": {
            "type": "string",
            "description": "Optional display name. Defaults to the operator label."
          },
          "position": {
            "type": "object",
            "description": "Canvas position in graph units. Omit to have the editor find a free slot.",
            "properties": {
              "x": {
                "type": "number",
                "description": "Horizontal position."
              },
              "y": {
                "type": "number",
                "description": "Vertical position."
              }
            },
            "required": [
              "x",
              "y"
            ],
            "additionalProperties": false
          },
          "params": {
            "type": "object",
            "description": "Optional parameter values, keyed by parameter key or label. Menu parameters accept the option name (\"Screen\") or its index (4). Values are clamped to the parameter range and the result is reported back.",
            "additionalProperties": true
          },
          "connectTo": {
            "type": "object",
            "description": "Optional immediate connection. Give `to` to feed another node, and/or `from` to feed the new node. Within `to`, use toInput for a texture input or toParameter to drive a parameter.",
            "properties": {
              "to": {
                "type": "string",
                "description": "Node the new operator should feed. A node id (\"glitch-1\") or a node name (\"Glitch\"). Names are matched case-insensitively; if a name is ambiguous the error lists the candidates."
              },
              "toInput": {
                "type": "string",
                "description": "Input port id, label, or index on that node. Omit to pick the first free one."
              },
              "toParameter": {
                "type": "string",
                "description": "Parameter on that node to drive instead of an input. Parameter key (\"amount\") or inspector label (\"Amount\"), case-insensitive. Call describe_operator or inspect_graph with a nodeId to see the list."
              },
              "from": {
                "type": "string",
                "description": "Node that should feed the new operator. A node id (\"glitch-1\") or a node name (\"Glitch\"). Names are matched case-insensitively; if a name is ambiguous the error lists the candidates."
              }
            },
            "additionalProperties": false
          }
        },
        "required": [
          "operator"
        ],
        "additionalProperties": false
      }
    }
    connect_nodesAction

    Wire one operator into another. Texture outputs go to texture inputs; a signal (CHOP) output goes either to a numeric input or, with toParameter, to a modulatable parameter so it animates every frame. If toInput and toParameter are both omitted, the first free input of the matching type is used and the response says which one. Refusals quote the editor's own reason (occupied input, type mismatch, feedback loop).

    View tool JSON
    {
      "name": "connect_nodes",
      "kind": "act",
      "impl": "imperative",
      "description": "Wire one operator into another. Texture outputs go to texture inputs; a signal (CHOP) output goes either to a numeric input or, with toParameter, to a modulatable parameter so it animates every frame. If toInput and toParameter are both omitted, the first free input of the matching type is used and the response says which one. Refusals quote the editor's own reason (occupied input, type mismatch, feedback loop).",
      "inputSchema": {
        "type": "object",
        "properties": {
          "from": {
            "type": "string",
            "description": "Source node. A node id (\"glitch-1\") or a node name (\"Glitch\"). Names are matched case-insensitively; if a name is ambiguous the error lists the candidates."
          },
          "to": {
            "type": "string",
            "description": "Destination node. A node id (\"glitch-1\") or a node name (\"Glitch\"). Names are matched case-insensitively; if a name is ambiguous the error lists the candidates."
          },
          "toInput": {
            "type": "string",
            "description": "Optional input port id (\"in-0\"), label (\"Texture 1\"), or index (\"0\")."
          },
          "toParameter": {
            "type": "string",
            "description": "Optional parameter to drive instead of an input. Parameter key (\"amount\") or inspector label (\"Amount\"), case-insensitive. Call describe_operator or inspect_graph with a nodeId to see the list."
          }
        },
        "required": [
          "from",
          "to"
        ],
        "additionalProperties": false
      }
    }
    disconnectAction

    Remove a link. Identify it by edgeId, or by the from/to pair (every link between them is removed), or by to plus toParameter to stop a signal driving that parameter. Do this before set_parameter on a parameter that is currently animated.

    View tool JSON
    {
      "name": "disconnect",
      "kind": "act",
      "impl": "imperative",
      "description": "Remove a link. Identify it by edgeId, or by the from/to pair (every link between them is removed), or by to plus toParameter to stop a signal driving that parameter. Do this before set_parameter on a parameter that is currently animated.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "edgeId": {
            "type": "string",
            "description": "Optional exact link id, as shown by inspect_graph."
          },
          "from": {
            "type": "string",
            "description": "Optional source node. A node id (\"glitch-1\") or a node name (\"Glitch\"). Names are matched case-insensitively; if a name is ambiguous the error lists the candidates."
          },
          "to": {
            "type": "string",
            "description": "Optional destination node. A node id (\"glitch-1\") or a node name (\"Glitch\"). Names are matched case-insensitively; if a name is ambiguous the error lists the candidates."
          },
          "toParameter": {
            "type": "string",
            "description": "Optional parameter on `to` whose signal link should be cut. Parameter key (\"amount\") or inspector label (\"Amount\"), case-insensitive. Call describe_operator or inspect_graph with a nodeId to see the list."
          }
        },
        "required": [],
        "additionalProperties": false
      }
    }
    set_parameterAction

    Change one parameter on one node, live. Menu parameters accept the option name or its index; numbers are clamped to the parameter range; the response reports the value that actually landed. Refuses when the parameter is currently driven by a signal operator, because the signal would overwrite it next frame. Use set_parameters for several at once.

    View tool JSON
    {
      "name": "set_parameter",
      "kind": "act",
      "impl": "imperative",
      "description": "Change one parameter on one node, live. Menu parameters accept the option name or its index; numbers are clamped to the parameter range; the response reports the value that actually landed. Refuses when the parameter is currently driven by a signal operator, because the signal would overwrite it next frame. Use set_parameters for several at once.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "nodeId": {
            "type": "string",
            "description": "The node to change. A node id (\"glitch-1\") or a node name (\"Glitch\"). Names are matched case-insensitively; if a name is ambiguous the error lists the candidates."
          },
          "parameter": {
            "type": "string",
            "description": "Parameter key (\"amount\") or inspector label (\"Amount\"), case-insensitive. Call describe_operator or inspect_graph with a nodeId to see the list."
          },
          "value": {
            "description": "New value. Number for float/int, true/false for bool, option name or index for menu, string for text, \"#rrggbb\" or [r,g,b,a] (0..1) for colour."
          }
        },
        "required": [
          "nodeId",
          "parameter",
          "value"
        ],
        "additionalProperties": false
      }
    }
    set_parametersAction

    Change several parameters on one node in a single call — the right tool for an instruction like "make it more aggressive". Every parameter name is validated before anything is written, so a typo changes nothing.

    View tool JSON
    {
      "name": "set_parameters",
      "kind": "act",
      "impl": "imperative",
      "description": "Change several parameters on one node in a single call — the right tool for an instruction like \"make it more aggressive\". Every parameter name is validated before anything is written, so a typo changes nothing.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "nodeId": {
            "type": "string",
            "description": "The node to change. A node id (\"glitch-1\") or a node name (\"Glitch\"). Names are matched case-insensitively; if a name is ambiguous the error lists the candidates."
          },
          "params": {
            "type": "object",
            "description": "Parameter key or label → new value. Same value rules as set_parameter.",
            "additionalProperties": true
          }
        },
        "required": [
          "nodeId",
          "params"
        ],
        "additionalProperties": false
      }
    }
    delete_nodeSensitive Action

    Delete one operator and every link touching it. Call trace_dependencies first if you are unsure what it feeds — deleting a node in the middle of a chain leaves the downstream operator unwired.

    View tool JSON
    {
      "name": "delete_node",
      "kind": "transact",
      "impl": "imperative",
      "description": "Delete one operator and every link touching it. Call trace_dependencies first if you are unsure what it feeds — deleting a node in the middle of a chain leaves the downstream operator unwired.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "node": {
            "type": "string",
            "description": "The node to delete. A node id (\"glitch-1\") or a node name (\"Glitch\"). Names are matched case-insensitively; if a name is ambiguous the error lists the candidates."
          }
        },
        "required": [
          "node"
        ],
        "additionalProperties": false
      }
    }
    delete_nodesSensitive Action

    Delete several operators and all their links in one call, recorded as a single history entry.

    View tool JSON
    {
      "name": "delete_nodes",
      "kind": "transact",
      "impl": "imperative",
      "description": "Delete several operators and all their links in one call, recorded as a single history entry.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "nodes": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Node ids or names to delete. A node id (\"glitch-1\") or a node name (\"Glitch\"). Names are matched case-insensitively; if a name is ambiguous the error lists the candidates."
          }
        },
        "required": [
          "nodes"
        ],
        "additionalProperties": false
      }
    }
    insert_effectAction

    Splice an operator into an existing texture link, so "add a VHS look to camera 1" needs no rewiring: the upstream link is broken, the new operator is placed between the two nodes, and both links are remade. Identify the link with after (the node the effect goes below), before (the node it goes above), both, or an exact edgeId.

    View tool JSON
    {
      "name": "insert_effect",
      "kind": "act",
      "impl": "imperative",
      "description": "Splice an operator into an existing texture link, so \"add a VHS look to camera 1\" needs no rewiring: the upstream link is broken, the new operator is placed between the two nodes, and both links are remade. Identify the link with after (the node the effect goes below), before (the node it goes above), both, or an exact edgeId.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "operator": {
            "type": "string",
            "description": "Effect operator id from list_operators, e.g. \"glitch\", \"bloom\", \"rgb-shift\"."
          },
          "after": {
            "type": "string",
            "description": "Optional. Insert directly downstream of this node. A node id (\"glitch-1\") or a node name (\"Glitch\"). Names are matched case-insensitively; if a name is ambiguous the error lists the candidates."
          },
          "before": {
            "type": "string",
            "description": "Optional. Insert directly upstream of this node. A node id (\"glitch-1\") or a node name (\"Glitch\"). Names are matched case-insensitively; if a name is ambiguous the error lists the candidates."
          },
          "edgeId": {
            "type": "string",
            "description": "Optional exact link id from inspect_graph."
          }
        },
        "required": [
          "operator"
        ],
        "additionalProperties": false
      }
    }
    bypass_nodeAction

    Bypass or un-bypass an operator. A bypassed filter passes its first input straight through, which is the safe way to A/B an effect without deleting it or losing its parameters.

    View tool JSON
    {
      "name": "bypass_node",
      "kind": "act",
      "impl": "imperative",
      "description": "Bypass or un-bypass an operator. A bypassed filter passes its first input straight through, which is the safe way to A/B an effect without deleting it or losing its parameters.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "node": {
            "type": "string",
            "description": "The node to bypass. A node id (\"glitch-1\") or a node name (\"Glitch\"). Names are matched case-insensitively; if a name is ambiguous the error lists the candidates."
          },
          "bypass": {
            "type": "boolean",
            "description": "true to bypass (default), false to bring the operator back into the chain."
          }
        },
        "required": [
          "node"
        ],
        "additionalProperties": false
      }
    }
    enable_nodeAction

    Enable or disable an operator. A disabled operator outputs nothing at all, so everything downstream of it goes black — prefer bypass_node when you only want to skip an effect.

    View tool JSON
    {
      "name": "enable_node",
      "kind": "act",
      "impl": "imperative",
      "description": "Enable or disable an operator. A disabled operator outputs nothing at all, so everything downstream of it goes black — prefer bypass_node when you only want to skip an effect.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "node": {
            "type": "string",
            "description": "The node to change. A node id (\"glitch-1\") or a node name (\"Glitch\"). Names are matched case-insensitively; if a name is ambiguous the error lists the candidates."
          },
          "enabled": {
            "type": "boolean",
            "description": "true to enable (default), false to disable."
          }
        },
        "required": [
          "node"
        ],
        "additionalProperties": false
      }
    }
    route_source_to_outputAction

    Build or repair a whole video chain in one call: source → optional effects → output. Any operator that does not exist yet is created (so source="camera" makes a Camera node if there is none), links that point somewhere else are replaced, and links that are already correct are left alone. This is the tool for "send the clean camera to the stream output" or "put a glitch and a bloom between the camera and the program out".

    View tool JSON
    {
      "name": "route_source_to_output",
      "kind": "act",
      "impl": "imperative",
      "description": "Build or repair a whole video chain in one call: source → optional effects → output. Any operator that does not exist yet is created (so source=\"camera\" makes a Camera node if there is none), links that point somewhere else are replaced, and links that are already correct are left alone. This is the tool for \"send the clean camera to the stream output\" or \"put a glitch and a bloom between the camera and the program out\".",
      "inputSchema": {
        "type": "object",
        "properties": {
          "source": {
            "type": "string",
            "description": "The start of the chain: an existing node (A node id (\"glitch-1\") or a node name (\"Glitch\"). Names are matched case-insensitively; if a name is ambiguous the error lists the candidates.) or an operator id such as \"camera\", \"remote-in\", \"video\", \"noise-top\"."
          },
          "output": {
            "type": "string",
            "description": "The end of the chain: an existing output node, or an operator id (\"out\" for the program monitor, \"remote-out\" for a projector/stream link). Defaults to \"out\"."
          },
          "effects": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Optional operators to pass through, in order. An operator id creates a new node (\"glitch\"); an existing node id reuses that node (\"glitch-1\")."
          }
        },
        "required": [
          "source"
        ],
        "additionalProperties": false
      }
    }
    make_parameter_reactiveAction

    Animate a parameter from the music (or from an oscillator, or from hand tracking) in one call. Creates the right signal operator — Audio Band for bass/mid/treble, Audio In for level, Beat for onsets, LFO for a steady sweep, Hand In for palms, pinches, two-hand distance, or individual fingertips — places it near the target, wires it to the parameter, and shapes its output range so the movement is actually visible. Add a Range operator when the parameter does not live in 0..1. Use amount, or explicit low/high, to control how far it swings.

    View tool JSON
    {
      "name": "make_parameter_reactive",
      "kind": "act",
      "impl": "imperative",
      "description": "Animate a parameter from the music (or from an oscillator, or from hand tracking) in one call. Creates the right signal operator — Audio Band for bass/mid/treble, Audio In for level, Beat for onsets, LFO for a steady sweep, Hand In for palms, pinches, two-hand distance, or individual fingertips — places it near the target, wires it to the parameter, and shapes its output range so the movement is actually visible. Add a Range operator when the parameter does not live in 0..1. Use amount, or explicit low/high, to control how far it swings.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "nodeId": {
            "type": "string",
            "description": "The node whose parameter should move. A node id (\"glitch-1\") or a node name (\"Glitch\"). Names are matched case-insensitively; if a name is ambiguous the error lists the candidates."
          },
          "parameter": {
            "type": "string",
            "description": "The parameter to animate. Parameter key (\"amount\") or inspector label (\"Amount\"), case-insensitive. Call describe_operator or inspect_graph with a nodeId to see the list. It must be modulatable."
          },
          "source": {
            "type": "string",
            "description": "What drives it: \"bass\", \"mid\", \"treble\" (frequency bands), \"level\" (overall loudness), \"beat\" (onset envelope), \"lfo\" (steady oscillator), or hand tracking: \"hand-x\", \"hand-y\", \"pinch\", \"openness\", \"hand-distance\"."
          },
          "amount": {
            "type": "number",
            "description": "Optional 0..1, default 0.75: the fraction of the parameter's full range the movement covers. Ignored when low and high are given."
          },
          "low": {
            "type": "number",
            "description": "Optional. Exact value the parameter takes when the signal is at its minimum."
          },
          "high": {
            "type": "number",
            "description": "Optional. Exact value the parameter takes when the signal peaks."
          },
          "replace": {
            "type": "boolean",
            "description": "Optional. Set true to replace a signal that already drives this parameter. Defaults to false, which refuses rather than silently rewiring."
          }
        },
        "required": [
          "nodeId",
          "parameter",
          "source"
        ],
        "additionalProperties": false
      }
    }
    load_sketchAction

    Loads one of the creative preloaded sketches onto the canvas, replacing the current patch (undoable). Use list_sketches to see available sketches and what aspects they showcase.

    View tool JSON
    {
      "name": "load_sketch",
      "kind": "act",
      "impl": "imperative",
      "description": "Loads one of the creative preloaded sketches onto the canvas, replacing the current patch (undoable). Use list_sketches to see available sketches and what aspects they showcase.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "sketchId": {
            "type": "string",
            "description": "The id of the sketch to load: \"cyberpunk-glitch\", \"hand-tracking-puppet\", \"infinite-feedback-tunnel\", \"liquid-oil-slick\", \"kinetic-typography\", \"retro-arcade-cmyk\", \"cosmic-polar-wormhole\", \"camera-kaleidoscope\"."
          }
        },
        "required": [
          "sketchId"
        ],
        "additionalProperties": false
      }
    }
    revert_agent_changesAction

    Undo everything the agent changed recently, leaving edits made by the human operator in place. Use this when the user says "put it back how it was" after you have made several changes; use undo for a single step regardless of who made it.

    View tool JSON
    {
      "name": "revert_agent_changes",
      "kind": "act",
      "impl": "imperative",
      "description": "Undo everything the agent changed recently, leaving edits made by the human operator in place. Use this when the user says \"put it back how it was\" after you have made several changes; use undo for a single step regardless of who made it.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "sinceSeconds": {
            "type": "number",
            "description": "How far back to reverse, in seconds. Default 120."
          }
        },
        "required": [],
        "additionalProperties": false
      }
    }
    undoAction

    Undo the most recent change, whoever made it. Prefer revert_agent_changes when you specifically want to take back your own edits.

    View tool JSON
    {
      "name": "undo",
      "kind": "act",
      "impl": "imperative",
      "description": "Undo the most recent change, whoever made it. Prefer revert_agent_changes when you specifically want to take back your own edits.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      }
    }
    redoAction

    Redo the change that was most recently undone.

    View tool JSON
    {
      "name": "redo",
      "kind": "act",
      "impl": "imperative",
      "description": "Redo the change that was most recently undone.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      }
    }