Skip to main content
Glama

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:

  1. 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.

  2. 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_WRITES must be explicitly true, and even then every edit is a dry run unless the caller passes dryRun: 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:

  1. bandlab_get_mix fetches a revision and renders it as compact text, so the model reasons over levels and effects rather than a huge JSON blob.

  2. The model turns the prompt into typed operations (set_track_volume, add_effect, move_region, …).

  3. bandlab_edit_mix applies them purely — the fetched revision is cloned, never mutated — and returns a before/after diff.

  4. Only on a second call with dryRun: false is a new revision POSTed.


Setup

npm install
npm run build

Credentials

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).

  1. Log in to bandlab.com in your browser.

  2. DevTools → Application → Cookies → https://www.bandlab.com → copy the refreshToken value.

  3. 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 chose

Verify against your real account

npm run verify:live

Read-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.js

No --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

bandlab_whoami

Confirm the session and get your user id

bandlab_list_songs

Your songs

bandlab_list_revisions

A song's revision history (its undo stack)

bandlab_get_mix

Render one revision: tracks, levels, pan, effects, regions

bandlab_edit_mix

Apply mix operations — dry run by default

bandlab_list_effects

The harvested effect catalogue: slugs, parameters, observed ranges

bandlab_capabilities

API base, write state, pacing, inferred value ranges

bandlab_raw_request

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

set_track_volume, adjust_track_volume_db, set_track_pan, set_master_volume

Routing

set_track_mute, set_track_solo, set_aux_send, set_track_fx_mix

Effects

add_effect, remove_effect, set_effect_bypass, set_effect_params

Arrangement

move_region, remove_region, set_region_pitch, set_region_playback_rate, set_region_gain, set_region_fade

Project

set_bpm, set_key, set_mastering_preset, set_description, set_track_color

Automation

automate_volume (points given in seconds, converted to beats)

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 50

That 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 (/genres returns real data; v1.5/v1.7/v1.9 are 404)

  • POST /authorizations accepts provider: "Password" and provider: "Token" (refresh)

  • auth is OpenID Connect from https://accounts.bandlab.com/oauth — session JWTs last 24 h

  • public reads work unauthenticated; /revisions/{id} and /search/* require a bearer token

  • tracks[] is a real DAW tree: volume, pan, isMuted, isSolo, name, effects[], regions[], auxSends[], automation. The community spec types it as AudioSample[]; that is wrong.

  • effects[] is the signal chain; effectsData is only preset provenance (see docs/effects-reference.md)

  • real effect slugs and param schemas: compressor, expGate, deEsser, threeBandEq, bossGE7, simpleStudioReverb, reverbHybrid

  • canEdit correctly reports false on revisions you do not own, and the server refuses those writes

Two corrections the live data forced:

  • auxSends[].sendLevel is lowercase. The spec says SendLevel; writing that adds a dead field.

  • Live revisions carry volume (master), saveType, trackGroups, samplerKits, fxMix, and region gain/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 volume range: 1.995 was observed, consistent with a 0..2 scale, 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 + test

The 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 tools
bandlab_capabilitiesServer capabilities and limitsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
opsYesOperations applied in order
dryRunNotrue previews the change; false saves a new revision
isPublicNoVisibility 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.
revisionIdYesRevision to edit, from bandlab_list_revisions
descriptionNoDescription to attach to the new revision
allowUnverifiedEffectsNoEffect 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

A4/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 mixA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
rawNoAlso return the full JSON (large)
revisionIdYesRevision id from bandlab_list_revisions

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 catalogueA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoFilter by slug or parameter name, e.g. "reverb", "amp", "drive"

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 songA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
songIdYesSong id from bandlab_list_songs

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 songsA
Read-only

Lists songs belonging to the authenticated user. Use the returned song id with bandlab_list_revisions.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many songs to return

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNo
pathYesPath after the API base, e.g. /users/me/songs
queryNo
methodNoGET

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 BandLabA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 8 tool updatesv0.2.0
    • First observedbandlab_capabilities
    • First observedbandlab_edit_mix
    • First observedbandlab_get_mix
    • First observedbandlab_list_effects
    • First observedbandlab_list_revisions
    • First observedbandlab_list_songs
    • First observedbandlab_raw_request
    • First observedbandlab_whoami

TDQS

A4.1/5.0

Scored across 8 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers