Skip to main content
Glama
Benedict

TidalCycles MCP Server

by Benedict

TidalCycles MCP Server

An MCP server that lets Claude (or any MCP client) play TidalCycles patterns. You describe what you want, Claude writes the Tidal code, and the server evaluates it on d1–d9.

It keeps track of what's playing on each channel, so you can say "make the hi-hats busier" and Claude knows what the hi-hats currently are.

How it works

The server doesn't make music itself, and there's no AI inside it. It gives an MCP client a set of tools, such as "evaluate this pattern on d2" or "hush". The language model in the client decides what to call and writes the Tidal code.

What comes back keeps the model honest:

  • Tidal's own errors. In GHCi mode, each pattern runs in a real Tidal session. If it doesn't type-check, the model gets GHC's error message and can fix it. Nothing changes on that channel in the meantime.

  • What's actually installed. tidal_list_samples lists your sample banks and synths, and the server warns when a pattern uses one that doesn't exist. Tidal accepts those patterns, but they're silent.

  • What's playing. tidal_get_state shows each channel's code, including anything you've played yourself in a shared session.

  • Idioms that work. tidal_palette lists transforms and effects that are checked against real Tidal.

Everything the model sends is ordinary Tidal code, and it appears in the conversation and in the session log. You can read it, copy it into your own editor, or learn from it.

It works with any MCP client, not only Claude, including clients that run local models.

Related MCP server: supercollider-mcp

Requirements

  • Node.js 22 or later

  • TidalCycles, which includes GHCi

  • SuperCollider with SuperDirt and the Dirt-Samples: in SuperCollider run Quarks.install("SuperDirt") and Quarks.install("Dirt-Samples"), then recompile the class library

  • An MCP client, such as Claude Desktop or Claude Code

Install

Claude Desktop: download tidal-mcp-server.mcpb from the latest release and open it. Claude Desktop shows an install dialog with the settings: whether to run Tidal for you, your ghci path, and an optional port for the web pages. You can switch the server on and off in Claude Desktop's settings. A bundle doesn't update itself: tidal_status says when a newer release is out, and you install its .mcpb the same way.

Other clients, or configuring by hand: your MCP client runs the server with npx, which downloads it on first use. See Configure your client. npx checks npm each time the client starts the server, so you get new releases by restarting it. The examples ask for tidal-mcp-server@^1, so a 2.0 with breaking changes never installs itself. To update only when you choose, pin an exact version, like tidal-mcp-server@1.2.0.

To work on the server itself, see Development.

Start SuperDirt in SuperCollider before you use the server. Plain SuperDirt.start fails with "No more buffer numbers" once the full Dirt-Samples library is installed, because SuperCollider's default buffer limit is too low. Raise the limit first:

(
s.reboot {
    s.options.numBuffers = 1024 * 256;
    s.options.memSize = 8192 * 32;
    s.options.numWireBufs = 2048;
    s.options.maxNodes = 1024 * 32;
    s.options.numOutputBusChannels = 2;
    s.options.numInputBusChannels = 2;
    s.waitForBoot {
        ~dirt = SuperDirt(2, s);
        ~dirt.loadSoundFiles;
        s.sync;
        ~dirt.start(57120, 0 ! 12);
    };
    s.latency = 0.3;
};
)

To run this every time SuperCollider starts, put it in your startup file (File → Open startup file).

Configure your client

The server has two ways of getting code to Tidal.

The server starts GHCi with BootTidal.hs itself and sends each command to it. If Tidal rejects a pattern, for example because it doesn't type-check, the error goes back to Claude, and the server's state stays as it was. Tidal also keeps playing whatever was on that channel before. If GHCi dies or stops responding, the server restarts it on the next call.

Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json on macOS, %APPDATA%\Claude\claude_desktop_config.json on Windows):

{
  "mcpServers": {
    "tidal": {
      "command": "npx",
      "args": ["-y", "tidal-mcp-server@^1"],
      "env": {
        "TIDAL_USE_GHCI": "true",
        "GHCI_PATH": "/path/to/ghci"
      }
    }
  }
}

Claude Code:

claude mcp add tidal \
  -e TIDAL_USE_GHCI=true \
  -e GHCI_PATH="$(which ghci)" \
  -- npx -y "tidal-mcp-server@^1"

If you leave out GHCI_PATH, the server looks for ghci on its PATH, then where ghcup and Homebrew install it (~/.ghcup/bin, /opt/homebrew/bin, /usr/local/bin; C:\ghcup\bin on Windows). Apps started from the Dock or Start menu don't get your shell's PATH, so if your ghci is somewhere else, set GHCI_PATH (which ghci, or where ghci on Windows, tells you where it is). Path settings can start with ~.

Code runs on your computer. In GHCi mode the code Claude sends runs straight away, with your permissions. Tidal code is Haskell, and GHCi runs any Haskell, not only patterns, including code that reads or changes your files. The server says so once, in its first reply after you install it. If you'd rather read code before it runs, use file mode.

The server boots Tidal with the BootTidal.hs it ships with. To use your own instead, for example the one your editor uses, set TIDAL_BOOT_PATH.

Playing alongside Claude in your editor

By default, the server's Tidal and your editor's Tidal are separate. You hear both, but hush only stops one of them, and Claude can't see what you're playing. To share one Tidal session instead, set TIDAL_SHARE_SESSION=true. It needs GHCi mode, and it isn't available on Windows yet.

When sharing is on, the server writes a stand-in ghci into ~/.tidal-mcp/bin. Point your editor at that folder; in Pulsar, set the TidalCycles package's Ghci Path to ~/.tidal-mcp/bin. Then:

  • Your code runs in the server's Tidal, so there's one hush and one clock.

  • What you play shows up in tidal_get_state, so Claude can play along with it.

  • Your errors appear in your editor's console, and Claude's go back to Claude.

  • Your editor's :script BootTidal.hs is skipped, because the server has already booted Tidal. Use TIDAL_BOOT_PATH to make the server use your boot file instead.

  • When the server isn't running, the stand-in runs your real ghci, so your editor still works on its own.

The connection is a socket in ~/.tidal-mcp that only your user can open.

File mode

Nothing runs GHCi for you. Each tool call overwrites TIDAL_FILE with the latest command, and you evaluate it yourself, for example from an editor with Tidal support.

"env": {
  "TIDAL_FILE": "/path/to/tidal-mcp-output.tidal"
}

The file only ever holds the most recent command. Use file mode when you want to see and approve each command before it plays.

The control page and Strudel

Set TIDAL_UI_PORT (for example 7070) and the server also serves two web pages:

  • http://localhost:7070/, the control page: what's playing on each channel, with each layer, plus the tempo, controls, autopilot and Tidal's status. It has a big Hush button, autopilot start/pause/stop, and Restart Tidal. It updates live.

  • http://localhost:7070/strudel, a Strudel page: it plays Strudel programs that Claude builds with the strudel_* tools, using the same Dirt-Samples. Click Start sound once, because browsers only play audio after a click. Anyone who opens the page hears the same program on their own device.

Strudel programs are built from named blocks, like layers: strudel_set_block adds or replaces one, and every block plays at once. If Strudel rejects the code, Claude gets the error, and what was playing keeps playing. A page that opens later picks up the current program.

The pages listen on 127.0.0.1. For an event where the audience opens the Strudel page on their phones, set TIDAL_UI_HOST=0.0.0.0 and share http://<your-ip>:7070/strudel. Other machines can watch and listen, but only this machine can press the buttons. The pages load Strudel from unpkg.com and the samples from GitHub, so the browser needs internet access.

Tools

Tool

Arguments

What it does

tidal_eval

channel (d1–d9), pattern

Runs <channel> $ <pattern>

tidal_silence

channel

Runs <channel> silence

tidal_hush

—

Stops everything

tidal_solo

channel

Runs solo <n>

tidal_unsolo

—

Unsolos every channel that was soloed

tidal_get_state

quiet (optional)

Lists what's playing on each channel, when it started, and the tempo. quiet skips logging, for clients that poll

tidal_status

—

Shows the settings in use (ghci, boot file, as resolved), whether Tidal starts and its version, the control port, the last error and the log file. Starts Tidal in GHCi mode, so it reports whether it actually starts

tidal_set_tempo

bpm

Sets the tempo, assuming four beats per cycle

tidal_get_history

limit (default 10)

Lists recent patterns, newest first

tidal_set_layer

channel, name, kind, code, variants (optional)

Adds or replaces one layer of a channel and re-evaluates it

tidal_remove_layer

channel, name

Removes a layer and re-evaluates the channel

tidal_autopilot

action (start, pause, stop, status), optional timing

Keeps layered channels changing between turns

tidal_palette

—

Lists Tidal transforms, sources and controls that combine well

tidal_set_control

name, value, seconds (optional)

Changes a value that patterns read with cF/cS, without re-evaluating; seconds glides to it

strudel_set_block

name, code

Adds or replaces a block in the Strudel program (needs TIDAL_UI_PORT and an open Strudel page)

strudel_remove_block

name

Removes a block; removing the last one hushes Strudel

strudel_set_tempo

bpm

Sets Strudel's tempo (setcpm(bpm/4))

strudel_hush

—

Stops Strudel and clears its blocks

strudel_get_state

—

Shows the program, its blocks, and how many pages are open

tidal_list_samples

filter, refresh (both optional)

Lists the sample banks and synths SuperDirt has installed

Layers

Instead of one pattern string, a channel can be built from named layers:

every 3 (jux rev) $ chop 4 $ s "bd*2 [~ sd]" # crush 4 # n "0 1"
└── transform ──┘   └ tr ┘   └─── source ───┘   └ control ┘  └ control ┘

Claude can change one layer, such as swapping chop 4 for striate 8, without rewriting the rest. Transforms apply in the order they were added, outermost first. Each channel has one source. tidal_eval on a channel replaces its layers.

Changing values while a pattern plays

Re-evaluating a pattern swaps it in all at once. For smooth changes, a pattern can read a named value with cF (numbers) or cS (strings):

d1 $ s "bd*4 hh*8" # lpf (cF 1000 "cutoff")

tidal_set_control then changes cutoff through Tidal's control port, with no re-evaluation. With seconds, the value glides there, for example a filter sweep over 16 seconds. The value number in cF is what's used until the control has been set. The server sends to the cCtrlPort set in the boot file (6011 in the bundled BootTidal.hs), or to Tidal's default 6010 in file mode.

Autopilot

Claude can only change the music when you message it. The autopilot keeps layered channels moving in between. Each layer that has variants, and every transform layer, changes on its own random timer (10–40 seconds by default). A layer either switches to another of its variants, or, if it's a transform, sometimes drops out for a while and comes back later. pause freezes things as they are. stop also hushes everything.

If a pattern uses a sound SuperDirt doesn't have, Tidal still accepts it, but that part is silent. So the server checks every name used with s or sound against your Dirt-Samples folder and SuperDirt's synths, and warns Claude about any it can't find.

Each session is logged to its own file in tidal-mcp-sessions/, next to TIDAL_FILE, named by its start time. The log is a .tidal file: each entry is the code the server ran, under a -- time what happened comment, so you can open it in your editor and evaluate any block to replay that moment. Anything that isn't Tidal code, such as rejected code or Strudel programs, is commented out. Set TIDAL_LOG_FILE to keep adding every session to one file instead; logs are never overwritten. tidal_status says where the current one is.

Environment variables

Variable

Default

TIDAL_USE_GHCI

false

true for direct GHCi mode

TIDAL_BOOT_PATH

the BootTidal.hs in the package

Boot script passed to GHCi

GHCI_PATH

ghci, looked for on PATH, then in ghcup's and Homebrew's folders

GHCi binary

TIDAL_FILE

./tidal-mcp-output.tidal

Output file in file mode

TIDAL_LOG_FILE

a new file per session in tidal-mcp-sessions/, next to TIDAL_FILE

One session log file to add every session to

TIDAL_QUARKS_PATH

SuperCollider's downloaded-quarks folder

Where to find Dirt-Samples and SuperDirt, if SuperCollider keeps them somewhere unusual

TIDAL_SAMPLE_PATHS

—

Extra sample folders to check names against, separated by : (; on Windows). Use the same folders you load with ~dirt.loadSoundFiles

TIDAL_SHARE_SESSION

false

true to share the server's Tidal with your editor (GHCi mode)

TIDAL_SHARE_DIR

~/.tidal-mcp

Where the shared-session socket and the ghci stand-in go

TIDAL_CTRL_PORT

the boot file's cCtrlPort, else 6010

Tidal's control port, for tidal_set_control

TIDAL_CTRL_HOST

127.0.0.1

Host for the control port

TIDAL_UI_PORT

—

Serve the control page and the Strudel page on this port

TIDAL_UI_HOST

127.0.0.1

Address for the pages; 0.0.0.0 lets other machines watch (only this machine can press buttons)

TIDAL_UPDATE_CHECK

true

false stops tidal_status checking npm (at most once a day) for a newer release

TIDAL_TRANSPORT

stdio

websocket to serve MCP over WebSocket instead

For the WebSocket transport and its settings, see WEBSOCKET-USAGE.md.

Troubleshooting

Ask Claude to run tidal_status first. It shows the settings the server is actually using, and why Tidal didn't start.

Couldn't find ghci: the error lists where the server looked. Set GHCI_PATH to the full path of ghci.

Nothing plays:

  1. Check SuperDirt is running and shows listening to Tidal on port 57120.

  2. In GHCi mode, Tidal starts with the first pattern, not with the server. tidal_status says whether it started.

Tidal didn't load: GHCi ran the boot file, but Tidal's functions aren't defined afterwards. Check the boot file imports Sound.Tidal.Context, and that ghci is the one Tidal is installed for.

Tidal's control port ... is in use: another Tidal is running, with the same cCtrlPort: your editor's, or another copy of this server. Two would both play to SuperDirt, so the server won't start a second. Stop the other one, use a boot file with a different cCtrlPort, or share one session with your editor (see above).

Sound keeps going after the server stops: the server stops GHCi when it shuts down. If a GHCi process outlives it, run pkill ghci, or in SuperCollider run s.freeAll.

No samples: install Dirt-Samples (see Requirements), then restart SuperDirt.

ERROR: No more buffer numbers when SuperDirt starts: SuperCollider's buffer limit is too low for Dirt-Samples. Use the startup code under Install instead of SuperDirt.start.

Limitations

  • The server only knows what it has sent. If you also evaluate code by hand in the same Tidal session, tidal_get_state won't reflect it.

  • Type errors come back to Claude, but runtime errors don't. Tidal prints those on its own while the pattern plays, so the server only logs them. File mode has no feedback at all.

  • The pattern is arbitrary Haskell, run with your user's permissions. Only connect clients you trust.

Development

git clone https://github.com/Benedict/tidal-cycles-mcp-server.git
cd tidal-cycles-mcp-server
npm install
npm run build
npm run dev     # run from source with tsx
npm test                 # build, then run the test suite against dist/
npm run typecheck:tidal  # type-check generated Tidal code against your Tidal install
npm run smoke:ghci       # run the built server in GHCi mode against your Tidal (silent patterns only)
npm run bundle           # build tidal-mcp-server.mcpb for Claude Desktop

The tests drive the built server over stdio in file mode, so they don't need GHCi or SuperCollider.

typecheck:tidal starts GHCi with BootTidal.hs and runs :t on every command the server sends and every palette entry. :t checks types without evaluating anything, so nothing plays. smoke:ghci only plays rests on d9, so it's safe to run with SuperDirt up. Set GHCI_PATH if ghci isn't on your PATH. CI runs all of these.

Design notes for possible future features are in docs/design. See CONTRIBUTING.md for where things go in the code.

Releasing

Bump version in package.json, update CHANGELOG.md, merge, then tag:

git tag v1.2.0 && git push origin v1.2.0

.github/workflows/release.yml checks the tag matches package.json, runs the tests, publishes to npm with provenance, then creates a GitHub release with the Claude Desktop bundle attached. It uses npm trusted publishing if the package has this workflow set as a trusted publisher on npmjs.com, and otherwise an NPM_TOKEN repository secret.

License

MIT

Available Tools

20 tools
strudel_get_stateA

Show the Strudel program, its blocks, how many Strudel pages are open, and the page's address.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

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

No annotations are supplied, so the description carries the full burden. 'Show' implies a non-mutating read and there are no parameters, so risk is minimal, but it never explicitly states side-effect freedom or anything about the freshness/latency of the reported state. It does add value by enumerating the returned content in place of a missing output schema.

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?

A single front-loaded sentence that lists what is retrieved with no filler or redundancy. Every clause 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?

With zero parameters and no output schema, the description does the necessary work by naming the returned fields (program, blocks, page count, address). It is close to complete; only the absence of explicit read-only confirmation and any sibling disambiguation keeps it short of full.

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 an empty object with zero parameters, so there is nothing for the description to clarify. Baseline for a no-parameter tool is 4.

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 gives a specific verb ('Show') and names concrete resources: the Strudel program, its blocks, page count, and address. It clearly reads as a read/query tool, though it never distinguishes itself from the sibling 'tidal_get_state', which an agent could easily confuse it with.

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

Usage Guidelines2/5

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

There is no statement of when to use this tool versus alternatives, nor any prerequisites. With a sibling literally named 'tidal_get_state', the omission of any routing guidance is a real gap, leaving the agent to infer the choice from the tool name alone.

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

strudel_hushA

Stop everything in Strudel and clear its blocks.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations, the description carries the full burden, and it does disclose the key mutation: it stops playback and clears blocks (a destructive global effect). However, it says nothing about reversibility, whether other state (tempo, layers) survives, or permissions, leaving gaps a mutation tool would ideally fill.

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?

A single, front-loaded sentence that states the effect and scope with zero filler or 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?

For a zero-parameter, no-output-schema tool, the description communicates what happens (global stop plus block clearing) sufficiently to invoke it. It stops short of noting state persistence or side effects on other Strudel subsystems.

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, so there are no parameter semantics to document; the baseline for a no-parameter tool applies.

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 uses a specific verb pair (stop, clear) and names the resource (Strudel and its blocks), clearly scoping a global stop rather than a single-block edit. It does not explicitly name siblings like strudel_remove_block, so differentiation is implied by 'everything' rather than stated.

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?

Usage is only implied: 'stop everything' suggests a global halt, contrasted against the sibling tidal_hush or per-block tools, but no explicit when-to-use/when-not guidance or alternative routing is given.

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

strudel_remove_blockB

Remove a named block from the Strudel program. Removing the last one hushes Strudel.

NameRequiredDescriptionDefault
nameYes

TDQS

B3.3/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It usefully discloses a key side effect ('Removing the last one hushes Strudel'), which an agent could not infer from the schema. However, it omits error behavior (unknown name), reversibility, and any permission 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-loaded with the core action and followed by the most important behavioral caveat. No wasted words.

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

Completeness3/5

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

For a one-parameter removal tool with no annotations and no output schema, the description is close to adequate but leaves gaps: what happens when the named block does not exist, and how the hush side effect interacts with other state.

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 implies the single 'name' parameter identifies the block to remove, adding marginal meaning, but gives no format, naming convention, or matching semantics (e.g., whether it must match a block set earlier).

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?

States a specific verb ('Remove') and resource ('named block from the Strudel program'), which clearly positions it as the counterpart to strudel_set_block. It does not explicitly name a sibling to differentiate from, but the purpose is unambiguous.

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

Usage Guidelines2/5

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

No guidance on when to use this versus alternatives like strudel_hush (which silences everything) or strudel_set_block. The note about removing the last block hushing Strudel is a side-effect fact, not a when-to-use condition.

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

strudel_set_blockA

Add or replace a named block in the Strudel program, which plays on every open Strudel page (the server's web page at /strudel; needs TIDAL_UI_PORT). Each block is one Strudel pattern in JavaScript syntax, e.g. s("bd*2 [~ sd]").bank("RolandTR909") or note("c e g").s("piano").fast(2). Blocks play together. If Strudel rejects the code, you get its error and nothing changes.

NameRequiredDescriptionDefault
codeYesOne Strudel pattern expression, without $:
nameYesBlock name, e.g. "drums"; reusing a name replaces that block

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses the atomic failure behavior ('if Strudel rejects the code... nothing changes'), the environment prerequisite (needs TIDAL_UI_PORT), and that effects apply to all open pages. It omits success/return behavior and any concurrency or rate-limit notes, keeping it short of a 5.

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?

Purpose is front-loaded in the first clause, and each sentence adds distinct information (scope, block format, interaction, failure mode). The inline example is somewhat bulky but earns its place by demonstrating syntax.

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 two-parameter mutation tool with no annotations and no output schema, the description covers purpose, format, prerequisite, side effects, and failure behavior. It is nearly complete, lacking only detail on the success/return signal.

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 coverage is 100%, so the baseline is 3, but the description adds concrete example patterns (s("bd*2 [~ sd]").bank("RolandTR909")) that illustrate valid `code` syntax and reinforce the replace-on-name-reuse semantics for `name`. This extra illustrative value lifts it above the schema-only baseline.

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?

States a specific verb pair ('Add or replace') and resource ('a named block in the Strudel program'), and clarifies the scope ('plays on every open Strudel page'). An agent can distinguish this from strudel_remove_block or strudel_hush without opening any schema.

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 explains the add-vs-replace semantics (reusing a name replaces that block) and that blocks play together, which implies usage. However, it never names the sibling alternatives (strudel_remove_block, strudel_hush, strudel_get_state) or states when to prefer this tool over them, so guidance is inferred rather than explicit.

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

strudel_set_tempoB

Set Strudel's tempo in beats per minute, assuming four beats per cycle (setcpm(bpm/4)).

NameRequiredDescriptionDefault
bpmYesBeats per minute, from 20 to 999

TDQS

B3.3/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It does disclose the underlying mapping (setcpm(bpm/4), four beats per cycle), which is genuinely useful behavioral context beyond the schema, but it says nothing about immediacy, whether it applies to already-running patterns, or how it interacts with block-level settings.

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?

One sentence, front-loaded with the action and unit, with the technical mapping parenthetically appended. Nothing is wasted and the essential information comes first.

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

Completeness3/5

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

For a single-parameter setter with full schema coverage and no output schema, the description is minimally adequate. It omits scope of effect (live patterns vs. future ones) and any relationship to the sibling tidal_set_tempo, which an agent selecting between them would want.

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 100% and the bpm range (20–999) is documented in the schema itself. The description adds the semantic conversion to cycles per minute, which is a modest value-add but largely complements rather than replaces schema content, so baseline 3 applies.

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?

States a specific verb (Set) and resource (Strudel's tempo) with the unit (beats per minute), and naming 'Strudel's' distinguishes it from the sibling tidal_set_tempo. It stops short of explicitly contrasting the two tempo tools, but the resource is unambiguous.

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

Usage Guidelines2/5

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

There is no guidance on when to use this versus tidal_set_tempo or any other sibling, no prerequisites, and no note on whether it affects currently playing patterns. Usage must be inferred entirely from the name.

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

tidal_autopilotA

Keep layered channels evolving between turns. While running, each layer changes on its own random timer: it switches to another of its variants, and transform layers sometimes lay out for a while. start: begin or resume, optionally with new settings. pause: stop changing, keep playing. stop: stop changing and hush everything. status: report settings and how many layers are moving.

NameRequiredDescriptionDefault
actionYes
maxSecondsNoLongest time between changes to a layer (default 40)
minSecondsNoShortest time between changes to a layer (default 10)
layOutChanceNoChance from 0 to 1 that a transform layer lays out when it changes (default 0.3)

TDQS

A3.7/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does solid work: it discloses the non-obvious background behavior (each layer auto-switches variants on its own random timer, transform layers sometimes lay out), and clarifies the destructive-ish difference between pause ('keep playing') and stop ('hush everything'). It omits permission/auth needs and return shape details, but the core behavioral traits are well conveyed.

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?

Purpose is front-loaded in the first sentence, the mechanism follows, and each action is labeled with a colon in a compact list. It is dense but every clause contributes; minor tightening is possible but nothing is wasted.

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 no output schema and no annotations, the description covers the mechanic and all four actions, including what status reports ('settings and how many layers are moving'). An agent has enough to call it correctly; only the exact return payload and any permission requirements remain unstated.

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 coverage is 75%, with the three numeric params already documented in the schema, so the field-level burden is mostly met by structured data. The description earns credit by explaining the required 'action' enum values that the schema leaves undescribed, but it does not clarify the units/ranges of maxSeconds, minSeconds, or layOutChance. Baseline 3 is appropriate.

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 opening sentence 'Keep layered channels evolving between turns' gives a specific verb-like behavior and resource (layered channels), and the mechanic is explained precisely. It does not name or contrast against siblings like tidal_status or tidal_hush, so an agent must infer differentiation, but the concept itself is unambiguous.

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 defines what each action (start/pause/stop/status) means, which functions as implicit usage guidance for the modes. However, it never states when to reach for this tool versus tidal_hush, tidal_status, or tidal_eval, nor any prerequisites/exclusions, so the routing guidance is only implied.

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

tidal_evalA

Evaluate a TidalCycles pattern on a specific channel (d1-d9). Replaces anything on that channel, including its layers. To build a channel you can edit piece by piece, use tidal_set_layer instead.

NameRequiredDescriptionDefault
channelYesThe channel to evaluate on (d1, d2, ... d9)
patternYesThe TidalCycles pattern to evaluate (without the 'd1 $' prefix)

TDQS

A4.2/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden. It usefully discloses destructive semantics, namely that the call replaces everything on the channel including its layers, but says nothing about session prerequisites, error behavior for occupied channels, or what is returned.

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 sentences, zero filler, and the replacement consequence is front-loaded before the routing pointer to the sibling tool. Every clause 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?

For a two-parameter mutation tool with no output schema and no annotations, the description covers the critical unknown (full replacement of the channel) but omits return/state feedback and any prerequisite about a running Tidal session, leaving a modest gap.

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 100%, so both parameters are already documented in the schema, including the enum and the 'without d1 $ prefix' note. The description restates the channel range but adds no syntax or format detail beyond the schema, so the baseline 3 applies.

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?

States a specific verb (evaluate) and resource (a TidalCycles pattern on channel d1-d9), plus the scope of the effect. It explicitly names and contrasts with the sibling tidal_set_layer, so an agent can distinguish it without opening 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?

Gives an explicit alternative (tidal_set_layer) and the condition that selects it: when you want to build a channel piece by piece. The implied counterpart, use this tool when you want whole-channel replacement, follows directly.

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

tidal_get_historyA

Get the history of patterns evaluated in this session.

NameRequiredDescriptionDefault
limitNoMaximum number of history items to return (default: 10)

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. The verb 'Get' implies a read-only operation, and the phrase 'evaluated in this session' adds scoping context. However, it does not disclose the return format, ordering, or explicitly state that no state is modified, which is only minimally adequate for a simple getter.

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 a single, front-loaded sentence with no unnecessary words. Every word contributes to understanding the tool's purpose and scope, making it highly efficient.

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

Completeness3/5

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

This is a simple tool with one optional parameter and no output schema. The description plus schema is sufficient for basic invocation, but the return format of the history is not described, leaving some ambiguity about what an agent should expect in the response.

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 100%, as the only parameter 'limit' is fully described with its default value and meaning. The description adds no additional parameter information, so the baseline score of 3 applies.

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 a specific verb ('Get') and resource ('history of patterns evaluated in this session'). It distinguishes itself from sibling getter tools like tidal_get_state and tidal_get_samples by scoping to session-evaluated patterns, making 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 Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives. It does not mention any conditions, exclusions, or sibling tools, so an agent must infer appropriate usage solely from the name and description.

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

tidal_get_stateA

Get the current state of all channels - what patterns are playing and when they started.

NameRequiredDescriptionDefault
quietNoDon't log this call. For clients that poll the state often.

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. It discloses the shape of the return (per-channel patterns plus start times), which is genuinely useful, but says nothing about side effects, whether the call mutates anything, or the logging behavior implied by the schema's 'quiet' flag.

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?

One sentence, front-loaded with the verb and scope, with the return-content detail appended where it is useful. Nothing is wasted.

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 read-only state getter with no output schema, the description adequately conveys what comes back, so an agent knows what to expect. It falls short only in not clarifying the boundary with tidal_status or tidal_get_history.

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?

There is a single optional parameter and schema coverage is 100%, so the schema already fully documents 'quiet'. The description adds no meaning beyond it, which is the baseline-3 case for fully-covered schemas.

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 gives a specific verb+resource ('Get the current state of all channels') and even characterizes the payload ('what patterns are playing and when they started'). It does not, however, differentiate itself from close siblings like tidal_status, tidal_get_history, or strudel_get_state, which is what a 5 would require.

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?

Usage is implied by 'current state' — an agent can infer this is the polling/read tool — but there is no explicit when-to-use guidance, no statement of when not to use it, and no routing to alternatives such as tidal_get_history for past state.

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

tidal_hushA

Stop all currently playing patterns immediately. Use this to clear everything.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It clearly discloses the core behavior (stops all currently playing patterns) and the urgency ('immediately'), but it does not explain side effects, reversibility, or what 'clear everything' means for the Tidal state beyond stopping patterns. This is a moderate gap for a mutating tool.

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 consists of two short sentences that are front-loaded with the action. Every word earns its place, and there is no redundant or filler content.

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 zero-parameter, no-output-schema tool, the description covers the essential action and the intended usage context. It could be more complete by noting whether the stop is reversible or what happens to the pattern definitions afterwards, but for a simple stop-all command it is largely 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 input schema has zero parameters, so the baseline 4 applies. There is no parameter meaning to add, and the description correctly avoids referencing nonexistent arguments.

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 states a specific verb ('Stop'), a specific resource ('all currently playing patterns'), and a timing qualifier ('immediately'). The phrase 'clear everything' reinforces the scope. It does not explicitly distinguish from siblings like tidal_silence, but the action is 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?

Gives a direct instruction: 'Use this to clear everything.' This tells an agent when the tool is the right choice. It does not mention when not to use it or name alternatives such as tidal_silence, so falls short of an explicit routing guide.

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

tidal_list_samplesA

List the sample banks and synths SuperDirt has installed. Use these names with s or sound; any other name is silent. Check here before using a sample you aren't sure exists.

NameRequiredDescriptionDefault
filterNoOnly list names containing this, e.g. "808" or "bass"
refreshNoRe-read the sample folders, e.g. after installing new samples

TDQS

A3.9/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden. It usefully discloses that unrecognized names are silently ignored ('any other name is silent'), which is real behavioral value beyond structured fields, but it says nothing about the return shape, ordering, or whether the call has any side effects.

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?

Three short sentences with no filler, and the core action is front-loaded in the first sentence. Slightly more terse than necessary but everything present 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?

For a simple two-parameter read-only listing tool with no output schema, the description covers what it returns (names usable with s/sound) and when to use it. Only the absence of return-format or refresh-cost detail keeps it from a 5.

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 100%, so both the 'filter' and 'refresh' parameters are already fully documented in the schema. The description adds no parameter-level detail (e.g., substring vs. exact match, cost of refresh), so the baseline 3 applies.

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?

States a specific verb (List) and resource (sample banks and synths installed in SuperDirt), plus the scope qualifier 'SuperDirt has installed'. It is clearly separable from the sibling tools, which are all about tempo, layers, hush, or evaluation rather than sample discovery.

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?

Gives concrete usage context: 'Use these names with s or sound' and 'Check here before using a sample you aren't sure exists', which tells the agent exactly when to call it. It does not name a competing tool or state exclusions, so it falls short of a 5.

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

tidal_paletteA

Get a reference list of Tidal transforms, sources and controls that combine well, grouped by layer kind.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations, the description carries the full burden, and it does disclose the return shape at a high level (grouped by layer kind). It does not state that this is a static/read-only reference lookup with no side effects, nor whether results are cached or context-dependent. Adequate, but thin for a tool with zero annotation coverage.

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?

A single front-loaded sentence with the verb and resource first and no filler. Every clause earns its place by naming the three categories (transforms, sources, controls) and the grouping dimension.

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

Completeness3/5

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

With no output schema and no annotations, the description should do more to describe what an entry looks like or how the result feeds into sibling tools such as tidal_set_layer or tidal_set_control. The grouping key is mentioned, but the shape and intended downstream use of the returned entries are left implicit.

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, so there is nothing for the description to disambiguate; the baseline of 4 applies. No misleading parameter language is present.

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?

States a specific verb ("Get") and a clearly named resource (a reference list of Tidal transforms, sources and controls grouped by layer kind). This is distinguishable from siblings like tidal_list_samples or tidal_get_state, which retrieve different resources. It stops short of 5 only because it doesn't contrast itself with any sibling by name.

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 phrase "that combine well" implies the use case (consulting this while building a layer), but there is no explicit when-to-use, when-not-to-use, or named alternative. Usage is inferable from the description rather than stated.

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

tidal_remove_layerA

Remove a named layer from a channel and re-evaluate it. Removing the last layer silences the channel.

NameRequiredDescriptionDefault
nameYesThe layer to remove
channelYesThe channel (d1-d9)

TDQS

A3.5/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden. It does disclose two useful traits: removal triggers a re-evaluation, and removing the last layer silences the channel. It is silent on the failure mode for a nonexistent layer name, whether removal is reversible/undoable, and any permission 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, front-loaded sentences with zero waste. The primary action comes first and the consequential side effect (last layer silences the channel) follows as a distinct, earned clause.

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

Completeness3/5

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

For a simple two-parameter tool with no output schema, the description covers the core operation and its main side effect. However, with no annotations marking this as a destructive mutation, the description should more clearly convey reversibility and the no-op/error case for an unknown layer.

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 coverage is 100% and the two parameters are self-describing (name, channel with d1-d9 enum), so the schema does the heavy lifting and baseline 3 applies. The description adds only 'named layer' and 'channel' framing, no format or matching semantics beyond the schema.

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?

States a specific verb+resource: 'Remove a named layer from a channel'. An agent can immediately tell this is the inverse of tidal_set_layer. It does not explicitly name that sibling or distinguish itself from silence-oriented tools like tidal_hush/tidal_silence, so it misses the top tier.

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?

Usage is implied by the operation ('remove a layer') but there is no explicit when-to-use, when-not-to-use, or alternative routing. With siblings like tidal_hush, tidal_silence, and tidal_set_layer, a sentence such as 'use tidal_hush to clear all layers, use tidal_set_layer to modify one' would have closed the gap.

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

tidal_set_controlA

Change a named value in Tidal without re-evaluating any pattern, through Tidal's control port. Patterns read it with cF (numbers) or cS (strings), e.g. tidal_eval d1 's "bd*4" # lpf (cF 1000 "cutoff")', then set cutoff here. With seconds, a number glides from its current value, for sweeps and fades.

NameRequiredDescriptionDefault
nameYesThe control name used in cF/cS, e.g. "cutoff"
valueYesThe new value
secondsNoOptional: glide to the value over this many seconds (numbers only, up to 300)

TDQS

A4/5.0
Behavior4/5

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

With no annotations the description carries the full burden, and it delivers: it explains the control-port mechanism, that patterns are not re-evaluated, and that a number glides over the given seconds for sweeps/fades. It omits failure behavior (e.g., setting an unknown control name) and persistence, but the core behavioral traits are well covered.

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?

Front-loads the core action in the first clause, then adds mechanism and an example that each earn their place. Slightly dense with two long sentences, but there's no 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 3-parameter control setter with no annotations or output schema, the description is largely self-sufficient: mechanism, usage example, and glide behavior are all present. Only edge cases like invalid names or persistence are left unaddressed.

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 coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema: the example ties the "name" parameter to the cF/cS lookup ("cutoff") and expands on the "seconds" parameter's glide semantics beyond the schema's brief note.

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?

States a specific verb and resource ("Change a named value in Tidal") and clarifies the mechanism (the control port, without re-evaluating a pattern), which distinguishes it from tidal_eval. It doesn't explicitly separate itself from the more specific setters like tidal_set_tempo, but the named-value/control-port scope is clear.

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?

Gives the concrete workflow: patterns read the value with cF/cS, then you set it here, backed by a runnable example. It establishes when to use this tool clearly, though it stops short of naming explicit alternatives or exclusions.

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

tidal_set_layerA

Add or replace one named layer of a channel, then re-evaluate that channel. A channel's pattern is built as: $ $ ... # # . Transforms apply in the order they were added, outermost first. Each channel has one source; setting a new one replaces the old. Give variants to let tidal_autopilot switch between them. Call tidal_palette for idioms that work.

NameRequiredDescriptionDefault
codeYesThe layer's code, without the $ or # that joins it
kindYestransform: a function applied with $ (e.g. "every 3 (jux rev)"). source: the base pattern (e.g. 's "bd*2 sd"'). control: an effect applied with # (e.g. "crush 4").
nameYesLayer name, e.g. "rhythm", "stereo", "filter". Reusing a name replaces that layer.
channelYesThe channel (d1-d9)
variantsNoOptional alternatives the autopilot may switch to. Keep them the same shape as code.

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does well: it discloses add-or-replace semantics, that each channel has one source and a new one replaces the old, transform ordering ('outermost first'), and the re-evaluation side effect. It omits failure behavior and permissions, but the mutation semantics are unusually well surfaced.

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 core action is front-loaded and no sentence is pure filler; the pattern-grammar sentence and sibling pointers each earn their place. It is dense, but the density is justified by the tool's complexity.

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 5-param mutation tool with no annotations and no output schema, the description covers action, side effects, composition rules, and sibling routing. It leaves the response/return behavior and error cases unstated, which keeps it from the top 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 coverage is 100%, so baseline is 3, but the description adds real meaning beyond the schema: it explains the pattern grammar that code slots into, clarifies transform ordering, and reinforces why variants exist. That is genuine value over the field-level docs.

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+resource ('Add or replace one named layer of a channel') plus a concrete side effect ('then re-evaluate that channel'). This clearly separates it from siblings like tidal_remove_layer, tidal_set_control, and tidal_palette.

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 guidance on using variants ('Give variants to let tidal_autopilot switch between them') and points to a sibling for valid idioms ('Call tidal_palette for idioms that work'). It stops short of explicit when-not/exclusion rules, so it lands below the top tier.

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

tidal_set_tempoB

Set the tempo in beats per minute, assuming four beats per cycle (setcps (bpm/60/4)).

NameRequiredDescriptionDefault
bpmYesBeats per minute, from 20 to 999

TDQS

B3.2/5.0
Behavior3/5

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

With no annotations, the description carries the full burden, and it does disclose the interpretational model (four beats per cycle, setcps (bpm/60/4)). However it says nothing about whether the change applies live to currently playing patterns, persistence, or any session requirements.

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?

A single economical sentence with the core action front-loaded and no filler. The parenthetical formula is arguably dense but earns its place by clarifying units.

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 trivial one-parameter setter with no output schema and no annotations, the description covers the action, unit, and semantics adequately. Only the missing sibling routing context keeps it from being fully complete.

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 coverage is 100% and the bpm parameter is already documented in the schema with its 20-999 range. The description adds the beat-cycle interpretation, but that meaning is marginal beyond what the schema provides.

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?

States a specific verb+resource ('Set the tempo in beats per minute') and even exposes the underlying conversion, so the action is unambiguous. It does not differentiate itself from the sibling strudel_set_tempo, which is the main gap.

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

Usage Guidelines2/5

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

No guidance on when to use this versus alternatives like strudel_set_tempo or tidal_set_control, and no prerequisites or context about a running session. The agent must infer usage entirely.

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

tidal_silenceA

Stop a specific channel. More graceful than hush for single channels.

NameRequiredDescriptionDefault
channelYesThe channel to silence (d1-d9)

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description states the core behavior (stop/silence) and adds a graceful-vs-hush nuance. However, it does not clarify whether stop is reversible, what state changes occur, or whether any side effects affect playback.

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?

One short sentence with two clauses, front-loaded action, no filler. Every word contributes either the action or the sibling comparison.

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 a single required enum parameter and no output schema, the description is nearly complete for invocation. It could be slightly stronger by saying explicitly what the resulting channel state is or how this differs from hush behaviorally, but the tool is simple enough that little is missing.

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 coverage is 100% and the channel parameter is fully enumerated (d1-d9), so the schema already carries the parameter meaning. The description adds little beyond the singular 'specific channel' notion, which is consistent with 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 uses a specific verb 'Stop' with a specific resource 'a specific channel' and the required channel parameter is documented via enum. It also explicitly distinguishes itself from sibling tidal_hush by positioning itself as 'more graceful' for one channel, so an agent can tell them apart.

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 comparative guidance: use this over tidal_hush for single channels. It does not spell out exclusions or mention other sibling tools like tidal_solo/tidal_unsolo, but the context is sufficient for basic routing.

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

tidal_soloA

Solo a specific channel, muting all others until tidal_unsolo is called.

NameRequiredDescriptionDefault
channelYesThe channel to solo

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations, the description carries the full burden, and it does disclose two non-obvious traits: the tool mutes all other channels, and the state persists until tidal_unsolo is called (i.e., it is reversible and stateful). It omits edge cases such as soloing an already-soloed channel or whether inactive/empty channels can be soloed, which keeps it from a 5.

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?

A single sentence, front-loaded with the action and followed by the scope and lifecycle constraint. Every clause earns its place with no 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 simple one-parameter tool with no output schema and no annotations, the description covers the effect, scope, and reversibility, which is most of what an agent needs. Minor gaps remain around interaction with other mute tools and behavior on inactive channels.

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 coverage is 100% and the single channel parameter has a documented enum plus a description, so the baseline is 3. The description's "a specific channel" adds no format or semantic detail beyond what the schema already provides.

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?

Specific verb+resource ("Solo a specific channel") with the effect spelled out ("muting all others"), and it names the sibling tidal_unsolo that reverses it. It does not explicitly distinguish itself from other mute-family siblings like tidal_hush or tidal_silence, so it stops short of a 5.

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 phrase "until tidal_unsolo is called" implies the lifecycle and points at the paired undo tool, which is useful implied usage guidance. There is no explicit when-to-use/when-not statement or comparison against mute alternatives such as tidal_hush or tidal_silence.

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

tidal_statusA

Check the server's setup: mode, the ghci and boot file it uses (as resolved), whether Tidal is running and its version, the control port, the last error, and where it logs. In GHCi mode this starts Tidal if it isn't running, so it reports whether Tidal actually starts. Use it when something doesn't work.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the full burden, and it discloses a critical non-obvious side effect: in GHCi mode the call starts Tidal if it isn't running, making this not a pure read. It also says the report reflects whether Tidal actually starts. Missing are auth requirements, blocking/timeout behavior, and failure modes, which keeps it short of a 5.

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?

Front-loads the core purpose and the returned-fields list, then adds the side-effect caveat and usage cue. Dense and mostly waste-free, though the long comma-separated enumeration reads like a field dump rather than prose.

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 zero-param tool with no output schema and no annotations, the description covers the returned information and the important side effect, which is what an agent needs to decide to call it. It stops short of describing error/response shape or what a healthy vs unhealthy report looks like.

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, so per the rubric the baseline is 4. There is nothing parameter-related for the description to clarify or omit.

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?

States a specific verb ('Check') and resource ('the server's setup') and then enumerates the exact facets inspected: mode, ghci/boot file as resolved, Tidal running state and version, control port, last error, log location. That enumeration clearly separates it from siblings like tidal_get_state (musical/pattern state) without needing to name them.

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?

Provides one usage cue — 'Use it when something doesn't work' — which implies a diagnostic role, but names no alternative tools (e.g. tidal_get_state, tidal_eval) and gives no when-not condition. Usage is implied rather than scoped.

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

tidal_unsoloA

Restore all channels after soloing (unsolos every soloed channel).

NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It does disclose the key behavioral fact that ALL soloed channels are affected, not one, but says nothing about permissions, whether it is a no-op when nothing is soloed, or any side effects.

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?

One short sentence, front-loaded with the action. The parenthetical is mildly redundant with the main clause but does clarify that all channels are affected.

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 simple, zero-parameter state toggle with no output schema, the description supplies what an agent needs to call it correctly. Deeper behavioral detail (no-op behavior, error conditions) is absent but not critical here.

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, so there is no parameter semantics to document. Baseline 4 applies for a 0-param tool.

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?

States a specific action and resource: restoring all channels that were soloed. The inverse relationship to tidal_solo is evident, though it never names the sibling. The parenthetical is largely a restatement of the tool name.

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 phrase 'after soloing' implies the context of use (undoing a prior tidal_solo). There is no explicit when-to-use/when-not guidance or named alternative beyond the obvious inverse relationship.

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. 14 tool updatesv1.1.0
    • Addedstrudel_get_state
    • Addedstrudel_hush
    • Addedstrudel_remove_block
    • Addedstrudel_set_block
    • Addedstrudel_set_tempo
    • Addedtidal_autopilot
    • Changedtidal_get_state1 field changed
      • addedInput schema / properties / quiet
        Added value: +{
        +  "description": "Don't log this call. For clients that poll the state often.",
        +  "type": "boolean"
        +}
    • Addedtidal_list_samples
    • Addedtidal_palette
    • Addedtidal_remove_layer
    • Addedtidal_set_control
    • Addedtidal_set_layer
    • Addedtidal_set_tempo
    • Addedtidal_status
  2. 7 tool updatesv1.0.0
    • First observedtidal_eval
    • First observedtidal_get_history
    • First observedtidal_get_state
    • First observedtidal_hush
    • First observedtidal_silence
    • First observedtidal_solo
    • First observedtidal_unsolo

TDQS

A3.6/5.0

Scored across 20 tools

Disambiguation4/5

The tidal_/strudel_ prefixes cleanly separate the two subsystems, and descriptions explicitly differentiate the easy confusions (tidal_hush for all vs tidal_silence for one channel; tidal_eval replaces a whole channel vs tidal_set_layer builds piece by piece). The three read-back tools (tidal_get_state, tidal_status, tidal_get_history) target genuinely different things but their similar 'get/status' framing creates mild ambiguity. Overall mostly distinct with a couple of soft overlaps.

Naming Consistency4/5

All names use snake_case with a consistent domain prefix (tidal_ or strudel_), and most follow verb_noun (set_layer, remove_layer, list_samples, get_state, set_tempo). A handful drop the noun (tidal_solo, tidal_hush, tidal_eval, tidal_palette), which is a minor deviation but keeps the prefix system predictable.

Tool Count4/5

Twenty tools exceeds the typical 3-15 sweet spot, but the surface spans two distinct systems (Tidal and Strudel) plus layered-channel management, autopilot, palette, and samples, so most tools earn their place. It is slightly heavy but not gratuitous.

Completeness4/5

Tidal coverage is close to full (eval, layer add/remove, hush/silence, solo/unsolo, tempo, control port, palette, samples, history, status). Strudel is thinner, lacking solo, palette, samples, and control equivalents, but its core block/tempo/hush lifecycle is present. Minor gaps an agent can work around.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers