TidalCycles MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| GHCI_PATH | No | Path to the ghci executable (required for direct GHCi mode) | |
| TIDAL_FILE | No | Absolute path to the output .tidal file (used in both modes) | |
| TIDAL_USE_GHCI | No | Set to 'true' to enable direct GHCi mode (experimental) | |
| TIDAL_BOOT_PATH | No | Absolute path to BootTidal.hs file (required for direct GHCi mode) |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| 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. |
| tidal_hushA | Stop all currently playing patterns immediately. Use this to clear everything. |
| tidal_silenceA | Stop a specific channel. More graceful than hush for single channels. |
| tidal_get_stateA | Get the current state of all channels - what patterns are playing and when they started. |
| 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. |
| tidal_set_tempoB | Set the tempo in beats per minute, assuming four beats per cycle (setcps (bpm/60/4)). |
| tidal_soloA | Solo a specific channel, muting all others until tidal_unsolo is called. |
| tidal_unsoloA | Restore all channels after soloing (unsolos every soloed channel). |
| tidal_get_historyA | Get the history of patterns evaluated in this session. |
| 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. |
| tidal_remove_layerA | Remove a named layer from a channel and re-evaluate it. Removing the last layer silences the channel. |
| 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. |
| 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. |
| strudel_remove_blockB | Remove a named block from the Strudel program. Removing the last one hushes Strudel. |
| strudel_set_tempoB | Set Strudel's tempo in beats per minute, assuming four beats per cycle (setcpm(bpm/4)). |
| strudel_hushA | Stop everything in Strudel and clear its blocks. |
| strudel_get_stateA | Show the Strudel program, its blocks, how many Strudel pages are open, and the page's address. |
| tidal_paletteA | Get a reference list of Tidal transforms, sources and controls that combine well, grouped by layer kind. |
| 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. |
| 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. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
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.