Copy for your agent
Copy the block below into your assistant's context. It starts with reads and separates library edits from proposals. For full schemas and errors, use the API reference.
Tape hub context — checked against Desktop 1.0.9, 27 October 2026
Installed desktop default: http://localhost:38472. Development and server
builds may use another address/port; confirm the target before sending requests.
Check GET /api/ping and GET /api/info first. If databaseHealth.status is not
healthy, stop library mutations and ask the owner to restore a backup.
Never automatically rebuild or delete a database.
Auth: loopback has local trust. Protected LAN calls still need a paired bearer,
an allowed browser session or the configured API token. Off-site playback has
an additional license gate. Pair from Connections → New connection, exchange
the current code at POST /api/auth/pair, then use Authorization: Bearer <token>.
Refresh through POST /api/auth/refresh. Preserve pairing during transport outages.
Read routes:
GET /api/capabilities — check enabled/licensed modules before using them
GET /api/library/stats
GET /api/library/filters
GET /api/tracks?limit=50&offset=0
GET /api/tracks/:id
GET /api/tracks/:id/metadata
GET /api/browse — source roots; add ?path=<URL-encoded folder> to browse beneath one
GET /api/albums; GET /api/album/:id; GET /api/album/:id/tracks
GET /api/artists; GET /api/artists/:id; GET /api/artists/:id/tracks
GET /api/artists/:id/albums
GET /api/labels; GET /api/labels/:id
GET /api/playlists; GET /api/playlists/:id; GET /api/playlists/:id/tracks
GET /api/search?q=...&type=tracks&limit=50
GET /api/playback/session
GET /api/analytics/play-history?days=7&limit=100
GET /api/ai/context
SSE: GET /api/library/events and GET /api/scan/progress
Writes take effect immediately unless explicitly described as proposals.
Only perform the change the user requested:
POST /api/tracks/:id/notes with {"body":"..."}; optionally positionSeconds.
POST /api/playlists/:id/tracks/:trackId/notes uses the same body.
PUT /api/tracks/:id/metadata/curated replaces genres/tags/styles in the DB;
send the complete arrays to retain, not just newly added values.
PUT /api/tracks/:id/metadata/main requires title; send the intended artist,
album, albumArtist and year. writeToFile:true also attempts a file write.
POST /api/tracks/:id/tags/write-to-file changes embedded file tags.
Inbox remove/mark-heard/mark-to-listen use {"ids":[...]}. Keep the returned
undo object; POST it unchanged to /api/library/inbox/undo if requested.
Enrichment: GET /api/tracks/:id/enrichment/search?provider=musicbrainz returns
verified candidates. POST /api/tracks/:id/enrichment/proposals with provider
and candidateId. Review the returned proposal.fields; applying requires
selectedFields and expectedTrackVersion at
POST /api/tracks/:id/enrichment/proposals/:proposalId/apply.
Creating a proposal does not apply it. Never fabricate provider candidates.
No general file move/rename API, vector similarity API or MCP server is offered.
Saving a track is not downloading audio for offline listening. Plugins have
their own permissioned API; a hub bearer does not grant plugin privileges.
Errors: 401 auth; 403 access/license; 404 missing resource; 409 module disabled,
pairing closed or version conflict (read the body); 410 retired API;
422 invalid candidate; 503 database or provider unavailable.
Full contracts: https://docs.tapemusicsuite.com/api-reference
Integration: https://docs.tapemusicsuite.com/agents/integration