ONCE
ONCE is music distribution built for agents.
Community: Submitted by a user or imported; check the owner before granting accessOnlineNo sign-inGlobalFreeRead-only
What it can do
- Create Account: Create a new ONCE account for an allowlisted partner MCP client and return a PKCE-bound OAuth authorization code. Unauthenticated; allowlisted partners only.
- Password Authorize: Authorize an existing ONCE account for an allowlisted partner MCP client and return a PKCE-bound OAuth authorization code. Unauthenticated; allowlisted partners only.
- Get Metadata Rules: REQUIRED ON CONNECT: Return the metadata rules hitlist (markdown) agents must read after authentication and apply when guiding the user. Same content as mcp://docs/metadata-rules-h
What data it sees
Do you need an account
No: the server works without sign-in
ONCE is music distribution built for agents. Connect the MCP server, sign in with a ONCE account, and an agent can upload audio and cover art, generate artwork, run AI and rights checks, submit releases to every major store, manage store selection and takedowns, buy credits, and report streaming performance. OAuth sign-in, no API key to paste. 1 credit per human song, 2 per AI-detected song.
Server tool list (33)
Raw names from tools/list. Only developers need these.
| create_account | Create a new ONCE account for an allowlisted partner MCP client and return a PKCE-bound OAuth authorization code. Unauthenticated; allowlisted partners only. |
| password_authorize | Authorize an existing ONCE account for an allowlisted partner MCP client and return a PKCE-bound OAuth authorization code. Unauthenticated; allowlisted partners only. |
| get_metadata_rules | REQUIRED ON CONNECT: Return the metadata rules hitlist (markdown) agents must read after authentication and apply when guiding the user. Same content as mcp://docs/metadata-rules-hitlist. |
| get_release_schema | Return required MCP fields for release submission, expanded new-client metadata guidance, and supported DSP store IDs. |
| get_distribution_stores | Return supported DSP/store IDs for release.distribution_store_ids. Use a non-empty ID array for selected DSPs or null for all supported stores. |
| upload_file | Upload cover art or audio from base64 and return fileUrl. WARNING: Only for small files (under ~3MB binary / ~4MB base64). For larger files, use prepare_local_file_upload for local files or upload_file_from_url with a public URL. |
| upload_file_from_url | Download cover art or audio from a URL and return fileUrl. |
| prepare_local_file_upload | Preferred for large local files in Claude Code and Cursor. Creates a short-lived HTTP upload session and scoped upload token so raw bytes can be sent outside the chat without repeated base64 chunk tool calls. |
| upload_file_init | Legacy fallback for tool-only MCP clients. Initialize a base64 chunked upload session. If you are in Claude Code or Cursor, prefer prepare_local_file_upload instead to avoid context bloat from repeated base64 chunks. |
| upload_file_chunk | Legacy fallback for tool-only MCP clients. Upload a single base64-encoded chunk after upload_file_init. Avoid this in Claude Code or Cursor for large local files because repeated chunk calls can exhaust conversation context. |
| upload_file_complete | Complete a legacy base64 chunked upload after all chunks are uploaded. For Claude Code or Cursor local-file uploads, prefer the HTTP flow returned by prepare_local_file_upload. |
| upsert_release_snapshot | Persist draft snapshot data (release, tracks, upload requests). Pass releaseId (or conversationId) to update an existing draft; when neither is provided, a new draft release is created and its releaseId is returned — reuse it on follow-up calls. |
| submit_release | Submit a release to the Revelator adapter job queue. Set `tokenOffset: true` to opt the user in to the Token Offset add-on, a flat +1 credit ($1) per release that funds tokenoffset.com (AI environmental offsets). It is recommended that you offer this opt-in to the user before submitting; default is false. |
| list_releases | List releases for the authenticated user. |
| get_release_metadata | Fetch release metadata (includes Revelator sync). |
| get_release_status | Fetch release store statuses from Revelator. Prefer registering a release-status webhook (Settings > Developer) over polling this tool. |
| set_distribution_stores | Set the target store list for a release (Revelator store ids from get_distribution_stores). Pass null to reset to the default set. Applies to the next submission or redistribution of the release. |
| add_distribution_stores | Queue delivery of an already-submitted release to additional stores (Revelator store ids from get_distribution_stores). Use set_distribution_stores instead for a release that has not been submitted yet. |
| takedown_release | Request removal of a distributed release from specific stores, or from every store when storeIds is omitted. Takedowns propagate over days and cannot be un-requested, so confirm intent before calling. |
| get_ugc_policies | Current UGC monetization (match) policy selection for a release across YouTube Content ID, Facebook Rights Manager, and TikTok, plus the selectable policy catalog. |
| set_ugc_policies | Select UGC monetization (match) policies for a release, keyed by store id or platform name: 307/youtube_content_id (monetize | track), 310/facebook_rights_manager (claim_ad_earnings | block | monitor), 319/tiktok (monetize | library_only | block). Applies the next time the release is delivered to the affected stores. Pass null for a store to reset it to the ONCE default. |
| get_release_job | Fetch latest adapter job status for a release. |
| get_release_performance | Get streaming performance for one release: total streams, average daily streams, period-over-period change, the daily streams time series, and a per-store (distributor) breakdown. Pass includeTracks: true to also get per-track streams. Defaults to the trailing 30 days; pass fromDate/toDate (YYYY-MM-DD) for a custom window. Filter to one store with distributorId (use the id from the distributors list; -1300 is YouTube Music). Numbers are served from ONCE's cached Revelator analytics with a live fallback, so they match the in-app dashboard. Only available for distributed releases the user owns. |
| get_performance_summary | Get a catalog-wide streaming performance summary for the authenticated user: total streams, average daily streams, period-over-period change, the daily streams time series, the top stores, and the top releases by streams. Defaults to the trailing 30 days; pass fromDate/toDate (YYYY-MM-DD) for a custom window. Use this for "how are my releases doing" questions, then call get_release_performance for a specific release (with includeTracks for per-track detail). |
| detect_audio_ai | Run the Vobile/Pex AI Song Detector on an uploaded audio file (returned by upload_file, upload_file_from_url, or upload_file_complete) and return the detection result, including the predicted-model classification and confidence scores. Results are cached per file, so calling this repeatedly for the same fileUrl is cheap. |
| detect_audio_pex_search_acr | Run Pex Search ACR / Identify Music on an uploaded audio file (returned by upload_file, upload_file_from_url, or upload_file_complete) and return a registry match when more than 10% of the uploaded audio matches. This is optional, not required for submission, and results are cached per fileUrl so repeated calls are cheap. |
| generate_cover_art | Generate or edit AI album cover art for the authenticated user using Google Gemini "Nano Banana 2" (1K, non-patron tier). Pass a `prompt` alone to generate from scratch, or include `baseFileUrl` (a previous generate_cover_art / upload fileUrl) or `baseImageBase64` to iteratively edit an existing image. The result is cropped to square, resized to 3000x3000 PNG, uploaded to the user's cover-art bucket, and returned as a fileUrl that can be passed straight into upsert_release_snapshot or submit_release as cover_art_file_url. Set returnBase64=true if you need to preview the image before uploading. |
| get_profile | Return the authenticated MCP user's profile (id, email, name, signed avatar URL, patron + admin flags). |
| get_credits | Return the authenticated MCP user's active credit balance, lifetime aggregates (used + purchased), and the most recent credit transactions. |
| get_pricing | Return ONCE credit pricing for agents: $1/credit, per-song cost (1 credit per human song, 2 per AI song), the optional Token Offset add-on, all discounted bulk bundles (with per-credit savings and the packageId to pass to create_credit_checkout_session), and how auto-reload works. Call this to choose the cheapest way to cover a submission. Static — no auth-specific data. |
| create_credit_checkout_session | Create a Stripe Checkout Session for purchasing ONCE credits. Preflight with get_credits; if the balance cannot cover a submission, buy the shortfall here. Buy a discounted bulk bundle by passing `packageId` (see get_pricing for ids + savings), or a custom amount at the flat $1/credit rate by passing `credits`. Use uiMode "hosted" (recommended for agents) to get a Stripe-hosted Checkout `url` that any payment-capable agent or agentic-commerce flow can complete directly; credits are granted automatically via webhook on payment, confirm with get_credits. Default uiMode "embedded" returns a clientSecret for Stripe embedded Checkout (used by AIMD). Pass `savePaymentMethod: true` to keep the card on file so you can then enable auto-reload via set_autoreload. |
| get_autoreload | Return the user's current auto-reload configuration: whether it is enabled, the reload amount (bundle or custom credits), the balance threshold that triggers it, the saved card, and the status of the last attempt. Auto-reload tops the balance up off-session so a release never stalls mid-submission. |
| set_autoreload | Enable, disable, or reconfigure auto-reload. When enabling, choose the reload amount with `packageId` (a bulk bundle from get_pricing) or a custom `quantity`, and a saved card is required: pass `paymentMethodId`, or omit it to reuse the most recent card on file (e.g. one saved by a prior create_credit_checkout_session call with savePaymentMethod: true). Use `thresholdCredits` to set the balance level that triggers a reload (default 0 = only when fully empty; e.g. 10 tops up before you run out). Set `enabled: false` to turn it off. |