Skip to main content
Glama

hydra-mcp

An MCP server that lets an AI agent live-code Hydra, the browser video synth, alongside a person, and send the result to other software as a real video source.

  • Two targets. The agent can drive Hydra in its own local performer page, or in an ordinary Hydra tab such as hydra.ojack.xyz.

  • Dry-run first. Every piece of code runs in a hidden second Hydra instance before it touches the live canvas. A misspelled function or broken shader comes back as a real error, with the live output untouched.

  • Shared piece, safe ownership. The agent and a person write into one shared composition, and neither can silently overwrite the other.

  • Sees its own output. The agent takes screenshots, so it can check what it made.

  • Performance tools. Crossfades, custom GLSL functions, image and video sources, camera and microphone input, a sketch library, and share links.

  • Native video out. Syphon (macOS) and NDI, for TouchDesigner, OBS, Resolume and other hosts.

MCP client ──stdio──> server/hydra_mcp.py ──HTTP──> deck/hydra_deck.py ──WebSocket──> Hydra tab(s)
(your agent)          (thin MCP proxy)              (long-lived, 127.0.0.1:8140)       │
                                                                                        └─ frames ─> out/hydra_out.py ─> Syphon / NDI

Contents

  1. Requirements

  2. Install

  3. Run it

  4. Connect your MCP client

  5. The performer page

  6. Tools

  7. Working with the tools (for agents)

  8. Driving an existing Hydra tab

  9. Video out: Syphon and NDI

  10. Configuration

  11. How it works

  12. Security model

  13. Troubleshooting

  14. Known limitations

  15. Project layout and development

  16. Licence


Related MCP server: bespoke-mcp

Requirements

Needed for

What

Everything

uv. It installs the right Python for you: 3.10+ for the deck, 3.12 for video out

The Hydra page

A Chromium-based browser (Chrome, Edge, Brave, Arc). Firefox and Safari can run the page, but not video out

Syphon out

macOS

NDI out

macOS, Windows or Linux. Receivers need NDI support (TouchDesigner, OBS with the NDI plugin, NDI Tools, …)

Driving hydra.ojack.xyz

Chrome, with the unpacked extension in link/

No Node.js is needed to run anything. The browser dependencies are vendored.

Install

git clone https://github.com/brandon-stargrave/hydra-mcp.git
cd hydra-mcp
uv sync                                   # deck + MCP server

Video out is optional and has its own environment. Install only the outputs you want:

cd out
uv sync --extra syphon --extra ndi        # macOS: both
uv sync --extra ndi                       # Windows / Linux: NDI only
cd ..

Run it

1. Start the deck and leave it running. It is the process that holds the piece.

uv run deck/hydra_deck.py

2. Open the performer page in a browser window you can see: http://127.0.0.1:8140/. Keep it visible, because browsers throttle background tabs (see Troubleshooting).

3. Connect your MCP client (next section). The client starts server/hydra_mcp.py itself.

4. (Optional) Start video out:

cd out && uv run --extra syphon --extra ndi hydra_out.py --ndi

Then have the agent call hydra_video_out(action="start").

Connect your MCP client

The MCP server is a stdio process. Every MCP client wants the same three things: a command, its arguments, and optional environment variables. Use absolute paths, because clients don't run your shell and inherit no PATH. Find uv with which uv.

Most MCP clients take an mcpServers entry in this shape. Your client's docs say where its config file lives:

{
  "mcpServers": {
    "hydra": {
      "command": "/absolute/path/to/uv",
      "args": ["--directory", "/absolute/path/to/hydra-mcp", "run", "server/hydra_mcp.py"]
    }
  }
}

If your client has an mcp add command instead, give it the same command and arguments.

Restart the client afterwards. It should list 19 hydra_* tools. The server finds the deck at http://127.0.0.1:8140 unless told otherwise (see Configuration). If the deck isn't running, every tool returns {"ok": false, "error": "unreachable"} with the command to start it.

The performer page

URL

What

http://127.0.0.1:8140/

Performer view: the canvas, a code editor over it, and a status line

http://127.0.0.1:8140/out

Clean full-screen output for a second screen, projector or browser source. Follows the performer page by default

?role=primary / ?role=mirror

Choose which tab answers the agent (see Tabs and roles)

?audio=1

Turn on microphone input so a.fft works. The browser asks for permission

?w=1920&h=1080

Render size (default 1280×720)

/out?hud=1

Show the status line on /out

The editor shows the shared composition as // @block <name> sections.

Keys

Action

Ctrl+Enter (or Cmd+Enter)

Run the block under the cursor. It is dry-run first and saved to the document as yours

Shift+Ctrl+Enter

Run every block

Shift+Ctrl+H

Hide or show the editor and status line

Shift+Ctrl+R

Pull in changes the agent made while you had unsent edits. The editor never types over you

Tools

All tools return JSON (and hydra_look also returns an image). Failures come back as {"ok": false, "error": "...", "say": "...", "hint": "..."} rather than exceptions.

Reading

Tool

Arguments

Returns

hydra_state

—

Connected tabs (role, adapter, visible, fps, size, speed/bpm, mic permission, live sources), blocks with authors and the outputs they draw into, recent runtime warnings

hydra_document

—

Every block (name, code, author) and the whole piece as text. For an existing Hydra tab, also tab_editor: that tab's own editor text

hydra_look

max_width=640

A PNG screenshot of what is on screen. Refuses honestly if the tab is hidden

hydra_reference

name="", type=""

Hydra's transform functions read live from the engine: all names by type plus the primer, one function's inputs and defaults, or every function of a type

Writing the piece

Tool

Arguments

Does

hydra_block

name, code, validate=true, take=false

Writes, dry-runs and runs one named block. Other blocks keep playing

hydra_crossfade

name, code, seconds=4, validate=true, take=false

Like hydra_block, but fades to the new code instead of cutting

hydra_drop

name, take=false

Removes a block. Blanks outputs only it drew into, and re-runs any other block on the same output

hydra_sketch

code, validate=true, take=false

Replaces the whole piece. Split it with // @block <name> lines

hydra_define

name, type, glsl, inputs=[], take=false

Adds a custom GLSL transform (Hydra's setFunction), compiled in a throwaway chain first

The instrument

Tool

Arguments

Does

hydra_render

output="all"

Shows o0–o3 full-screen, or all four as a grid

hydra_transport

speed, bpm, width+height (any subset)

Global clock and canvas size

hydra_source

slot (s0–s3), kind (image / video / cam / screen / clear), target

Loads an external source. Reports live, pending_permission or why it failed

hydra_audio

enable, bins, smooth, cutoff, scale, show

Reads or tunes a.fft. enable=true reloads the page with the microphone on

hydra_video_out

action (start / stop / status), fps=30

Streams the canvas to Syphon/NDI and reports the fps measured at both ends

hydra_hush

—

Panic: blank everything and reset speed. The document is archived first

Library and sharing

Tool

Arguments

Does

hydra_save

name, tags=[], overwrite=false

Saves the piece, with authors and a thumbnail, to sketches/

hydra_load

name, take=false, validate=true

Loads a saved piece, keeping each block's original author

hydra_sketches

query=""

Lists saved pieces, filtered by name or tag

hydra_share_url

—

A hydra.ojack.xyz link that opens the piece in the official editor. Built locally; nothing is uploaded

Each tool's own description (what your client shows the agent) goes into more detail. A primer on Hydra idioms is at knowledge/hydra-primer.md and is returned by hydra_reference().

Working with the tools (for agents)

The loop that works:

  1. hydra_state: is a tab connected and visible? Is anything erroring?

  2. hydra_document: what is already playing, and who wrote it? Extend the piece; don't talk over it.

  3. hydra_block: write one named block. If it's refused, read errors, fix, try again. Don't pass validate=false just to get past an error.

  4. hydra_look: look before you describe anything. Code that runs cleanly can still render black, blown out or frozen.

Conventions:

  • Outputs and blocks. There are four outputs, o0–o3. A bare .out() means .out(o0). Give each output its own block (base → o0, texture → o1, mix → o2), and use a show block holding render(o2).

  • Values. Plain numbers are compiled into the shader. For motion, use functions (() => Math.sin(time)) or arrays ([1, 2, 4].fast(0.5)).

  • Feedback. Read an output back into itself: src(o0).scale(1.01).blend(o1, 0.1).out(o0).

  • Big changes mid-set. Use hydra_crossfade. hydra_hush is for emergencies only.

  • Permissions. Never assume someone clicked Allow. Camera and microphone report pending_permission until they do.

  • take=true. It exists only for when the person playing asked you to take over their work.

Example session:

hydra_state()                                     → one primary tab, visible, 60 fps, no blocks
hydra_sketch("// @block base\nosc(14, 0.04, 1.3).kaleid(6).out(o0)\n// @block show\nrender(o0)")
hydra_look()                                      → check it
hydra_block("texture", "noise(2.5, 0.1).modulateScale(osc(4), 0.5).out(o1)")
hydra_block("mix", "src(o0).modulate(o1, 0.12).out(o2)")
hydra_block("show", "render(o2)")
hydra_crossfade("base", "voronoi(8, 0.3, 0.2).color(1, 0.4, 0.8).out(o0)", seconds=6)
hydra_save("first-set", tags=["kaleid", "modulate"])

Driving an existing Hydra tab

The agent can also play inside a normal Hydra editor tab, such as hydra.ojack.xyz. The agent's blocks are written into that tab's own editor as // @block sections, and the tab's own code stays in charge.

Chrome won't let a public HTTPS page reach 127.0.0.1 without a prompt, and Safari blocks it outright. So the reliable route is the small unpacked Chrome extension in link/: its background worker holds the connection to the deck.

Install the extension (once):

  1. In Chrome, open chrome://extensions and turn on Developer mode (top right).

  2. Click Load unpacked (top left) and select the repository's link folder. Select the folder itself, not a file inside it.

  3. Copy the ID shown on the new "Hydra Deck Link" card.

  4. Add it to ~/.hydra-deck/config.json, which allows the extension to connect:

    { "extension_ids": ["<the id you copied>"] }
  5. Restart the deck.

Use it:

  1. Open (or reload) https://hydra.ojack.xyz. The extension attaches automatically; on any other Hydra page, click the extension's toolbar icon. Close the site's intro panel so you can see the editor.

  2. Make that tab the one the agent drives. Either close the deck's own page, or open the deck page as http://127.0.0.1:8140/?role=mirror.

  3. hydra_state now shows a primary tab with adapter: "ojack".

What changes for this kind of tab:

  • hydra_document includes tab_editor, that tab's live editor text.

  • hydra_sketch refuses (tab_has_other_code) if the editor holds code the agent didn't write.

  • hydra_drop restores outputs from the tab's own editor sections.

After changing anything in deck/page/, run tools/sync-link.sh. Then press ↻ on the extension card and reload the Hydra tab. Tabs that were already open keep the old scripts.

A zero-install alternative (experimental) is to paste this into the Hydra tab's DevTools console. Chrome asks once for local network access; Safari can't do this.

(s => { s.src = 'http://127.0.0.1:8140/bridge.js'; document.head.appendChild(s); })(document.createElement('script'))

Video out: Syphon and NDI

hydra_video_out(action="start") streams the primary tab's canvas, frame by frame, to out/hydra_out.py. That process publishes it as:

Output

Platform

Receivers see it as

Notes

Syphon

macOS

Python:Hydra (TouchDesigner shows senders as App:Server)

Published flipped for GL receivers. Use --no-flip if yours shows it upside down

NDI

macOS / Windows / Linux

<MACHINE NAME> (Hydra)

Pass --ndi. Reaches other machines on the network

cd out
uv run --extra syphon --extra ndi hydra_out.py --ndi          # both
uv run --extra ndi hydra_out.py --ndi --no-syphon              # NDI only
uv run hydra_out.py --help                                     # --name, --no-flip, …

hydra_video_out reports measurements, not the fps you asked for:

  • page_after_2s.sent_fps and dropped: what the tab actually sent.

  • out_after_2s.fps: what was published.

  • syphon_clients and ndi_connections: whether anything is receiving.

Frames are dropped, never queued, when the receiver falls behind, so latency stays low.

In TouchDesigner:

  • Syphon. Add a Syphon Spout In TOP and pick Python:Hydra. Plain Hydra matches nothing and leaves the checkerboard.

  • NDI. Add an NDI In TOP and choose the source in its Name menu.

  • Throughput. Measured on an Apple Silicon Mac at 1280×720, both paths delivered 30 fps to TouchDesigner.

Video out requires the primary tab to be in a Chromium browser and visible.

Configuration

~/.hydra-deck/config.json is read by the deck, the MCP server and video out. Environment variables override it. Every key is optional:

Key

Env

Default

What

port

HYDRA_DECK_PORT

8140

Deck port

token

HYDRA_DECK_TOKEN

—

If set, the control API requires X-Hydra-Token (the MCP server sends it automatically)

—

HYDRA_DECK_URL

http://127.0.0.1:<port>

Where the MCP server looks for the deck

allowed_origins

—

["https://hydra.ojack.xyz"] is always allowed

Extra browser origins allowed to connect, e.g. a self-hosted Hydra editor

extension_ids

—

—

IDs of the link/ extension allowed to connect

out_port

HYDRA_OUT_PORT

8141

Video out port

—

HYDRA_DECK_HOME

~/.hydra-deck

Where config, the live document and hush archives live

State on disk:

  • ~/.hydra-deck/document.json holds the current piece. A restarted deck replays it into a newly opened page.

  • ~/.hydra-deck/hushed-*.json holds what hydra_hush cleared.

  • sketches/ holds the saved library. It is git-ignored.

How it works

  • Why two processes. An MCP stdio server lives only as long as one client session, and a performance must not end when a chat restarts. So the long-lived deck holds the document and the browser connections. The MCP server only forwards requests.

  • Tabs and roles. Every connected tab is a primary or a mirror:

    • The primary validates, runs code, takes screenshots and streams video.

    • Mirrors run the same code and never answer.

    • Who is primary: an explicit ?role=primary wins. Otherwise it's the longest-connected tab that didn't ask to be a mirror.

  • Adapters. bridge-core.js is the same in every tab; a small adapter says where Hydra lives:

    • deck is this project's page.

    • ojack is the official editor, CodeMirror 5 or 6.

    • generic is any page with a running Hydra, such as Strudel's initHydra.

  • Validation.

    • Why shaders need a separate check. Hydra's shader failures are silent: its bundled renderer never checks compile status, so a broken shader just renders black.

    • The dry run. Code runs inside with (synth) { … } against a second, non-global Hydra on a small offscreen canvas.

    • The shader check. Every fragment shader generated along the way is compiled again with raw WebGL, which returns the real error log.

    • Custom functions. Functions defined with setFunction are replayed into the validator, so blocks that use them validate too.

  • Ownership. Blocks record author: "agent" (anything through MCP) or author: "human" (typed in the deck page's editor). Refusal codes are human_block and human_blocks. Nothing arriving over HTTP can write as human.

Security model

Running code in the tab is arbitrary JavaScript in someone's browser, so the deck is strict:

  • Loopback only. Everything binds to 127.0.0.1.

  • Control API. /deck/* refuses any request that carries an Origin header, which means every web page. Every route requires Host: 127.0.0.1:<port> (or localhost), which defeats DNS rebinding. An optional token adds a shared secret.

  • WebSocket. It accepts only allow-listed browser origins: the deck itself, https://hydra.ojack.xyz, your allowed_origins, and your extension_ids.

  • Tabs only report. A connected tab can never make another tab run code. The one exception is the deck page's own editor, on the deck's own origin.

  • Extension scope. The extension's worker only connects to ws://127.0.0.1:8140. A page can't choose where it connects.

Troubleshooting

Symptom

Cause and fix

Every tool returns unreachable

The deck isn't running: uv run deck/hydra_deck.py

no_page

No Hydra tab is connected. Open http://127.0.0.1:8140/ or attach a Hydra tab

hydra_look says the tab is hidden, or no_frame

Background tabs and minimized windows are throttled. Bring the primary tab's window to the front

Screenshots come out black where you expected content

Empty outputs are transparent, and screenshots flatten them onto black, as on screen. Check that the output you render is being drawn

A block is refused with a GLSL log

That is the dry run working. Fix the shader. Note that sum() doesn't compile in hydra-synth 1.4.0; use add

human_block / human_blocks

The block was written by the person at the page. Use another name, or take=true if they asked

no_spare_outputs on crossfade

A fade borrows two outputs no other block uses. Free one with hydra_drop, or cut with hydra_block

Camera shows pending_permission

The browser is waiting for someone to click Allow

Microphone denied

Allow the microphone for 127.0.0.1:8140 in the browser's site settings

Image or video source not_live

The URL must allow cross-origin use (CORS)

The extension tab never appears in hydra_state

Its ID isn't in extension_ids, or the tab was open before the extension loaded (reload it). Look for refused a websocket from origin in the deck's output

Changes to page code don't take effect in the extension tab

Run tools/sync-link.sh, press ↻ on the extension card, and reload the tab

TouchDesigner Syphon In shows a checkerboard

Choose sender Python:Hydra, not Hydra

Syphon image upside down in your receiver

Restart video out with --no-flip

out_not_running

Start out/hydra_out.py first

High dropped count in video out

Lower the resolution (hydra_transport(width=…, height=…)) or the fps

Known limitations

  • Browsers. Video out needs a Chromium browser (it uses MediaStreamTrackProcessor).

  • Mirrors. Mirrors have their own clock and microphone, so audio-reactive visuals can differ between tabs. They also don't open their own camera or screen capture.

  • Screen capture. Browsers require a click inside the page, so an agent usually can't start it remotely.

  • Deleting in the editor. Deleting a block's text in the deck page's editor doesn't remove it from the document. Use hydra_drop.

  • Extensions. Code that calls loadScript (Hydra extensions) skips the dry run, and says so.

  • Paste route. The /bridge.js console route is experimental; the extension is the supported path.

Project layout and development

server/hydra_mcp.py        MCP server (stdio)
deck/hydra_deck.py         the deck: page server, WebSocket hub, control REST, document
deck/page/                 browser code (AGPL): bridge-core.js, frames.js, adapters/, index.html, out.html
deck/page/vendor/          hydra-synth 1.4.0 (unmodified) and the CodeMirror 6 bundle
link/                      Chrome extension (copies of the bridge files, kept in sync by tools/sync-link.sh)
out/hydra_out.py           video out (own pyproject, Python 3.12)
knowledge/hydra-primer.md  Hydra idioms, returned by hydra_reference()
tools/                     build-cm6.sh (rebuild the editor bundle), sync-link.sh
sketches/                  your saved library (git-ignored)
  • Rebuild the editor bundle: tools/build-cm6.sh. This needs Node.js and npm, and pins CodeMirror and esbuild versions.

  • After editing deck/page/: run tools/sync-link.sh, then reload the extension and its tabs.

  • The block parser exists twice: parse_blocks() in deck/hydra_deck.py and blocksOf() in deck/page/adapters/deck.js. Change both or neither.

  • Quick checks:

    • node --check deck/page/*.js deck/page/adapters/*.js

    • uv run python -m py_compile deck/hydra_deck.py server/hydra_mcp.py

Licence

The Python code is MIT (LICENSE). The browser code in deck/page/ and link/ is AGPL-3.0-or-later, because it runs alongside hydra-synth, which is AGPL-3.0. See THIRD_PARTY_LICENSES.md for everything bundled or installed, including the NDI runtime's terms.

Hydra is by Olivia Jack and contributors. NDI® is a registered trademark of Vizrt NDI AB.

Available Tools

19 tools
hydra_audioA

Check and tune audio reactivity (Hydra's a object), or switch it on.

With no arguments: the current a.fft band values, volume and microphone permission — a quick way to see whether sound is getting in at all.

enable=true Hydra only listens if it was started with the microphone, so this reloads the deck page with ?audio=1. The piece is replayed afterwards; the browser asks for the mic, and a.fft reads zeros until someone clicks Allow. Video out has to be started again after the reload. bins number of frequency bands in a.fft (1–64; default 4). smooth 0–1: how slowly band values fall (higher = smoother). cutoff noise floor subtracted before scaling. scale how much raw loudness it takes to reach 1. show true draws the band meters on the canvas while you tune; false hides them.

Use it in code inside a function, or it is read once and frozen: shape(4, () => 0.2 + a.fft[0] * 0.5).out(o2)

ParametersJSON Schema
NameRequiredDescriptionDefault
binsNo
showNo
scaleNo
cutoffNo
enableNo
smoothNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the sparse annotations (readOnlyHint=false, destructiveHint=false), the description discloses significant behavioral traits: enable=true reloads the deck page with ?audio=1, the piece is replayed, a.fft reads zeros until the user clicks Allow, and video out must be restarted after reload. It also exposes the non-obvious read-once freezing of parameter values outside a function. This is exactly the kind of side-effect context annotations cannot express.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The structure is exemplary: a one-line purpose up front, the no-argument behavior, a compact parameter list where each line is name + semantic, then a single-sentence caveat with a one-line code example. Despite covering six parameters and a complex reload flow, there is no filler — every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The definition covers the no-argument diagnostics behavior, all parameter semantics, the full side-effect chain of enable (reload, replay, permission prompt, video-out restart), and the in-function placement requirement — sufficient for correct invocation of a moderately complex tool. Minor gaps remain around failure modes (e.g., behavior when mic permission is permanently denied) and how state propagates to siblings like hydra_video_out, though the existing output schema covers return values.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the full burden — and it succeeds. All six parameters (bins, smooth, cutoff, scale, show, enable) are individually defined with ranges, defaults, and behavioral effects: e.g., 'bins number of frequency bands in a.fft (1–64; default 4)' and 'smooth 0–1: how slowly band values fall (higher = smoother).' This fully compensates for the empty schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening line, 'Check and tune audio reactivity (Hydra's `a` object), or switch it on,' names a specific scope of actions (check, tune, switch on) on a specific resource (Hydra's `a` audio object). This clearly separates it from siblings like hydra_source (video sources) and hydra_transport (time controls), so an agent can discriminate the tool without opening other definitions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives substantial usage context: the no-argument call is framed as a diagnostics path, enable=true is explained as a reload that replays the piece and re-asks for mic permission, and the critical placement caveat ('use it in code inside a function, or it is read once and frozen') tells an agent when parameter changes take effect. However, it never explicitly names sibling alternatives or states when NOT to use this tool, stopping short of a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hydra_blockA

Write one named block of Hydra code and run it, leaving every other block playing.

name: letters, digits, _ and -, starting with a letter (e.g. "base", "feedback"). Writing an existing name replaces that block — a hard cut; hydra_crossfade fades. code is ordinary Hydra JavaScript.

DRY RUN FIRST. With validate=true (the default) the code runs in a hidden second Hydra instance before it touches the live canvas. A misspelled function comes back as a ReferenceError; a broken shader comes back as the GPU's own compile log. Both are refused with live_untouched: true. Fix and call again — don't disable validation to get past an error. validate=false exists for code that loads extensions.

Human-written blocks are refused (error human_block) unless take=true, which you pass only when the person playing asked you to take that block over.

Things that trip people up:

  • Each output shows one chain: .out() means .out(o0). Four outputs, o0–o3; render(o1) shows one, render() shows all four.

  • Plain numbers are baked into the shader. For motion, pass a function — () => Math.sin(time) — or an array: [1, 2, 4].fast(0.5).

  • Feedback is reading an output back into itself: src(o0).

  • sum() does not compile in hydra-synth 1.4.0. Use add.

Examples: osc(20, 0.1, 0.8).kaleid(4).out() noise(3).modulate(osc(10), 0.2).color(0.9, 0.3, 1).out(o1) src(o0).scale(1.01).rotate(0.01).blend(osc(8), 0.1).out(o0) shape(4, () => 0.3 + a.fft[0] * 0.4).out(o2)

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYes
nameYes
takeNo
validateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description reveals important behavior: replacement is a hard cut, validation runs in a hidden second instance, errors return live_untouched: true, and human blocks are refused unless explicitly allowed. This gives the agent behavioral expectations that neither annotations nor schema provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: objective first, common failure modes second, and concrete examples last. The structure is easy to scan and fronts the most safety-critical instruction (DRY RUN FIRST).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 0% schema description coverage and 4 parameters, the description is remarkably complete. It covers validation, error modes, replacement semantics, output handling, shading gotchas, and provides working examples.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does thoroughly. It explains name validation rules, what counts as valid code, the semantics and default of validate, and the meaning and allowed case for take.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Write'), a specific resource ('one named block of Hydra code'), and a clear side effect ('leaving every other block playing'). It also distinguishes itself from the sibling hydra_crossfade by explicitly noting that replacement is a hard cut rather than a fade.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use and when-not-to-use guidance: validate=true is the default, validate=false is only for extensions, and human-written blocks are refused unless take=true. It contrasts with hydra_crossfade, making the selection between siblings actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hydra_crossfadeA

Like hydra_block, but fade from what is on screen to the new code over seconds (0.5–30) instead of cutting — the move for a big change mid-set.

How: the new code is dry-run, then a copy runs into a spare output while the old chain keeps playing; a third output blends old into new and is shown; at the end the visible output switches to the new code and both borrowed outputs are blanked.

Needs: one visible output (not the 4-up grid), and two outputs that no other block draws into or reads — otherwise it refuses with no_spare_outputs and says which are in use. The new code should draw into the visible output (.out() / .out(o0) when o0 is shown). The call returns when the fade has finished; mirrors cut instead of fading.

Example (o0 on screen, o2 and o3 free): hydra_crossfade("base", "voronoi(8, 0.3, 0.2).color(1, 0.4, 0.8).out(o0)", seconds=6)

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYes
nameYes
takeNo
secondsNo
validateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses the full internal flow: dry-run of new code, copy into a spare output, old chain continuing, a third output blending old and new, and finally switching the visible output and blanking borrowed outputs. It also explains blocking behavior ('The call returns when the fade has finished') and the refusal behavior with `no_spare_outputs`. This goes far beyond the annotations and gives the agent a precise mental model of side effects and safety.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with labeled sections: a one-sentence purpose, a 'How' paragraph, a 'Needs' paragraph, and an example. Every sentence adds useful information, and the example is compact but illustrative. It is longer than average, but the complexity of the operation justifies the length; nothing feels redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the tool's purpose, mechanics, prerequisites, error behavior, return behavior, and gives a working example, which is impressive for a complex operation. The only notable gap is that `take` and `validate` are not explained, leaving an agent uncertain about two parameters. Since an output schema exists, the lack of return-value detail is acceptable, but the missing parameter context keeps this from a perfect score.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It does add meaning for `seconds` by giving the allowed range '0.5–30' and demonstrates `name`, `code`, and `seconds` through the example. However, `take` and `validate` are never explained, leaving two of the five parameters semantically opaque. The description partially compensates for the empty schema but is not complete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens by comparing itself to hydra_block: 'Like hydra_block, but fade from what is on screen to the new code over seconds instead of cutting', which clearly states the verb, resource, and behavior. It also names the intended context, 'the move for a big change mid-set,' and differentiates from the sibling tool by contrasting fade vs. cut. An agent can confidently distinguish hydra_crossfade from hydra_block and other siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly frames when to use it: for a 'big change mid-set' when you want to fade rather than cut, and later notes that 'mirrors cut instead of fading.' It also provides concrete prerequisites: 'one visible output (not the 4-up grid), and two outputs that no other block draws into or reads,' plus the failure mode if those conditions are not met. This is clear, actionable guidance beyond anything in the schema or title.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hydra_defineA

Add a custom transform written in GLSL (Hydra's setFunction), usable in any chain afterwards like a built-in.

type and what the body receives / must return: src _st (vec2 coords) -> vec4 colour coord _st -> vec2 coords color _c0 (vec4 incoming colour) -> vec4 combine _c0, _c1 (two colours) -> vec4 combineCoord _st, _c0 -> vec2 glsl is the function BODY only. inputs are its parameters, in order: [{"name": "amount", "type": "float", "default": 0.5}] (types: float, vec4, sampler2D). For combine types, declare the incoming chain first: {"name": "tex", "type": "vec4"}.

It is compiled inside a throwaway chain before anything goes live, so a GLSL mistake comes back as the compiler's own error. On success it is stored as block fn_<name> at the top of the document (so it is defined again before use when a page reloads) and use shows a call to start from.

Example: hydra_define("stripes", "src", "return vec4(vec3(step(0.5, fract(_st.x * count))), 1.0);", inputs=[{"name": "count", "type": "float", "default": 10}]) then: stripes(20).rotate(0.3).out(o1)

ParametersJSON Schema
NameRequiredDescriptionDefault
glslYes
nameYes
takeNo
typeYes
inputsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses key behaviors beyond the annotations: it compiles the GLSL in a throwaway chain so errors surface as the compiler's own errors, and on success it stores the function as a block 'fn_<name>' at the top of the document for persistence across reloads. These details are not present in the annotations (which only flag readOnlyHint=false and destructiveHint=false) and are essential for the agent to predict side effects and failure modes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded: it opens with the purpose, then provides a clear list of function types, explains parameter semantics, describes error and storage behavior, and ends with a concrete example. Every sentence contributes useful information, and the formatting with code blocks improves readability. It is appropriately sized for the complexity of the tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with this complexity (GLSL, multiple types, inputs, compilation, persistence), the description is nearly complete. It covers the core semantics, error handling, and storage. The only notable gap is the undocumented 'take' parameter, which could affect usage. An output schema is present, so return values are presumably covered there. Overall, an agent can call this tool correctly with the provided information, but the missing 'take' prevents a perfect score.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It thoroughly explains 'type' with a list of valid values and their behavior, 'glsl' as the body only, and 'inputs' with format and example. However, the 'take' parameter is not mentioned at all, leaving its semantics undocumented. The description adds significant meaning for most parameters but misses one, so it does not fully cover the schema gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action: 'Add a custom transform written in GLSL (Hydra's setFunction), usable in any chain afterwards like a built-in.' It clearly identifies the resource (a custom GLSL transform) and distinguishes it from sibling tools that handle other operations. The purpose is unambiguous and specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides strong usage context: it explains the available function types (src, coord, color, combine, combineCoord) with their input/output contracts, and includes a complete example. It does not explicitly state when *not* to use it or name alternatives, but the sibling list and the unique nature of defining custom functions make the intended use clear. The example demonstrates exactly how to call it in a chain, which is effective guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hydra_documentA
Read-only

The shared composition: ordered named blocks, each with its code and author, plus the whole thing as one text with // @block <name> separators. When the primary is an existing Hydra tab, tab_editor is that tab's own editor text — the truth about what plays there, including anything typed by hand.

Read this before writing, so you extend the piece instead of talking over it — and so you can see which outputs (o0–o3) are already taken.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnlyHint=true and destructiveHint=false. The description adds meaningful behavioral context by explaining what the returned document contains, that tab_editor is the authoritative editor text including hand-typed content, and that outputs o0–o3 may already be occupied. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise at roughly 75 words and front-loads the core resource definition before adding usage context. Every sentence contributes: the composition structure, the tab_editor truth, and the instruction to read before writing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no parameters, a read-only annotation, and an output schema, the description is nearly complete. It explains the document shape, the authoritative editor content, and the practical reason to call it. It could be slightly more explicit about what happens when there is no existing tab or primary, but this is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema carries no burden and the description does not need to explain parameter semantics. Per the zero-parameter baseline, this is adequate since there is nothing to clarify.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool's resource as the shared composition: ordered named blocks with code, author, and block separators, plus the truth of the tab_editor when applicable. It implies retrieval through 'Read this before writing' and the annotation title 'Read The Composition', but it never uses an explicit verb like 'get' or 'return' and does not contrast itself with sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit context for when to use the tool: 'Read this before writing, so you extend the piece instead of talking over it — and so you can see which outputs (o0–o3) are already taken.' This is clear usage guidance, though it does not name alternatives or explicitly state when not to use the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hydra_dropA
Destructive

Remove one block from the composition and blank the outputs it drew into (unless another block still draws there) — Hydra keeps showing whatever an output was last given, so forgetting the code alone would leave its picture frozen on screen.

Returns blanked (outputs that went black) and restored (blocks run again because they also draw into one of the same outputs — otherwise the dropped chain, having run last, would stay on screen there). Human-written blocks need take=true. The code is gone afterwards; hydra_save first if you might want it back.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
takeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations' destructiveHint=true and readOnlyHint=false, the description explains a subtle Hydra behavior—outputs keep showing their last frame—and why blanking is necessary. It also discloses that the code is gone afterwards and describes the returned blanked and restored semantics. This is substantial behavioral context the structured annotations alone would not convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: it states the core action, explains the persistence rationale, defines the return values, and warns about destructiveness. The structure front-loads the main purpose and uses a dash to add essential context without padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, non-read-only tool with only two parameters and an output schema, the description is fully adequate. It covers why blanking happens, what restored means, the take flag requirement, and the irreversible code loss. An agent has enough information to invoke it correctly and handle side effects.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With schema description coverage at 0%, the description takes on the burden of explaining parameters. It clearly defines take: 'Human-written blocks need take=true.' The name parameter is not explicitly described but is self-evident from context as the block to remove, so the gap is minor.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Remove one block from the composition,' then clarifies the consequential behavior of blanking outputs. This cleanly distinguishes the action from sibling tools like hydra_save or hydra_hush by stating exactly what gets removed and what happens to the screen.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear operational guidance: human-written blocks need take=true, and hydra_save should be called first if the code might be needed again. It does not explicitly enumerate when-not-to-use alternatives, but the save-first warning and the destruction warning provide enough contextual guardrails for an agent to decide safely.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hydra_hushA
Destructive

The panic button: blank every output, clear update(), reset speed to 1, and empty the document — every block, human-written ones included, in every connected tab.

The document is archived first (the path comes back as archived), so nothing is lost, but the screen goes black. To change one part, replace that block instead.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, and the description reinforces the destructiveness by detailing what gets destroyed (all blocks, human-written ones, in every tab) and the archival safety net. It adds context on the archive behavior and the black screen, which is valuable beyond the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, with a strong opening metaphor, followed by essential details about archiving and the alternative approach. Every sentence adds value, and the structure frontloads the critical destructive nature.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the zero parameters, the destructive scope is well-explained, and the archival behavior is disclosed. The output schema exists, so return values are covered. The only minor gap is not detailing what exactly the 'archived' path is used for, but it's not critical. Overall, complete for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters)Skip, so the description doesn't need to document any. It implicitly communicates that no parameters are required, which is sufficient. The coverage is 100% and there are no params to explain, so a baseline of 4 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description is highly specific: it names the tool as a 'panic button' that blanks every output, clears update(), resets speed, and empties the entire document including human-written blocks across all tabs. It clearly distinguishes this from hydra_drop or hydra_block by emphasizing the global scope and inclusion of human content.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use it (as an emergency reset) and explicitly states that to change only one part, one should replace that block instead. It does not explicitly name alternative tools, but the guidance is clear enough to prevent misuse.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hydra_loadA
Destructive

Replace the composition with a saved sketch — the same dry run, hush and run as hydra_sketch, keeping each block's original author.

Refused if the current document holds human-written blocks, unless take=true. Save the current piece first if it is worth keeping. An unknown name returns the list of saved sketches.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
takeNo
validateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate destructiveHint=true and readOnlyHint=false, so the description doesn't contradict them nastead it adds valuable context: the refusal condition (human-written blocks unless take=true), the warning to save first, and the dry run/hush behavior. It also mentions that unknown names return a list of saved sketches, which is beyond the annotation coverage. This adds meaningful behavioral detail beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

There are only four sentences, each carrying substantial information: the main action, the refusal condition, a caution to save, and behavior on unknown names. The description is front-loaded with the core purpose and then essential safety/edge-case info. No unnecessary fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers main purpose, refusal condition, safety tip, and edge case return. However, it doesn't describe the return value for successful loads or the content of the returned list for unknown names dozen. Given the output schema exists, the description needn't detail return values, but more clarity on the refusal outcome (does it error or return a message?) would complete the picture. Still, for a 3-param tool with annotations covering safety, it's reasonably complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, meaning the schema provides no descriptions for any of the parameters. The description mentions 'take' in the context of overriding human-written blocks, and 'name' is implied, but 'validate' is not addressed at all. With zero coverage, the description should explain all parameters, especially 'validate' which has a default and is not self-explanatory.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (replace composition with a saved sketch) and the specific resource (saved sketch). It also mentions key behaviors like dry run, hush, and keeping author, which helps distinguish it from similar tools like hydra_sketch, though it doesn't explicitly name all siblings that might overlap.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit conditions for when to use the tool (replacing composition with saved sketch, similar to hydra_sketch) and when it will be refused (if human-written blocks exist unless take=true). It also advises to save the current piece first if worth keeping, but doesn't explicitly mention alternatives beyond the implied hydra_sketch.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hydra_lookA
Read-only

A screenshot of the primary tab's canvas, as an image, downscaled to max_width pixels wide (64–1920).

This is the only evidence of what the visuals look like. A block that evaluated cleanly can still be black, blown out or static, so look after writing and before describing anything. It shows whatever render() currently shows — one output, or the 4-up grid.

A hidden tab can't be photographed (its frames are throttled, and a minimized window's canvas has no size); the error says so.

ParametersJSON Schema
NameRequiredDescriptionDefault
max_widthNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint and destructiveHint annotations, the description goes beyond by explaining that it only reveals what render() shows (one output or a 4-up grid) and that hidden tabs cannot be captured. This adds valuable behavioral context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured, with the core purpose in the first line and essential usage guidance in subsequent sentences. Every sentence adds value, and the information is front-loaded for quick scanning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for a simple single-parameter tool. It covers what the tool does, when to use it, limitations, and parameter specifics. The output (a screenshot) is self-evident, so no output schema is needed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has no description for the max_width parameter, but the description explains it's a downscale target in pixels with a 64–1920 range. This compensates perfectly for the 0% schema coverage, giving the agent full understanding of the parameter's purpose and constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description precisely states the tool captures a screenshot of the primary tab's canvas, downscaled to a specified width. It clearly distinguishes this from other hydra tools (which are about rendering, state, or source management) by focusing on visual evidence capture.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly instructs when to use it: 'look after writing and before describing anything,' and explains why it's necessary (a block can be black, blown out, or static). It doesn't name alternative tools, but the context of when to use it is clear. It also notes limitations with hidden tabs, which guides appropriate usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hydra_referenceA
Read-only

Hydra's transform functions, read live from the running engine — so it lists exactly what this tab's hydra-synth has, including anything added with setFunction.

  • no arguments: names grouped by type, plus the primer (idioms and gotchas)

  • name="modulate": that function's inputs and defaults (also fuzzy: name="repeat")

  • type="combineCoord": every function of one type

Types, and what they chain onto: src start a chain: osc, noise, voronoi, shape, gradient, solid, src, prev coord move pixels: rotate, scale, repeat, kaleid, scroll… color change colour: color, brightness, contrast, hue, colorama, luma… combine mix another source in: add, blend, mult, diff, layer, mask combineCoord warp by another source: modulate, modulateScale, modulateRotate…

Check a name here before using one you are not sure of — an invented function is refused by the dry run anyway, but this is cheaper.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint and destructiveHint annotations, the description discloses that the listing is read live from the running engine, includes setFunction additions, and supports fuzzy matching for name lookups. It also documents grouping behavior and the type taxonomy. No statement contradicts the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core behavior and usage modes, then uses compact bullets for the type taxonomy and closes with a practical precaution. Despite its length, every line contributes a distinct fact or example and avoids filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-optional-parameter read-only reference with an output schema, the description covers invocation modes, parameter semantics, valid type values, and example queries. It even warns about the consequence of an invented function. Nothing material is missing for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description fully compensates: it defines name as a function lookup returning inputs and defaults, notes fuzzy matching, and defines type as a filter returning every function of one type, enumerating the valid type values. This is far more useful than the bare string properties in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a concrete verb and resource: it reads Hydra's transform functions live from the running engine and lists them, making it a lookup tool rather than a mutation tool. The title annotation 'Look Up A Function' and the modal breakdown (no arguments, name, type) further distinguish it from sibling tools like hydra_define or hydra_drop.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says to check a name here before using an unverified function and contrasts this with the dry run, calling it 'cheaper'. The bullet list gives clear when-to-use modes for no arguments, name, and type. This gives an agent both the condition and the comparison needed to select the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hydra_renderA

Show one output full-screen ("o0", "o1", "o2", "o3") or all four in a grid ("all").

Every output keeps rendering either way, so a chain on o1 can feed o0 while only o0 is visible. This does not change the document — to make the choice permanent, put render(o1) in a block.

ParametersJSON Schema
NameRequiredDescriptionDefault
outputNoall

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses crucial runtime behavior: all outputs keep rendering regardless of visibility, so chains can still feed hidden outputs. It also states clearly that the tool does not change the document, which is important for an operation where readOnlyHint is false and destructiveHint is false. This prevents the agent from assuming the choice persists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three compact sentences deliver the action, parameter values, runtime implications, and the permanence boundary with zero filler. The most important information appears first, and the example of chaining o1 to o0 earns its place by illustrating why continued rendering matters.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter display tool, the description is complete: every accepted value, the behavioral nuance of continued rendering, and the distinction between transient and permanent are all covered. The presence of an output schema means return-value details need not be restated in the description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema provides only a bare `output` string with no enum and no description (0% coverage), so the description carries the full burden. It fully compensates by listing every valid value and explaining the visual result for each, including the "all" grid case. This is exactly what the schema lacks.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific action and target: showing an output full-screen or all four outputs in a grid. It enumerates the exact accepted values ("o0", "o1", "o2", "o3", "all"), which distinguishes this display-routing tool from the broader hydra sibling set. Nothing about it is vague or tautological.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear when-to-use context: this is for choosing what is visible while rendering continues, not for making a permanent document change. It explicitly names the alternative path for permanence by writing `render(o1)` in a block, which tells the agent when this transient tool is appropriate versus a persistent block-based approach.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hydra_saveA

Save the current composition — every block, with its author — to the sketch library (hydra-mcp/sketches/.json), plus a 480-px thumbnail of what is on screen.

name: letters, digits, _ and -, up to 60. tags: a few words to find it by later ("feedback", "audio", "slow"). An existing name is refused unless overwrite=true.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
tagsNo
overwriteNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses concrete behaviors beyond annotations: the exact file destination, the inclusion of every block with its author, the 480-px thumbnail, naming constraints, and the guard that an existing name is refused unless overwrite=true. This is rich, accurate behavioral context and does not contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences cover the main behavior, constraints, and examples without waste. The most important action is front-loaded, and the details about naming and overwrite earn their place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a save operation with an output schema available, the description is complete: it states what is saved, where, how naming works, how tags work, and how overwriting is handled. Nothing an agent needs to invoke the tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description fully compensates. It explains name character rules and length, the purpose of tags with examples, and the overwrite behavior explicitly. Each of the three parameters is given meaningful semantics beyond the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action and resource: 'Save the current composition — every block, with its author — to the sketch library (hydra-mcp/sketches/<name>.json), plus a 480-px thumbnail.' This is far more specific than the title and clearly distinguishes saving from sibling operations like hydra_load or hydra_sketches.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies the tool is used to persist the current sketch, but it does not explicitly explain when to choose it over alternatives such as hydra_load, hydra_sketches, or hydra_share_url. There are no exclusions or alternative conditions, only the implied save-vs-load distinction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hydra_share_urlA
Read-only

A hydra.ojack.xyz link that opens the current piece in the official Hydra editor.

Built here from the document text, in the editor's own ?code= format (base64 of the URI-encoded code; verified by loading such a link and reading the editor back). When the primary is an existing Hydra tab, its own editor text is used instead. Nothing is uploaded or posted to Hydra's gallery — the code travels only inside the link, so very long pieces make very long links.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the agent knows this is a safe read operation. The description adds valuable behavioral context: the code is embedded in the link (base64 of URI-encoded code), nothing is uploaded, and very long pieces produce very long links. This goes beyond the annotations and helps the agent understand side effects and constraints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured. It front-loads the core purpose in the first sentence, then provides necessary technical details (base64 format, verification) and a key constraint (nothing uploaded, long links) in a compact second paragraph. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no parameters and an output schema exists, the description covers the essential context: what the link contains, how it's built, and what it does NOT do (upload to gallery). The only minor gap is that it doesn't explicitly describe the output format (the link itself), but the output schema likely covers that, and the description's mention of 'link' is sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema provides no parameter semantics. The description compensates by explaining what the tool does with the current document/editor state, which is the implicit input. Since there are no parameters to document, the description's explanation of the implicit input (current piece/editor text) is sufficient.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: it creates a hydra.ojack.xyz link that opens the current piece in the official Hydra editor. It specifies the resource (Hydra editor link), the action (share/open), and distinguishes it from gallery uploads. The title 'Share Link' and sibling context further reinforce this.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when this tool is used: to share the current piece via a link, and explicitly notes that nothing is uploaded to the gallery. It also mentions that when the primary is an existing Hydra tab, its own editor text is used. However, it doesn't explicitly name alternative tools or state when NOT to use this tool, though the gallery-upload exclusion is a useful contrast.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hydra_sketchA
Destructive

Replace the entire composition with a new sketch: dry-run all of it, hush, then run.

Use this to start a fresh idea, not to add to one — hydra_block adds. Split the sketch into blocks with marker lines so each part can be revised on its own later:

// @block base
osc(30, 0.05, 1.2).out(o0)
// @block warp
src(o0).modulate(noise(2), 0.1).out(o1)
render(o1)

Code with no markers becomes one block called main.

If the document holds any human-written blocks this is refused (human_blocks), because a sketch would erase them. Pass take=true only if the person playing asked for a fresh start.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYes
takeNo
validateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveness, and the description adds valuable behavior beyond that: the tool is refused for human-written blocks to prevent erasure, it dry-runs, hushes, then runs, and it replaces the entire composition. This is exactly the kind of consequence disclosure an agent needs before invoking a destructive tool. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than average but every sentence earns its place: action, sibling distinction, block syntax with example, fallback behavior, refusal rationale, and override condition. It is front-loaded with the core action and does not pad with filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, complex tool with many siblings, the description is remarkably complete: purpose, alternatives, block conventions, refusal semantics, and take override are all covered. The only notable gap is the undocumented `validate` parameter; otherwise an agent has enough context to call and interpret the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the load. It richly explains `code` with a concrete block-marker example and explains `take` with a clear policy. However, the `validate` parameter is never mentioned, and although 'dry-run all of it' hints at it, the agent is left guessing whether validate can be disabled and what that does.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a strong verb and resource: 'Replace the entire composition with a new sketch'. It makes the tool's scope unmistakable ('start a fresh idea, not to add to one') and explicitly contrasts it with hydra_block. An agent can distinguish this tool from its siblings without reading schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is explicitly stated: use to start fresh, do not use to add, and use hydra_block instead for additions. The refusal condition (human-written blocks) and the exact condition for passing take=true ('only if the person playing asked for a fresh start') are also given, leaving little to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hydra_sketchesA
Read-only

List saved sketches: name, tags, when saved, block names, and the thumbnail path. query filters by a word in the name or tags.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is established. The description adds the query filtering behavior and the kind of content returned, but does not disclose extra behavioral details such as pagination, ordering, or access requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences front-load the core purpose and returned fields, then clarify the filter. There is no filler or repetition of the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a simple read-only list tool with one optional parameter and an output schema. The description covers what the tool lists and how the query affects results; nothing essential is missing for invoking it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema gives only the parameter name and default, with 0% schema description coverage. The description compensates by explicitly explaining that `query` filters by a word in the name or tags, which is meaningful semantic guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with a specific verb and resource: 'List saved sketches', and then enumerates the returned fields (name, tags, when saved, block names, thumbnail path). This clearly distinguishes it from siblings like hydra_sketch, hydra_save, and hydra_load.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for browsing or listing saved sketches and explains the optional query filter. It does not explicitly name sibling alternatives or state when not to use it, so it misses full exclusion guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hydra_sourceA

Load an external image stream into s0–s3, then read it in any chain with src(s0).

kind: "image" target = an http(s) URL. It must allow cross-origin use (CORS) or WebGL cannot read it — the error says so. "video" target = an http(s) URL, same CORS rule; loops muted. "cam" target = camera index ("0"). The browser asks for permission: expect state "pending_permission" until someone at the machine clicks Allow, and check hydra_state rather than assuming. "screen" screen capture. Browsers only allow it from a click inside the page, so a remote call usually cannot start it; the error explains. "clear" release the slot.

Returns state: "live" (with the media's size), "pending_permission", or an error. It waits up to four seconds for the source to actually deliver frames. Images and video are loaded on mirrors too; cameras and screen capture are not (each would prompt).

Then: src(s0).kaleid(4).out(o1)

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYes
slotYes
targetNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the annotations: it discloses that the tool is not read-only (it loads streams and can prompt for permissions), details the return state ('live', 'pending_permission', errors), specifies a four-second timeout, and explains mirror behavior (images/videos load on mirrors; cameras/screen do not). This adds significant behavioral context that annotations do not provide. It fully informs the agent about side effects, such as permission prompts, which is critical for correct usage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is detailed, which is necessary given the tool's complexity)Skip. It front-loads the key action ('Load an external image stream... src(s0)') and then organizes kind-specific details in a clear list. It does include a redundant example chain at the end ('Then: src(s0).kaleid(4).out(o1)') that largely repeats the opening usage pattern, adding little value-laden content. Overall it is structured and readable, but the trailing example slightly bloats it without new information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (multiple kinds, permission prompts, CORS constraints) and the minimal schema (3 params, 2 required, no enums), the description is remarkably complete. It covers all critical behaviors: return states, timeouts, mirror limitations, error scenarios, and usage patterns. The output schema exists, so return details are partly covered, but the description still explains the state values. There are no significant gaps that would prevent an agent from using the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema is minimal (only names: kind, slot, target) with 0% description coverage. The description compensates by explaining the kind values ('image', 'video', 'cam', 'screen', 'clear') and their target formats (URL, camera index, or empty for clear). However, it does not explicitly explain the 'slot' parameter semantics beyond the s0–s3 reference in the opening line, and 'target' is explained mainly through kind. Since kind and target are well-clarified, but slot is thinner, it scores a 4 rather than 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear, specific statement: 'Load an external image stream into s0–s3, then read it in any chain with src(s0).' This names the exact resource (external image stream), the slot mechanism (s0–s3), and the usage pattern (src(s0)), distinguishing it from generic load tools. It also enumerates the kind field with concrete targets ('image', 'video', 'cam', 'screen', 'clear'), which makes the purpose unmistakable. It clearly differentiates from siblings like hydra_load by focusing on source slots and stream loading.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage guidance per kind, stating when to use each (e.g., for 'screen', it notes browsers require a click, so remote calls likely fail; for 'cam', it warns to expect pending_permission and check hydra_state rather than assuming). It also explains the CORS requirement for image and video, which is a critical condition. While it doesn't name sibling alternatives, it gives concrete operational constraints that help an agent decide when to call this function and how to handle outcomes. This is more actionable than typical sibling-based exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hydra_stateA
Read-only

Which Hydra tabs are connected and whether they can be trusted right now.

Returns every tab with its role (exactly one primary answers; mirrors just follow), its adapter (deck = our page, ojack = the official editor, generic = any other Hydra tab), fps, resolution, speed/bpm, which sources are live, the block names with their authors and the outputs they draw into, and the primary's recent runtime warnings.

Two fields are not formalities: visible false means the tab is in the background. Browsers throttle its frames, so screenshots stall and what you see may be minutes old. Ask for it to be brought to the front rather than working blind. mic 'prompt' means the browser is still waiting for someone to click Allow. Audio-reactive code (a.fft) reads zeros until they do — and nobody may be at the machine. Never assume the click happened.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and destructiveHint=false, and the description adds substantial non-obvious behavior beyond that: visible=false means the browser throttles frames and screenshots may be stale; mic='prompt' means audio-reactive code reads zeros until permission is granted. It also clarifies role semantics ('exactly one primary answers; mirrors just follow'). This is exactly the kind of transparency that prevents misinterpretation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficiently structured: a one-sentence purpose, a compact summary of returned fields, then two field-specific warnings that earn their length because they materially affect how an agent should act. No sentence is filler, and the most decision-relevant caveats are highlighted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters, an existing output schema, and read-only annotations, the description covers everything needed to invoke and interpret the tool correctly. It explains non-schema behavioral edge cases (tab throttling, mic prompt) and gives concrete course-of-action guidance, so no critical context is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters and the schema is empty, so there is no parameter burden for the description to carry. The baseline for zero-parameter tools is 4, and the description appropriately focuses on output semantics rather than inventing parameter-related details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific, actionable purpose: 'Which Hydra tabs are connected and whether they can be trusted right now.' It then enumerates exactly what is returned (role, adapter, fps, resolution, sources, blocks, warnings), making the tool's resource and scope unmistakable. It also clearly differentiates itself from mutation-oriented siblings by focusing on read-only state inspection.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when this tool matters — checking current trustworthiness, background-tab visibility, and mic permission. It also provides explicit behavioral guidance: 'Ask for it to be brought to the front rather than working blind' and 'Never assume the click happened.' It does not explicitly name alternative tools or exclusions, but the context is strong enough for safe selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hydra_transportA

Set the global clock and canvas size. Pass only what you want to change.

speed multiplies time for everything (1 is normal, 0 freezes motion; 0–20). bpm the tempo arrays step to: [1, 2, 3].fast(1) changes value once per beat. width, height render resolution, set together (16–4096). Larger costs fps, and video out sends this size.

This changes the whole piece, human-written blocks included — say so if someone is playing along.

ParametersJSON Schema
NameRequiredDescriptionDefault
bpmNo
speedNo
widthNo
heightNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses a critical side effect beyond the annotations: 'This changes the whole piece, human-written blocks included — say so if someone is playing along.' It also reveals performance implications ('Larger costs fps') and that video out sends the set size. These traits are not encoded in the annotations and substantially inform the agent's use.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The first sentence states purpose immediately, followed by a parameter list and a high-value global caveat. No redundant filler; each line contributes semantic or behavioral information that the schema and annotations do not provide.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema and simple optional parameters, the description is complete: it covers all parameter semantics, global side effects, practical limits, and collaborative etiquette. An agent has everything needed to select and invoke the tool correctly without further inference.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has 0% description coverage, so the description carries full parameter burden. It does so thoroughly: speed's multiplier meaning and range, bpm's beat-stepping behavior with an example, and width/height's range and linked setting are all explained. Every parameter gains meaning absent from the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description opens with a specific verb and resource: 'Set the global clock and canvas size.' The four parameters are enumerated with concrete meanings, making the tool's scope unmistakable and distinct from render/output siblings. No ambiguity about what resource is being modified.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The instruction 'Pass only what you want to change' gives a clear usage pattern)Skip. The caveat about changing 'the whole piece, human-written blocks included' implies collaborative contexts. However, the description does not explicitly compare against sibling tools or state when not to use it, so the routing guidance remains implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

hydra_video_outA

Send the primary tab's canvas out of the browser as a native video source: a Syphon server named "Hydra" (macOS). TouchDesigner receives it with a Syphon Spout In TOP. TouchDesigner names Syphon senders App:Server, and the publisher runs as Python, so the sender to pick is "Python:Hydra" — plain "Hydra" matches nothing and leaves the TOP on its checkerboard.

With hydra_out.py started with --ndi, the same frames also go out as an NDI source, which receivers list as " (Hydra)". NDI reaches other machines on the network; ndi_connections in the status says whether anything is receiving it.

action: "start", "stop" or "status". fps: 1–60, the capture rate to request.

Needs out/hydra_out.py running — a separate process with its own Python 3.12, because the Syphon library only supports up to 3.12 (see the README). Start waits two seconds, then returns both ends: page_after_2s sent_fps, dropped — what the tab actually sent out_after_2s fps, syphon_clients — what was published, and whether anything is receiving Report those numbers, not the fps you asked for. Frames are dropped rather than queued when the receiver lags, so a high dropped means lower the resolution (hydra_transport) or the fps.

Chromium tabs only (MediaStreamTrackProcessor). The primary must stay visible: a hidden tab stops producing frames.

ParametersJSON Schema
NameRequiredDescriptionDefault
fpsNo
actionNostatus

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotation's readOnlyHint=false, the description details the start/stop/status behavior, the two-second wait, the returned end-point objects, the fact that frames are dropped rather than queued when the receiver lags, and the consequence for a hidden tab. It also warns that plain 'Hydra' matches nothing in TouchDesigner, which is highly valuable behavioral insight not discoverable from annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The text is organized into a flow from purpose to receiver integration to parameter semantics, prereqs, and returned values. It is somewhat dense but every sentence conveys operational knowledge. It is not as tight as a two-sentence definition but it earns its length with whole paragraphs containing non-redundant detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simplicity of the schema and the lack of a clear output schema in the provided, the description is complete: it covers prerequisites, action semantics, fps meaning, output values, receiver behavior, failure modes, and a workaround (lower hydra_transport resolution/fps). The agent can call and interpret the result correctly without additional information.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description carries the full burden of parameter explanation. It defines 'action' with allowed values start/stop/status and 'fps' with a 1–60 range and the meaning of the capture rate. It also tells the agent to report the returned fps rather than the requested fps, adding behavioral semantics to a parameter that otherwise has none in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Send the primary tab's canvas out of the browser as a native video source...' It clearly distinguishes itself by describing Syphon and NDI output, which none of the sibling tools (hydra_source, hydra_render, etc.) imply. The exact in-tool destination and the reason to pick 'Python:Hydra' over 'Hydra' makes the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives strong usage context: the external out/hydra_out.py must be running, Chromium is the only supported tab type, and the primary tab must remain visible (a hidden tab stops producing frames). It does not explicitly name alternatives or say when not to use it in favor of a sibling, but the prerequisites and operational constraints are clear enough to guide an agent correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 19 tool updatesv0.1.0
    • First observedhydra_audio
    • First observedhydra_block
    • First observedhydra_crossfade
    • First observedhydra_define
    • First observedhydra_document
    • First observedhydra_drop
    • First observedhydra_hush
    • First observedhydra_load
    • First observedhydra_look
    • First observedhydra_reference
    • First observedhydra_render
    • First observedhydra_save
    • First observedhydra_share_url
    • First observedhydra_sketch
    • First observedhydra_sketches
    • First observedhydra_source
    • First observedhydra_state
    • First observedhydra_transport
    • First observedhydra_video_out

TDQS

A4.1/5.0

Scored across 19 tools

Disambiguation4/5

Most tools map cleanly to a distinct action in the Hydra workflow, and the descriptions are unusually precise. A few close pairs exist — hydra_sketch vs hydra_load both replace the whole composition, and hydra_block vs hydra_crossfade are write operations differing only in transition — but their purposes are clearly separated in the docs.

Naming Consistency4/5

All tools share the hydra_ prefix and lowercase snake_case, which makes the set feel cohesive. However, the names mix nouns (hydra_state, hydra_document, hydra_reference) with verbs (hydra_drop, hydra_render, hydra_save), so the pattern is predictable but not a strict verb_noun convention.

Tool Count3/5

At 19 tools, the server is on the heavy side of the ideal range. The count is defensible given the broad domain — composition editing, state inspection, rendering, media sources, audio, persistence, and video output — but a few tools could plausibly be consolidated without losing clarity.

Completeness4/5

The core composition lifecycle is well covered: read, create, replace, fade, delete, panic, save, load, list, and share. Minor gaps remain, such as no direct way to delete a saved sketch, reorder blocks, or undo changes, but an agent can accomplish the main Hydra workflows without hitting dead ends.

Related MCP Connectors

Related MCP Servers