engine-dj-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| --allow-writes | No | Pass --allow-writes to enable write tools. This is a command-line flag, not an environment variable. Without it, the server runs read-only. | false |
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 | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| search_tracksA | Search the Engine DJ library by text, tempo, key, rating, play history and analysis flags. Set include_total for a count alongside the page: it is capped at 1000, and a capped result comes back as total: 1000 with total_capped: true -- treat that as 'at least 1000', never as an exact count. flags.has_cues means a hot cue is actually set (the blob is decoded when the index is built), not merely that Engine analysed the track; flags.has_beatgrid means a beatData blob is present. playlist: {id} or {name} narrows the search to one playlist -- results still come back by relevance or id, not in playlist order; use get_playlist_tracks for that. With more than one library connected, pass |
| get_tracksA | Fetch full metadata for specific track ids, in the order requested. With more than one library connected, pass |
| get_playlistsA | The library's playlist tree, in the order Engine DJ displays it -- taken from the Playlist.nextListId chain, which is where that order actually lives (the PlaylistPath view's |
| get_playlist_tracksA | The tracks of one playlist, in playlist order -- from the PlaylistEntity.nextEntityId chain, not from row ids, so a track dragged up the list comes back where the DJ put it. Name the playlist with playlist_id, or with playlist_name (exactly one of the two). A name that matches several playlists is refused with every candidate's id and full path rather than picked between -- names are unique only within a folder, so pass the full |
| get_track_performanceA | Decode PerformanceData for one track: hot cues, the main cue, saved loops, the beatgrid and a coarse waveform profile. Each field carries its own decode status and its own layout marker. layout: "verified" (every field) means the binary layout was confirmed against a real Engine DJ library -- cue positions land inside the track, the beatgrid's implied tempo matches the analysed BPM, the waveform's declared point spacing multiplies back out to the track's sample count, and a saved loop spans a whole number of beats at that same analysed BPM -- so status: "ok" is a claim about the values, not just about the parse. layout: "unverified" would mean only that the bytes parsed; no field returns it today. Positions are sample offsets; sample_rate at the top level converts them to seconds, and cue/loop items carry the seconds already. Only hot-cue and loop slots that hold something are listed -- slots is how many the track has in total, so items: [] with slots: 8 means an analysed track with no cues set. Items are capped at 64; total gives the full count and truncated says whether the cap was hit. With more than one library connected, pass |
| audit_libraryA | Run collection health checks. Available: missing_files, unavailable, unanalyzed, no_cues, no_beatgrid, missing_key, suspicious_bpm, duplicates, empty_metadata, orphan_entries, path_form_mismatch. missing_files resolves each track against the selected library's own folder. path_form_mismatch finds files that are there, but under a name in a different Unicode normalization form from the stored path -- macOS opens them anyway, Linux does not (measured on its exFAT driver), and Engine OS on a player is Linux, so these may fail to load on hardware while missing_files on a Mac reports nothing. no_cues means "no hot cue is set" -- the quickCues blob is decoded for this, since Engine writes one to every analysed track whether or not a pad is used -- while no_beatgrid means the beatData blob is absent or empty. With more than one library connected, pass |
| run_sqlA | Escape hatch for questions the other tools do not cover. Read-only is enforced by the kernel, not by this check alone. Use side.track_derived.camelot and side.track_derived.tempo in WHERE clauses rather than the camelot()/tempo() SQL functions, which run per row and defeat indexes. With more than one library connected, pass |
| list_librariesA | List every discovered library, including ones whose schema is unsupported. Re-scans on every call, so a drive plugged in after this server started is visible without a restart (the engine://libraries resource is a start-time snapshot). A library seen before but not readable right now (e.g. Engine DJ is writing to it) stays listed with status: "unreadable" and error set, instead of disappearing. Pass a listed uuid or path as the |
| refresh_indexA | Rebuild the search index if the library has changed. With more than one library connected, pass |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| schema | |
| libraries |
TDQS
Scored across 9 tools
Each tool targets a distinct resource and action: index refresh, playlist tracks, search, track metadata, playlist tree, performance data, health audit, SQL escape hatch, and library listing. No two tools overlap in purpose, and descriptions make boundaries clear.
All tools follow a consistent snake_case verb_noun pattern: refresh_index, get_playlist_tracks, search_tracks, get_tracks, get_playlists, get_track_performance, audit_library, run_sql, list_libraries. Verbs are clear and uniform in style.
With 9 tools, the server is well-scoped for a DJ library management domain. It covers discovery, search, retrieval, playlist inspection, performance analysis, health auditing, index maintenance, and a SQL fallback—each tool earns its place without bloat.
The tool surface is complete for a read/analysis-oriented server: library listing, search, track and playlist retrieval, performance data decoding, health audits, index refresh, and an escape hatch (run_sql) for uncovered questions. No obvious operations are missing given the server's stated purpose.