bandlab-mcp
Allows reading and editing your own BandLab songs by prompt, performing mix operations like track volume/pan, effects, regions, automation, and project settings.
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., "@bandlab-mcpLower the drums by 2 dB and pan the hi-hats to the right"
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.
bandlab-mcp
An MCP server that lets a model read and edit your own BandLab songs by prompt.
"Vokali 2 dB kıs, davulu biraz sola al, reverb'ü bypass et" → concrete mix operations → a new BandLab revision.
Read this first: there is no official BandLab API
BandLab publishes no public API, no developer program, and no OpenAPI spec. Everything here targets
the private JSON API that bandlab.com's own web app uses (https://www.bandlab.com/api/v1.3). That has
two consequences you should decide about before using this:
It can break without notice. Endpoints, field names and value ranges are undocumented and unversioned in practice. This server is written so that unknown fields survive a round-trip, but a breaking change on BandLab's side is a matter of when, not if.
It conflicts with BandLab's Terms of Use. §4.2.7 prohibits using "automated means, bots, … automated scripts, or the like" to "register Accounts, log in, add followers …, follow or unfollow other Users, send messages, post comments, or otherwise to act on your behalf", and to send "more requests … than a human can reasonably produce in the same period of time". Automating your own account on your own songs still falls under "act on your behalf". The realistic risk is account suspension. That is your call to make, not this README's.
This server is built to sit as close to the defensible side of that line as it can:
No social automation. There is no follow, unfollow, comment, message, or like tool. Those are the behaviours the Terms name explicitly, and none of them are needed to edit a mix.
Human-pace requests. Every call is serialized and spaced by
BANDLAB_MIN_INTERVAL_MS(default 1200 ms). There are no bursts and no parallel fan-out.Writes are off by default.
BANDLAB_ALLOW_WRITESmust be explicitlytrue, and even then every edit is a dry run unless the caller passesdryRun: false.Edits are non-destructive. BandLab is version-based: saving creates a new revision and the parent is preserved. Nothing this server does overwrites existing audio.
How a save becomes audible
BandLab renders mixdowns server-side. The web app watches a revision for
mixdown.status !== 'Ready' and waits to be told the render finished.
That makes one field decisive: a new revision must not carry its parent's mixdown. Copy a
finished one over and the server concludes the audio is already current, never queues a render, and
the edit stays inaudible to anyone streaming the post — the project changes, the sound does not.
prepareNewRevision() therefore drops mixdown along with the other server-owned fields.
Verified end to end on a real song: POST returned a fresh mixdown id with status: "Empty", which
went Ready about 18 seconds later, and measuring the new file against the old one showed the EQ
curve exactly as requested — 120/200 Hz down 1.7 dB relative to 800 Hz, 1.6–6.4 kHz up 0.7–1.1 dB.
Related MCP server: MusicMCP.AI MCP Server
How it works
BandLab stores a song as a chain of revisions. A revision is the full project tree:
revision
├── volume (master), key, description, saveType
├── metronome { bpm, signature }
├── mastering { preset }
├── auxChannels[] { id, preset, returnLevel, effects[] }
└── tracks[]
├── name, type, volume, pan, fxMix, isMuted, isSolo, colorName
├── effects[] { slug, bypass, params, automation }
├── effectsData { displayName, originalPresetId } // preset metadata, not the chain
├── auxSends[] { id, sendLevel }
├── automation { volume[], pan[] }
└── regions[] { startPosition, endPosition, gain, fadeIn, fadeOut,
pitchShift, playbackRate, sampleId }The edit loop is:
bandlab_get_mixfetches a revision and renders it as compact text, so the model reasons over levels and effects rather than a huge JSON blob.The model turns the prompt into typed operations (
set_track_volume,add_effect,move_region, …).bandlab_edit_mixapplies them purely — the fetched revision is cloned, never mutated — and returns a before/after diff.Only on a second call with
dryRun: falseis a new revision POSTed.
Setup
npm install
npm run buildCredentials
Three modes. The first two reuse a session you created by logging in yourself, which keeps the server out of §4.2.7's "automated login".
Mode A — refresh token (recommended, self-renewing).
Log in to bandlab.com in your browser.
DevTools → Application → Cookies →
https://www.bandlab.com→ copy therefreshTokenvalue.Put it in
BANDLAB_REFRESH_TOKEN.
The server exchanges it at BandLab's identity server
(https://accounts.bandlab.com/oauth/connect/token, public client bandlab_web) for a 24-hour access
token, caches it in ~/.bandlab-mcp/session.json (mode 0600), and renews it automatically. You paste
this once.
Note that the v1.3 POST /authorizations route rejects these tokens — they are OAuth refresh
tokens and only the identity server accepts them. The server tries OAuth first and falls back to the
legacy route, so either kind of token works.
Mode B — session bearer token (quick, expires in 24 h).
DevTools → Network → any api/v1.3 request → Request Headers → copy the whole
Authorization: Bearer eyJ… value into BANDLAB_SESSION_KEY (the Bearer prefix is stripped for
you). There is nothing to renew it with, so when it expires the server tells you to paste a fresh one.
Mode C — email and password. The server calls POST /authorizations itself. The password is never
written to disk, but programmatic login is precisely what §4.2.7 names, so prefer A or B.
cp .env.example .env # then fill in whichever mode you choseVerify against your real account
npm run verify:liveRead-only. It checks every assumption this codebase makes — the shape of tracks[], the real ranges of
volume and pan, which effect slugs your projects use — and prints which ones do not hold.
Register with Claude Code
claude mcp add bandlab --scope user -- node /absolute/path/to/bandlab-mcp/dist/index.jsNo --env flags are needed: the server loads .env from its own package directory, resolved against
the module rather than the working directory, because an MCP client spawns it from wherever it likes.
Variables already present in the environment take precedence, so claude mcp add --env KEY=value still
overrides the file when you want it to.
--scope user makes it available in every project. Use --scope project instead to commit a
.mcp.json for a team — but then keep credentials in the environment, not in that file.
Verify with claude mcp list; the entry should report ✔ Connected. Newly added servers are picked up
when Claude Code next starts, so restart it before expecting the bandlab_* tools to appear.
Tools
Tool | Purpose |
| Confirm the session and get your user id |
| Your songs |
| A song's revision history (its undo stack) |
| Render one revision: tracks, levels, pan, effects, regions |
| Apply mix operations — dry run by default |
| The harvested effect catalogue: slugs, parameters, observed ranges |
| API base, write state, pacing, inferred value ranges |
| Escape hatch for endpoints not yet wrapped |
Audio upload is not a tool yet but is solved and scripted:
node scripts/upload-audio.mjs song.wav returns a sample id you can build a song around. The protocol
and the v2.0 auth quirk behind it are written up in docs/effects-reference.md.
Mix operations
Group | Operations |
Levels |
|
Routing |
|
Effects |
|
Arrangement |
|
Project |
|
Automation |
|
Tracks are addressable by id, by name (case-insensitive, partial allowed), or by 1-based number. An ambiguous name is refused with the list of matches rather than guessed at.
Effect slugs
BandLab assembles its effect list inside a WASM audio engine at runtime, so there is no endpoint to
ask and the UI names do not map onto slugs (pedalThreeBandEq2 is threeBandEq,
pedalMultibandCompressor is multibandComp2). scripts/harvest-effects.mjs therefore reads real
published projects and the community preset library and records only what it actually saw:
node --env-file-if-exists=.env scripts/harvest-effects.mjs 50That writes docs/effects-catalogue.json, which bandlab_list_effects
serves and bandlab_edit_mix validates against — an unlisted slug is refused rather than written,
because BandLab accepts any JSON and a bad slug lands in the project silently instead of erroring.
Pass allowUnverifiedEffects: true to override.
What is verified, and what is not
Verified live against www.bandlab.com/api/v1.3 with a real authenticated session:
the API version is reachable and current (
/genresreturns real data; v1.5/v1.7/v1.9 are 404)POST /authorizationsacceptsprovider: "Password"andprovider: "Token"(refresh)auth is OpenID Connect from
https://accounts.bandlab.com/oauth— session JWTs last 24 hpublic reads work unauthenticated;
/revisions/{id}and/search/*require a bearer tokentracks[]is a real DAW tree:volume,pan,isMuted,isSolo,name,effects[],regions[],auxSends[],automation. The community spec types it asAudioSample[]; that is wrong.effects[]is the signal chain;effectsDatais only preset provenance (see docs/effects-reference.md)real effect slugs and param schemas:
compressor,expGate,deEsser,threeBandEq,bossGE7,simpleStudioReverb,reverbHybridcanEditcorrectly reportsfalseon revisions you do not own, and the server refuses those writes
Two corrections the live data forced:
auxSends[].sendLevelis lowercase. The spec saysSendLevel; writing that adds a dead field.Live revisions carry
volume(master),saveType,trackGroups,samplerKits,fxMix, and regiongain/fadeIn/fadeOut— none of which appear in the spec. All are modelled now.
POST /revisions is verified. A full round-trip was run against a real owned song: fetch revision
→ mute a track, −2 dB on another, aux send 0.25, add a compressor → POST → read back. Every change
persisted, isPublic: false was honoured, and the parent revision was left untouched. The payload that
prepareNewRevision() builds — the whole revision minus id, postId, createdOn, modifiedOn,
counters and stamp, with parentId pointing at the parent — is accepted as-is.
Still unverified:
the top of the
volumerange:1.995was observed, consistent with a0..2scale, but unconfirmed.audio upload: no sample-upload endpoint appears among the 123 known endpoints, so adding new audio is out of scope until that path is found. Editing existing audio is unaffected.
bandlab_capabilities reports the inferred ranges at runtime so they can be checked rather than trusted.
Development
npm run typecheck
npm test # 24 unit tests over the pure edit engine
npm run verify # build + testThe edit engine (src/mix.ts) is pure and has no network dependency, which is why it is the part under
test. The HTTP and auth layers are thin by design.
License
MIT.
Available Tools
8 toolsbandlab_capabilitiesServer capabilities and limitsARead-only
Reports the API base, whether writes are enabled, the request pacing, and the inferred value ranges the edit engine enforces. Useful for diagnosing a refusal.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already establishes this as a read operation. The description adds substantive context by enumerating what it reports (API base, write-enablement, pacing, value ranges), which explains the tool's overall behavior beyond the bare annotation. No contradiction detected.
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, no filler. The primary purpose is front-loaded ('Reports...') and the secondary usage hint is appended concisely. Every word 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 no-parameter introspection tool, the description is complete enough: it lists all reported aspects and a hint for a common use case. The lack of an output schema is not a significant gap since it's a capabilities report, but the exact format is unspecified, which is acceptable at this complexity.
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 has zero parameters, so the baseline is 4 per the rubric. The description correctly avoids any parameter explanation since none exist, and the schema (empty properties) already covers everything. No further semantics are needed.
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 ('Reports') and the exact content (API base, writes enabled, pacing, value ranges). It clearly distinguishes this tool from siblings like 'bandlab_whoami' (identity) and 'bandlab_list_songs' (queries) by focusing on server capabilities and limits.
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?
Explicitly suggests a use case ('useful for diagnosing a refusal'), giving clear context for when to invoke it. It doesn't explicitly mention alternatives or when not to use it, but the purpose is well-scoped among siblings, so we credit the actionable hint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bandlab_edit_mixEdit a mixA
Applies mix operations to a revision. Defaults to a dry run that shows the diff without sending anything. With dryRun=false it saves a NEW revision (the original is never overwritten — BandLab keeps every version).
| Name | Required | Description | Default |
|---|---|---|---|
| ops | Yes | Operations applied in order | |
| dryRun | No | true previews the change; false saves a new revision | |
| isPublic | No | Visibility of the new revision. Omitted, it inherits the parent — so editing a public song produces another public revision. Pass false to keep the edit unlisted. | |
| revisionId | Yes | Revision to edit, from bandlab_list_revisions | |
| description | No | Description to attach to the new revision | |
| allowUnverifiedEffects | No | Effect slugs are checked against the harvested catalogue and unknown ones are refused, because a slug BandLab does not recognise is written into the project silently. Set true only for a slug you have confirmed elsewhere. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say idempotentHint=false and destructiveHint=false; the description adds crucial behavior: dry runs show a diff without sending anything, and commits create a new revision rather than overwriting the original. This explains the non-idempotent, non-destructive nature far better than the hints alone and sets correct expectations for repeated calls.
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, front-loaded with the main action, then the two behavior-critical facts: dry run default and new-revision commit. No filler and no duplication of the schema.
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 complex 6-parameter tool with many op variants, the combination of description and fully-described schema is largely complete: the agent knows what action is taken, the safety model, and where parameters are described. The only real gap is that there is no output schema and the return/diff payload is only alluded to as 'shows the diff,' leaving result shape unspecified.
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 schema itself documents every parameter, including dryRun, isPublic, revisionId, description, allowUnverifiedEffects, and the ops enum with rich descriptions like the volume automation envelope. The description does not attempt to repeat this, so it correctly leaves the schema to carry the load; no additional meaning is added beyond the dryRun/new-revision behavior.
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 opens with a clear verb and resource: 'Applies mix operations to a revision,' which tells the agent this is the mutation counterpart to read-only siblings like bandlab_get_mix and bandlab_list_revisions. It does not explicitly name an alternative or contrast itself, so it misses the top tier, 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?
The description gives operational context—dry run by default, dryRun=false to commit—and the revision-creation behavior, which tells the agent the safe way to preview changes. It never states when to choose this over bandlab_raw_request or bandlab_get_mix, nor gives exclusions, so usage guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bandlab_get_mixRead a mixARead-only
Fetches one revision and renders its tracks, levels, panning, effects and regions as compact text. This is what you read before proposing an edit.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | Also return the full JSON (large) | |
| revisionId | Yes | Revision id from bandlab_list_revisions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the operation readOnlyHint=true, so no safety disclosure is needed. The description adds useful behavioral context beyond that: it fetches a single revision and renders a compact text representation rather than raw JSON, which helps the agent anticipate output size and format.
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 with no filler: the first states what the tool does and the output form, the second states when to use it. Everything 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 read-only tool with a fully documented schema, the description provides the essential context: it fetches one revision, what data is rendered, and the intended workflow position. Without an output schema, the concise mention of 'compact text' plus the listed musical elements is sufficient guidance.
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 the schema already documents revisionId and raw fully. The description adds no new parameter-level meaning beyond restating output fields, matching the baseline for a fully covered 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?
The description uses a specific verb ('Fetches') and resource ('one revision') and enumerates the rendered elements: tracks, levels, panning, effects, and regions. It also distinguishes itself from siblings like bandlab_list_revisions and bandlab_edit_mix by scoping to a single revision for read-before-edit purposes.
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?
'This is what you read before proposing an edit' gives clear situational context and implies the tool should precede bandlab_edit_mix. It does not enumerate exclusions or alternatives by name, but the intended workflow is evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bandlab_list_effectsEffect catalogueARead-only
Lists BandLab effect slugs and their parameters, harvested from real published projects. Consult this before add_effect or set_effect_params: BandLab has no effects endpoint, slugs are undocumented, and a slug that is not listed here is one this server cannot vouch for.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Filter by slug or parameter name, e.g. "reverb", "amp", "drive" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses meaningful behavioral context: the data source is harvested projects, there is no authoritative endpoint, and the server makes no guarantees for unlisted slugs. This warns the agent about a real reliability limitation, which is valuable beyond the annotation's safety hint.
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 tight sentences: the first states what the tool does, and the second carries the usage directive and caveat. No filler, no repetition of schema or annotation 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 simple filtered-list tool, this is complete: it names the output domain (slugs and parameters), gives usage timing, and flags the reliability caveat. It doesn't detail the exact return shape or pagination, but the tool is simple enough that this is a minor gap rather than a blocker.
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 already fully documents the single optional query parameter with examples ('reverb', 'amp', 'drive'). The description adds no additional parameter-level detail, but the schema coverage is 100%, so the baseline 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 opens with a specific verb and resource: 'Lists BandLab effect slugs and their parameters'. It also gives the data's provenance ('harvested from real published projects'), which clearly distinguishes this catalogue tool from the sibling tools that deal with songs, revisions, mixes, and capabilities.
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 explicitly instructs the agent to consult this tool 'before add_effect or set_effect_params' and explains why: BandLab has no effects endpoint, slugs are undocumented, and unlisted slugs cannot be vouched for. This is direct, actionable routing guidance rather than vague context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bandlab_list_revisionsList revisions of a songARead-only
Lists the revision history of a song, oldest first (verified against the live API). BandLab is version-based: every save is a revision, so this is the undo history.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| songId | Yes | Song id from bandlab_list_songs |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds value beyond that by specifying ordering, verifying behavior against the live API, and clarifying that every save creates a revision. It does not describe pagination or return shape, but for a simple read tool this is adequate.
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 compact sentences with no fluff. The key scoping detail ('revision history', 'oldest first') is front-loaded, and the contextual note about BandLab's version model is placed after the main statement.
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 list tool, the description covers the essential semantics: what it lists, ordering, and why the revision history exists. A minor gap is the absence of output-format details, but no output schema exists and the title/description imply a revision list.
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 only 50%: songId is documented in the schema, but limit has no description beyond name/constraints. The tool description adds no parameter-level meaning, so it does not compensate for the undocumented limit parameter.
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 ('Lists') and a precise resource ('revision history of a song'), and adds a behavioral detail ('oldest first'). It is immediately distinguishable from siblings like bandlab_list_songs and bandlab_get_mix.
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 clearly frames when this tool is relevant by explaining that BandLab saves are revisions and calling this the 'undo history.' It does not explicitly name sibling alternatives, but the use case is evident and no conflicting alternative exists among the siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bandlab_list_songsList my songsARead-only
Lists songs belonging to the authenticated user. Use the returned song id with bandlab_list_revisions.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many songs to return |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, and the description aligns with that by using 'Lists' (a read operation). Beyond annotations, it adds that only songs belonging to the authenticated user are returned and that the response includes song ids, which helps the agent understand scope and return value usage without contradicting the read-only hint.
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 two sentences with no filler. The first sentence states the core purpose and scope, and the second provides a valuable workflow tip. Every word 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?
Given the tool's simplicity (one optional parameter, read-only, no output schema), the description covers the essential context: what it lists, for whom, and how to use the result. It could mention pagination or response format more explicitly, but the lack of an output schema makes the mention of song ids sufficient for correct invocation.
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 schema has 100% description coverage for the single 'limit' parameter, including default, min, max, and meaning. The description does not add any parameter-specific information, so it earns the baseline score of 3.
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 the specific verb 'Lists' with the resource 'songs belonging to the authenticated user', which precisely defines the tool's purpose. It also distinguishes itself from sibling tools by mentioning the follow-up use with bandlab_list_revisions, making it clear this is the song-listing entry point.
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 clearly states what the tool does and provides a workflow hint ('Use the returned song id with bandlab_list_revisions'), giving context for when to use it. It does not explicitly name alternatives or exclusions, but the main use case is clear and uniquely scoped to the authenticated user's songs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bandlab_raw_requestRaw API requestA
Escape hatch for endpoints this server does not wrap yet. The BandLab API is undocumented, so this is how you explore it. GET always allowed; other methods require writes to be enabled.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | ||
| path | Yes | Path after the API base, e.g. /users/me/songs | |
| query | No | ||
| method | No | GET |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the disclosure burden. It does disclose the write-permission gate and the undocumented nature of the API, which is useful. However, it does not describe response shape, error behavior, or side effects beyond method restrictions.
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, each earning its place. The core purpose is front-loaded and the write restriction is stated clearly. 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?
The description gives enough to start calling the tool and explains the key access constraint dropped by the schema. But since there is no output schema and no annotations, it should ideally warn that response formats are unknown or that arbitrary requests may behave unpredictably.
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 only 25%, so the description must compensate for the undocumented body and query parameters, but it does not explain them. It adds one useful parameter-specific constraint—GET vs. write methods—but leaves most parameter semantics to inference.
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 identifies this as an escape hatch for endpoints the server does not wrap, which distinguishes it from the dedicated sibling tools. It could be more explicit that it makes an arbitrary BandLab HTTP request, but 'this is how you explore it' conveys the main purpose well.
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 says the tool is for endpoints not yet wrapped, which implies using sibling tools for wrapped endpoints. It also gives a concrete condition: GET is always allowed, while other methods require writes to be enabled. This is practical guidance, though it does not explicitly name alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bandlab_whoamiWho am I on BandLabARead-only
Returns the authenticated BandLab profile (id, username, counters). Call this first to confirm the session works and to get the user id other tools need.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already covers the safety profile, and the description adds useful behavior beyond it: the tool verifies the session and returns authenticated profile data. It does not describe error behavior for an invalid session, but 'confirm the session works' strongly implies the outcome.
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 with no wasted words. The core return value is front-loaded, and the usage guidance is placed right after it. Every sentence 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 zero-parameter session-check tool with a readOnly annotation, the description is complete: it names the resource, the returned fields, the recommended call order, and the purpose. No output schema exists, but the description sufficiently covers the expected return values.
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 has zero parameters and 100% schema coverage, so there is no parameter burden for the description to carry. Baseline 4 is appropriate because no parameter semantics are needed.
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 ('Returns') with a clear resource ('authenticated BandLab profile') and names the returned fields (id, username, counters). It also tells the agent why this tool matters (getting the user id other tools need), which cleanly distinguishes it from the sibling tools like bandlab_list_songs or bandlab_capabilities.
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 explicitly says to call this tool first to confirm the session works and to obtain the user id needed by other tools. This gives clear contextual guidance, though it does not spell out when not to use it or name any alternative tool.
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.
8 tool updates
v0.2.0- First observed
bandlab_capabilities - First observed
bandlab_edit_mix - First observed
bandlab_get_mix - First observed
bandlab_list_effects - First observed
bandlab_list_revisions - First observed
bandlab_list_songs - First observed
bandlab_raw_request - First observed
bandlab_whoami
TDQS
Scored across 8 tools
Each tool targets a distinct concern: identity, song listing, revision history, mix reading, mix editing, effect metadata, API capabilities, and raw fallback. The only potential overlap is raw_request, but it is explicitly framed as an escape hatch rather than a competing operation.
Most tools follow a consistent bandlab_<verb>_<noun> pattern (list_songs, list_revisions, edit_mix, get_mix, list_effects). A few names deviate (whoami, capabilities, raw_request), but the shared prefix and clear verb/noun semantics keep the set predictable.
Eight tools is a well-scoped size for a BandLab-focused MCP server. Each tool supports a recognizable workflow from authentication to revision exploration to mix editing, without redundancy or bloat.
The core workflow is covered: identify user, list songs, inspect revisions, read a mix, edit a mix, and look up effect parameters. The main gaps are broader BandLab operations like song creation/deletion or download, but the raw_request escape hatch mitigates those and the server appears intentionally scoped to mix editing.
Maintenance
Related MCP Connectors
- mozonicOAuthcom.mozonic
AI mixing and mastering: analyze your mixes, run DSP autofix, render stems, and master tracks.
- VocunoOAuthcom.vocuno
AI music studio: song generation with vocals, covers, stems, voice conversion, mastering, editing.
AI music production assistant — audio profiling, AI mixing sessions, and service inquiries.
Write lyrics in 100+ styles, score them, generate full songs with 4 engines, split stems. OAuth.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceIntegrates AI-powered music generation with professional production tools, enabling autonomous music creation workflows from MIDI input to live streaming.5MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI-powered music generation through natural language commands, supporting inspiration and custom modes with dual song outputs.1MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to control Ableton Live with full access to Live's object model, including clip creation, device control, automation, and audio signal capture for mixing and mastering tasks.1MIT
- AlicenseBqualityAmaintenanceEnables AI agents to control a browser-based digital audio workstation (openDAW) for music production, including track creation, effects, MIDI, automation, and rendering.100Apache 2.0