Set Planner
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., "@Set Plannerhow long will my set run with these tracks and 16s overlaps?"
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.
Set Planner
An MCP server for the maths a DJ normally does in their head: how long will this set run, and what should I play next?
把 DJ 平时在脑子里算的事交给它:这套 set 一共多长时间、下一首该放什么(打分完全可解释)。
Works with any MCP-compatible agent or client.
Features
Set timing. Turns cue A/B points into per-track segments, transition overlaps, phrasing warnings and one total runtime.
Next-track suggestions. Ranks candidates by bpm (half/double time included), key compatibility, genre overlap and energy change — and explains every score.
Nothing is opened. It works purely on the track JSON you give it; no audio files, no Rekordbox/Serato databases.
Explainable. Each suggestion comes with reasons, a score breakdown and cautions; each plan comes with explicit warnings instead of silent guesses.
Related MCP server: navidrome-mcp
Requirements
OS | macOS, Linux or Windows |
Python | 3.9 or newer |
Runtime deps | none |
Install
As a Codex plugin
codex plugin marketplace add shadowroommusic/set-planner
codex plugin add set-planner@shadowroomIn any other MCP client
{
"mcpServers": {
"set-planner": {
"command": "python3",
"args": ["mcp_server.py"],
"cwd": "/path/to/set-planner"
}
}
}CLI only
python3 -m venv .venv
.venv/bin/pip install -e .
.venv/bin/shadow-set-planner --helpInput format
{
"tracks": [
{
"id": "track-1",
"title": "Warehouse Tool",
"bpm": 128,
"key": "8A",
"genres": ["techno", "melodic techno"],
"energy": 6,
"duration_ms": 360000,
"cues": [
{ "name": "A", "position_ms": 15000 },
{ "name": "B", "position_ms": 210000 }
]
}
],
"transitions": [
{ "from": "track-1", "to": "track-2", "overlap_ms": 16000 }
]
}cues accepts A/B, intro/outro, in/out, start/end and loop cues with end_ms;
key accepts Camelot (8A) or musical notation (A minor, Am, G#m, Db); genres accepts a
list or a comma-separated string; transitions is optional.
Tools
Tool | What it does |
| Time an ordered set ( |
| Rank what to play next ( |
CLI equivalents: shadow-set-planner plan and shadow-set-planner suggest.
Usage
# time an ordered set (16 second blends here)
.venv/bin/shadow-set-planner plan --input set.json --overlap-ms 16000 --output plan.json
# what should follow the track that is playing now?
.venv/bin/shadow-set-planner suggest --library library.json --current track-1 --limit 5plan reports a timeline (segments, play positions, cue points, overlaps), transitions,
a summary (total runtime, segment sum, time saved by blending) and warnings. suggest reports
ranked candidates with reasons, breakdown and cautions.
Safety
Read-only and offline: no audio files or vendor databases are touched.
All input comes from the JSON you provide; plans and suggestions are just files (or stdout).
Troubleshooting
Symptom | What to do |
“missing A/B cues” warnings | Add |
Suggestions look flat | Give tracks |
Tempo jumps flagged | That warning means Beat Sync or pitch adjustment is needed at the transition. |
Contributing
See CONTRIBUTING.md. Implementation notes live in docs/internals.md.
License
AGPL-3.0 — see LICENSE.
Available Tools
2 toolsplan_setC
Time an ordered set: cue A/B segment lengths, transition overlaps, warnings and total runtime.
| Name | Required | Description | Default |
|---|---|---|---|
| set | No | Object with a 'tracks' array and an optional 'transitions' array. | |
| input_path | No | Read the set JSON from this file instead. | |
| default_overlap_ms | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It hints at output content (warnings, total runtime) but says nothing about whether the tool mutates state, what permissions it needs, or what constraints apply. For a computation tool with zero annotation coverage this is thin.
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 no filler; the verb and resource lead. It could not be much shorter, though the jargon 'cue A/B' is unexplained.
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 a nested 'set' object, three parameters, no annotations, and no output schema, the description should do much more. It partially compensates for the missing output schema by naming the return artifacts, but omits the input-route choice, the overlap parameter, and any usage context.
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 67%, covering 'set' and 'input_path' but leaving 'default_overlap_ms' undocumented. The description adds no parameter meaning at all - it never explains the overlap semantics, the relationship between inline set and input_path, or what 'transitions' affect, despite transition overlaps being the tool's stated concern.
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 ('Time') and resource ('an ordered set') and enumerates the produced artifacts: cue A/B segment lengths, transition overlaps, warnings, and total runtime. It distinguishes itself adequately, though the sole sibling suggest_next is unrelated so no real differentiation pressure exists.
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 indication of when to call this tool versus alternatives, nor when to supply 'set' inline versus 'input_path'. The existence of two mutually-exclusive input routes is left entirely to the agent to infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_nextC
Rank the next tracks for a current track using bpm, Camelot key, genre and energy.
| Name | Required | Description | Default |
|---|---|---|---|
| pool | No | Candidate tracks to rank. | |
| limit | No | ||
| current | No | The track that is playing now. | |
| min_score | No | ||
| current_id | No | id of the current track when using library_path. | |
| exclude_ids | No | ||
| library_path | No | Read the candidate pool from this JSON file instead. |
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 implies ranking/scoring but never states whether the operation is read-only, deterministic, how ties are broken, how min_score filters results, or how the two input modes (pool vs library_path) behave — all significant for a 7-param 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?
A single front-loaded sentence with no wasted words. It is efficiently structured, though arguably under-specified rather than genuinely concise.
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 7 parameters, nested objects, two mutually exclusive input paths, and no output schema or annotations, the description omits too much. The relationship between current/current_id/library_path and the meaning of the returned ranking are left entirely unexplained.
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 57%, so several parameters (limit, min_score, exclude_ids, current_id) are undocumented in the schema, and the description does not compensate. The signals it names (bpm, Camelot key, genre, energy) are not parameters at all — they are attributes of the track objects, so the sentence adds no real parameter semantics.
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 (rank) and resource (next tracks) and names the signals used, so the core function is unambiguous. It does not differentiate itself from the sibling plan_set, 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?
There is no guidance on when to use this versus plan_set, nor any indication of prerequisites or ordering (e.g., when to supply a pool vs library_path). The agent must infer invocation context entirely from the schema.
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.
2 tool updates
v0.2.0- First observed
plan_set - First observed
suggest_next
TDQS
Scored across 2 tools
The two tools have clearly distinct purposes: plan_set handles timing and runtime of an ordered set, while suggest_next ranks next-track recommendations. There is no meaningful overlap that would confuse tool selection.
Both names use snake_case and begin with an imperative verb, making them predictable. The second word differs slightly in type (noun 'set' vs. adjective/adverb 'next'), but the pattern is still clear.
Two tools feels thin for a server named Set Planner, which likely implies broader set-building and management functionality. The tools themselves are focused, but the surface is borderline under-scoped.
The set covers core timing and next-track suggestion but lacks set CRUD, save/export, track metadata lookup, and energy-curve editing. These are notable gaps for a full set-planning workflow.
Maintenance
Related MCP Connectors
Audio features + harmonic set-building for tracks by name/ISRC. Spotify audio-features replacement.
Identify the tracklist of any DJ mix from its YouTube, SoundCloud or Mixcloud URL.
Builds narrated, playable music stories, explores sample lineage, and saves verified playlists.
Privacy-first audio intelligence: BPM, key, waveform. Audio never stored. Pay per second.
Related MCP Servers
- AlicenseCqualityCmaintenanceSyncs YouTube Music liked songs, analyzes them for DJ metadata like BPM and key, and enables creating playlists from previews.10MIT
- AlicenseAqualityBmaintenanceEnables building mood-based playlists for Navidrome by joining your library, listen history, and personal playlist labels from Navidrome, ListenBrainz, and Last.fm.1549 npmAGPL 3.0
- AlicenseAqualityBmaintenanceEnables AI assistants to control Spotify playback, manage playlists, and plan DJ sets using BPM, key, and energy data.37MIT
- FlicenseNot gradedqualityBmaintenanceEnables an MCP host to scan and catalog a local drum and bass library, search and analyze tracks, plan and validate ordered set lists, and render gapless DJ-style WAV mixes with beat-aligned crossfades and bass swaps.1-