TidalCycles MCP Server
This MCP server lets an MCP client control TidalCycles and Strudel: evaluate and manage patterns, layers, tempo, controls, samples, playback state, and web-based Strudel playback.
Evaluate, silence, hush, solo, and unsolo TidalCycles patterns on channels
d1–d9.Build channels layer by layer using transforms, sources, and controls; replace or remove named layers and provide autopilot variants.
Set tempo, change named
cF/cScontrol values without re-evaluation, and optionally glide numeric values over time.Query current channel state, evaluation history, server/Tidal status, and installed sample banks or synths.
Get a palette of working Tidal transforms, sources, and controls.
Run autopilot to keep layered channels evolving between turns.
Control Strudel blocks, tempo, hush, and state when the web UI is enabled.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@TidalCycles MCP ServerCreate a funky drum pattern"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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_sampleslists 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_stateshows each channel's code, including anything you've played yourself in a shared session.Idioms that work.
tidal_palettelists 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")andQuarks.install("Dirt-Samples"), then recompile the class libraryAn 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.
Direct GHCi mode (recommended)
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
hushand 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.hsis skipped, because the server has already booted Tidal. UseTIDAL_BOOT_PATHto 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 thestrudel_*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 |
|
| Runs |
|
| Runs |
| — | Stops everything |
|
| Runs |
| — | Unsolos every channel that was soloed |
|
| Lists what's playing on each channel, when it started, and the tempo. |
| — | 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 |
|
| Sets the tempo, assuming four beats per cycle |
|
| Lists recent patterns, newest first |
|
| Adds or replaces one layer of a channel and re-evaluates it |
|
| Removes a layer and re-evaluates the channel |
|
| Keeps layered channels changing between turns |
| — | Lists Tidal transforms, sources and controls that combine well |
|
| Changes a value that patterns read with |
|
| Adds or replaces a block in the Strudel program (needs |
|
| Removes a block; removing the last one hushes Strudel |
|
| Sets Strudel's tempo ( |
| — | Stops Strudel and clears its blocks |
| — | Shows the program, its blocks, and how many pages are open |
|
| 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 | |
|
|
|
| the | Boot script passed to GHCi |
|
| GHCi binary |
|
| Output file in file mode |
| a new file per session in | One session log file to add every session to |
| SuperCollider's | Where to find Dirt-Samples and SuperDirt, if SuperCollider keeps them somewhere unusual |
| — | Extra sample folders to check names against, separated by |
|
|
|
|
| Where the shared-session socket and the |
| the boot file's | Tidal's control port, for |
|
| Host for the control port |
| — | Serve the control page and the Strudel page on this port |
|
| Address for the pages; |
|
|
|
|
|
|
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:
Check SuperDirt is running and shows
listening to Tidal on port 57120.In GHCi mode, Tidal starts with the first pattern, not with the server.
tidal_statussays 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_statewon'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 DesktopThe 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 toolsstrudel_get_stateA
Show the Strudel program, its blocks, how many Strudel pages are open, and the page's address.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | One Strudel pattern expression, without $: | |
| name | Yes | Block name, e.g. "drums"; reusing a name replaces that block |
TDQS
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.
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.
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.
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.
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.
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)).
| Name | Required | Description | Default |
|---|---|---|---|
| bpm | Yes | Beats per minute, from 20 to 999 |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| maxSeconds | No | Longest time between changes to a layer (default 40) | |
| minSeconds | No | Shortest time between changes to a layer (default 10) | |
| layOutChance | No | Chance from 0 to 1 that a transform layer lays out when it changes (default 0.3) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| channel | Yes | The channel to evaluate on (d1, d2, ... d9) | |
| pattern | Yes | The TidalCycles pattern to evaluate (without the 'd1 $' prefix) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of history items to return (default: 10) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| quiet | No | Don't log this call. For clients that poll the state often. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| filter | No | Only list names containing this, e.g. "808" or "bass" | |
| refresh | No | Re-read the sample folders, e.g. after installing new samples |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The layer to remove | |
| channel | Yes | The channel (d1-d9) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The control name used in cF/cS, e.g. "cutoff" | |
| value | Yes | The new value | |
| seconds | No | Optional: glide to the value over this many seconds (numbers only, up to 300) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | The layer's code, without the $ or # that joins it | |
| kind | Yes | transform: 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"). | |
| name | Yes | Layer name, e.g. "rhythm", "stereo", "filter". Reusing a name replaces that layer. | |
| channel | Yes | The channel (d1-d9) | |
| variants | No | Optional alternatives the autopilot may switch to. Keep them the same shape as code. |
TDQS
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.
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.
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.
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.
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.
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)).
| Name | Required | Description | Default |
|---|---|---|---|
| bpm | Yes | Beats per minute, from 20 to 999 |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| channel | Yes | The channel to silence (d1-d9) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| channel | Yes | The channel to solo |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
14 tool updates
v1.1.0- Added
strudel_get_state - Added
strudel_hush - Added
strudel_remove_block - Added
strudel_set_block - Added
strudel_set_tempo - Added
tidal_autopilot - Changed
tidal_get_state1 field changed- added
Input schema / properties / quietAdded value: +{ + "description": "Don't log this call. For clients that poll the state often.", + "type": "boolean" +}
- Added
tidal_list_samples - Added
tidal_palette - Added
tidal_remove_layer - Added
tidal_set_control - Added
tidal_set_layer - Added
tidal_set_tempo - Added
tidal_status
7 tool updates
v1.0.0- First observed
tidal_eval - First observed
tidal_get_history - First observed
tidal_get_state - First observed
tidal_hush - First observed
tidal_silence - First observed
tidal_solo - First observed
tidal_unsolo
TDQS
Scored across 20 tools
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.
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.
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.
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
Related MCP Connectors
Generate AI music via the Lacuna Music API from MCP clients like Claude Desktop & Code.
Create projects, nodes, and tasks in UluP Spaces by conversation with Claude.
Use AI models for chat, image, and video generation from Claude Code and other MCP hosts.
Deploy, monitor, and manage your OpenClaw AI assistants via natural language.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables natural language control over Ableton Live for generating musical patterns, melodies, and full song arrangements. It also provides tools for sample searching and mixing assistance through an OSC-based connection with Claude Desktop.1MIT
- AlicenseNot gradedqualityCmaintenanceConnects Claude Code to SuperCollider for AI-driven music composition, supporting real-time playback and non-realtime audio rendering at 50-150x realtime speed.MIT
- FlicenseNot gradedqualityCmaintenanceControl Ableton Live using natural language via Claude Code, with music theory engine for progressions, project persistence, and song cloning.-
- AlicenseAqualityDmaintenanceEnables conversational live coding with Claude AI and TidalCycles for algorithmic music composition, allowing natural language control of patterns, channels, and state.829 npmMIT