Koskamo

Audora MCP

An official MCP server for Audora that allows AI agents to manage artist profiles, set up releases with metadata and credits, run promotional campaigns, schedule social media posts, and read streaming analytics directly from an artist's account.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Audora MCP logo, by AudoraVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-07Operated by Audora
You need:Create an account to get startedthe artist connects their assistant from inside their Audora account
MCP endpoint (Streamable HTTP)
https://audora.music/mcp
Vendor documentation

What its tools do

52 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

52 of 52 have a description · 52 of 52 declare behavior hints · 35 of 52 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to audora.music ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Set up releases with full metadata and credits
  • Run promotional campaigns and schedule social posts
  • Read streaming analytics and audience data
  • Manage artist profiles and release drafts

Source and maintenance

Vendor evidenceRegistry 0.1.0

Protocol and capabilities

Server
audora 0.1.0
MCP protocol negotiated in check
2025-06-18
Tools
52 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

This is Audora's MCP server. Audora releases music: distribution to Spotify, Apple Music and 140+ stores through the same network the major labels use, with the artwork, the bios and the release campaign made alongside it. Connected to an artist's Audora account, you can build a release with them from start to finish: fill in their artist profile, add tracks and albums with the full metadata the stores demand, enter song credits, upload masters and cover art, and get a release ready for them to submit. The artist reviews and submits it themselves, and everything you do arrives as work they can look at. You are not connected to an account yet. The artist you are working for needs their own Audora account, and they connect an assistant from inside it. Send them to https://audora.music/ai-assistant/ and they can start there.

Tools

52 advertised

whoami — Who this connection belongs to
Advertised by the server during the last successful anonymous check.
Advertised read-only

Returns the account this connection acts in (an artist's, or a label's with its roster), what this connection is allowed to do, where the result is reviewed, and next_steps: what to offer the artist next, worked out from the account. Call this first, and again whenever you are unsure whose catalog you are working in. On a label connection, pass `artist` to see one roster artist's account.

whoami input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    }
  },
  "additionalProperties": false
}
whoami annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_requirements — What Audora needs
Advertised by the server during the last successful anonymous check.
Advertised read-only

Every field Audora needs, with its exact limit in characters or words, the closed list to choose from where there is one, and the accepted file formats and sizes. Call this BEFORE filling anything in. The limits differ per field: some are refused when exceeded and some only flagged. What blocks a release is set by Audora, and it changes.

get_requirements input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "entity": {
      "enum": [
        "artist",
        "track",
        "track_artist",
        "contributor",
        "album",
        "release",
        "split",
        "files"
      ],
      "type": "string",
      "description": "Narrow to one kind of thing. Omit for everything."
    },
    "release_type": {
      "enum": [
        "single",
        "ep",
        "album",
        "compilation"
      ],
      "type": "string",
      "description": "Narrow to the fields this kind of release needs. An album needs more than a single."
    }
  },
  "additionalProperties": false
}
get_requirements annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
design_in_audora — Open Audora's design tools
Advertised by the server during the last successful anonymous check.
Advertised read-only

Audora can design a logo, cover art, brand colors and typefaces, artist photos, and promotion posts and short videos for the artist. Those are made inside Audora, not through this connection: call this to get the exact page to send the artist to, with a sentence on what they will find there. Use it whenever the artist wants a logo, artwork, a cover, visuals, photos or promo video made.

design_in_audora input schema
{
  "type": "object",
  "required": [
    "what"
  ],
  "properties": {
    "what": {
      "enum": [
        "logo",
        "cover_art",
        "palette",
        "typography",
        "artist_photos",
        "promotion"
      ],
      "type": "string"
    },
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "album_id": {
      "type": "string",
      "description": "For cover_art on an album or EP."
    },
    "track_id": {
      "type": "string",
      "description": "For cover_art on a single."
    }
  },
  "additionalProperties": false
}
design_in_audora annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_stats — How the music is doing
Advertised by the server during the last successful anonymous check.
Advertised read-only

Streams, saves and growth per track, which stores and playlists the listening comes from, TikTok use, the audience's age and gender, how the artist's promotion posts performed, and their followers. For the whole catalog, when the artist has connected their own Songstats account, it also gives their numbers across the web (listeners, followers, playlist reach, socials, Shazam, charts), the cities they are listened to in now, the playlists carrying them and dated events. The same numbers the artist sees in Audora. Use it to answer "how is my release doing", to write a pitch or bio from real numbers, or to suggest where to focus next. When a figure is missing, say "not reported yet", never zero.

get_stats input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "album_id": {
      "type": "string",
      "description": "Every track on one album or EP."
    },
    "track_id": {
      "type": "string",
      "description": "One track. Leave out both ids for the whole catalog, which also includes posts, followers and audience."
    }
  },
  "additionalProperties": false
}
get_stats annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_limits — What this account's plan allows
Advertised by the server during the last successful anonymous check.
Advertised read-only

The plan, whether distribution is included, credits remaining, and the track, album and storage allowances. Check before uploading or preparing a submission.

get_limits input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    }
  },
  "additionalProperties": false
}
get_limits annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_profile — The artist's profile
Advertised by the server during the last successful anonymous check.
Advertised read-only

The artist profile as Audora holds it.

get_profile input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    }
  },
  "additionalProperties": false
}
get_profile annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
report_gap — Tell Audora what you could not do
Advertised by the server during the last successful anonymous check.
Advertised read-only

Call this whenever the artist asks for something there is no tool for, or a tool refuses in a way you cannot work around. It files the ask in Audora's support inbox, where a person reads it, and it shows in the artist's Settings › Support. Call it before you tell the artist no. It changes nothing in their catalog, and it is the only way the ask reaches anyone.

report_gap input schema
{
  "type": "object",
  "required": [
    "asked_for"
  ],
  "properties": {
    "note": {
      "type": "string",
      "description": "Anything that would help Audora understand the ask."
    },
    "asked_for": {
      "type": "string",
      "description": "What the artist wanted, in their own words as far as you can keep them."
    },
    "tool_tried": {
      "type": "string",
      "description": "The tool you tried or looked for, if there was one."
    }
  },
  "additionalProperties": false
}
report_gap annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
send_feedback — Tell Audora how it could serve the artist better
Advertised by the server during the last successful anonymous check.
Advertised read-only

Send Audora feedback it will read, as one of these kinds. missing_capability: a change you would need to do what the artist wants. connector_improvement: how this connector could work better for an assistant, such as a confusing tool, a missing field or a result that did not tell you enough. product_improvement: how Audora itself could serve artists better. bug: something that looks broken. other: anything else. It goes into Audora's support inbox and shows in the artist's Settings › Support, so write it for a person: what you were trying to do, what got in the way and what would have helped. Use it when you notice something worth fixing. You do not need the artist's permission, but set artist_asked to true when the artist asked for it. For a plain "there is no tool for that", report_gap is enough.

send_feedback input schema
{
  "type": "object",
  "required": [
    "kind",
    "summary",
    "details"
  ],
  "properties": {
    "kind": {
      "enum": [
        "missing_capability",
        "connector_improvement",
        "product_improvement",
        "bug",
        "other"
      ],
      "type": "string",
      "description": "What this is about."
    },
    "tool": {
      "type": "string",
      "description": "The tool this is about, if it is about one."
    },
    "details": {
      "type": "string",
      "description": "What you or the artist were trying to do, what got in the way and the change that would have helped. Up to 5000 characters. No passwords, tokens or other secrets."
    },
    "summary": {
      "type": "string",
      "description": "One line someone at Audora can triage from. Up to 120 characters."
    },
    "artist_asked": {
      "type": "boolean",
      "description": "True when the artist asked for this or said it; false or omitted when it is your own observation."
    }
  },
  "additionalProperties": false
}
send_feedback annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_tracks — Tracks in the catalog
Advertised by the server during the last successful anonymous check.
Advertised read-only

Every track in this account, newest first.

list_tracks input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    }
  },
  "additionalProperties": false
}
list_tracks annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_track — One track in full
Advertised by the server during the last successful anonymous check.
Advertised read-only

One track with its billed artists and its song credits.

get_track input schema
{
  "type": "object",
  "required": [
    "track_id"
  ],
  "properties": {
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "track_id": {
      "type": "string",
      "description": "The track's id, from list_tracks."
    }
  },
  "additionalProperties": false
}
get_track annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_albums — Albums in the catalog
Advertised by the server during the last successful anonymous check.
Advertised read-only

Every album in this account, newest first.

list_albums input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    }
  },
  "additionalProperties": false
}
list_albums annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
check_readiness — What is still missing
Advertised by the server during the last successful anonymous check.
Advertised read-only

For one track or one album: everything Audora still needs before that release could be submitted, and anything worth a second look that does not block it. That includes the stores' intake rules, checked against the uploaded master and cover themselves (a stereo WAV, FLAC or Apple Lossless master at a rate the stores take; square RGB JPG 3000–6000 px). Call this after writing, and again before telling the artist something is ready.

check_readiness input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "album_id": {
      "type": "string",
      "description": "Check an album or EP. Give this or track_id, not both."
    },
    "track_id": {
      "type": "string",
      "description": "Check a single. Give this or album_id, not both."
    }
  },
  "additionalProperties": false
}
check_readiness annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
find_online — Look the artist up online
Advertised by the server during the last successful anonymous check.
Open-world

Runs Audora's own lookup of what the artist has already published (streaming profiles, releases, their site and social profiles), or reads where one is and what it found. Use it only when you cannot search the web yourself: otherwise look the artist up with your own search, check with them that you found the right artist, and fill their page with update_profile. With action "start" it begins one, which takes 1–2 minutes; the artist gets a few a day, shared with Soundcheck in Audora. The account's first lookup is free and each later one costs credits and needs the artist's spend permission: start with dry_run: true to read the price, tell the artist, then start with confirm_cost_credits. With action "status" (the default) it reads the newest lookup, or the one named by run_id. Every fact comes with the pages it was read on. It never changes the artist's profile: when it is done, call propose_profile so the artist keeps what is theirs in Audora.

find_online input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "link": {
      "type": "string",
      "description": "For start: one page the artist is on (Apple Music, Deezer, SoundCloud, YouTube, Bandcamp, their site, Instagram), as a full https:// address. It is the best starting point. A Spotify link is kept as theirs but never opened, so another page starts the lookup better."
    },
    "action": {
      "enum": [
        "start",
        "status"
      ],
      "type": "string",
      "description": "\"start\" a new lookup, or read its \"status\". Default: status."
    },
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "not_me": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "For start: names of earlier matches the artist said are not them."
    },
    "run_id": {
      "type": "string",
      "description": "For status: a particular lookup. Default: the newest."
    },
    "dry_run": {
      "type": "boolean",
      "description": "For start: true to read what the lookup costs without starting it."
    },
    "confirm_cost_credits": {
      "type": "number",
      "description": "For start: the price a dry run quoted and you told the artist. Needed for a lookup that is not free."
    }
  },
  "additionalProperties": false
}
find_online annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
propose_profile — Put what was found in front of the artist
Advertised by the server during the last successful anonymous check.

Puts a finished find_online lookup in front of the artist in Audora and returns the link to it. The artist confirms it is them and keeps what is right there. This call writes nothing to their profile, and you should not copy the findings into update_profile yourself. Their Home says their assistant found something to look at.

propose_profile input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "run_id": {
      "type": "string",
      "description": "The lookup to propose. Default: the newest."
    }
  },
  "additionalProperties": false
}
propose_profile annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
update_profile — Fill in the artist's profile
Advertised by the server during the last successful anonymous check.

Set artist details: name, country, genre, tone, description, main markets, Promo's post language, the three bios and links. Send only the fields you are changing. Call get_requirements first for the exact limits. An over-long value is refused with the number it got.

update_profile input schema
{
  "type": "object",
  "required": [
    "fields"
  ],
  "properties": {
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "fields": {
      "type": "object",
      "description": "The fields to set, by the `name` get_requirements gives each one.",
      "additionalProperties": true
    },
    "dry_run": {
      "type": "boolean",
      "description": "True to see what would change, and what it would replace, without writing anything. Use it before overwriting words the artist wrote."
    }
  },
  "additionalProperties": false
}
update_profile annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
create_track — Add a track
Advertised by the server during the last successful anonymous check.

Create a track from its metadata. The audio and the cover art are uploaded separately. Pass idempotency_key if you might retry, so a timeout does not leave two tracks.

create_track input schema
{
  "type": "object",
  "required": [
    "fields"
  ],
  "properties": {
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "fields": {
      "type": "object",
      "description": "The fields to set, by the `name` get_requirements gives each one.",
      "additionalProperties": true
    },
    "dry_run": {
      "type": "boolean",
      "description": "True to check the call and see what it would replace, without writing anything."
    },
    "idempotency_key": {
      "type": "string",
      "description": "Send the same key if you retry, and the create happens once."
    }
  },
  "additionalProperties": false
}
create_track annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
add_version — Add a version of a song
Advertised by the server during the last successful anonymous check.

Make another take of a song as its own track, linked to the original: a clean edit, an instrumental, acoustic, live, a remix, your own words, or the explicit original. It starts with the song's credits, lyrics and store answers; the audio, ISRC, UPC and release are its own. Counts as a song on the plan. `other_primary_artists` in the answer did not come across: tell the artist.

add_version input schema
{
  "type": "object",
  "required": [
    "track_id",
    "kind"
  ],
  "properties": {
    "kind": {
      "enum": [
        "clean_edit",
        "instrumental",
        "acoustic",
        "live",
        "remix",
        "something_else",
        "explicit_original"
      ],
      "type": "string",
      "description": "clean_edit is marked Clean and named Radio Edit. instrumental leaves the lyrics out. explicit_original is marked Explicit, with no version words, for a Clean song with no explicit version."
    },
    "words": {
      "type": "string",
      "description": "For something_else: what this version is, such as Slowed. Never an artist's name, and never Clean or Explicit."
    },
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "dry_run": {
      "type": "boolean",
      "description": "True to check the call and see what it would write, without writing anything."
    },
    "remixer": {
      "type": "string",
      "description": "For remix: who remixed it. Ask the artist; they get the Remixer role."
    },
    "track_id": {
      "type": "string",
      "description": "The song to add a version of."
    },
    "idempotency_key": {
      "type": "string",
      "description": "Send the same key if you retry, and the add happens once."
    }
  },
  "additionalProperties": false
}
add_version annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
update_track — Change a track
Advertised by the server during the last successful anonymous check.

Amend a track's metadata. Refused once its release has been submitted: a submitted release carries a frozen copy, and changing the catalog underneath it is the artist's own decision, because it costs credits.

update_track input schema
{
  "type": "object",
  "required": [
    "track_id",
    "fields"
  ],
  "properties": {
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "fields": {
      "type": "object",
      "description": "The fields to set, by the `name` get_requirements gives each one.",
      "additionalProperties": true
    },
    "dry_run": {
      "type": "boolean",
      "description": "True to see what would change, and what it would replace, without writing anything. Use it before overwriting words the artist wrote."
    },
    "track_id": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
update_track annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
set_track_credits — Credit who made a track
Advertised by the server during the last successful anonymous check.

Replace a track's song credits with this list. Every track needs at least one songwriter, one performer and one producer before its release can be submitted. These are real people: ask the artist, and never invent a name to satisfy the requirement.

set_track_credits input schema
{
  "type": "object",
  "required": [
    "track_id",
    "credits"
  ],
  "properties": {
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "credits": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true
      },
      "description": "Each entry: name, role (songwriter | performer | producer | studio | compositional | label_personnel). A performer also takes performer_type (primary | featured | non_featured, default primary) and instrument: what they played or sang, spelled exactly as in get_requirements' `performer_roles` list (e.g. \"Vocals - Lead Vocals\"). The release cannot be submitted until every performer has one, and, on a track billing two or more artists, each of them has a performer credit under that name with a real role; a performer sent without one is saved and named in `warnings`. Songwriters and producers take no instrument. studio, compositional and label_personnel are optional credits (a mastering engineer, an arranger, an A&R coordinator): each takes credit_role, from that kind's list in get_requirements' `contributors.optional_credits` (e.g. \"Mastering Engineer\"), and never counts toward the three a track needs. The list replaces every credit on the track, these included."
    },
    "dry_run": {
      "type": "boolean",
      "description": "True to check the call and see what it would replace, without writing anything."
    },
    "track_id": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
set_track_credits annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
set_track_artists — Set who a track is billed to
Advertised by the server during the last successful anonymous check.

Replace who a track is billed to: the "Artist & Guest feat. Guest" line on every store. Send the whole list in billing order, as the artist tells you, with at least one `primary`. Nobody is added for you: the account's own artist is on the list only if you send it, so ask, and Send refuses a song with no primary artist. `primary` and `with` make up the main credit; `featured` and `remixer` become the "feat." part. A `primary` artist besides the account's own is a collaboration: ask the artist whether they have all the rights needed for it, and send rights_confirmed: true only when they say yes. Without it the call is refused and nothing is written. A song billing two or more names also needs each credited with set_track_credits under that name with a real role. The songwriter, performer and producer credits are a different list, set with set_track_credits.

set_track_artists input schema
{
  "type": "object",
  "required": [
    "track_id",
    "artists"
  ],
  "properties": {
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "artists": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "name",
          "role"
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "Exactly as it should read on the store."
          },
          "role": {
            "enum": [
              "primary",
              "featured",
              "with",
              "remixer"
            ],
            "type": "string"
          }
        }
      },
      "description": "Everyone billed, in billing order. An empty list clears the billing: the song then has no billed artist."
    },
    "dry_run": {
      "type": "boolean",
      "description": "True to check the call and see what it would replace, without writing anything."
    },
    "track_id": {
      "type": "string"
    },
    "rights_confirmed": {
      "type": "boolean",
      "description": "Required as true when the list has a `primary` artist besides the account's own. Ask the artist first, in these words: \"I have all the rights needed for this collaboration\". Send true only when they confirm it. Never assume it: it is recorded as their legal confirmation."
    }
  },
  "additionalProperties": false
}
set_track_artists annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
create_album — Add an album
Advertised by the server during the last successful anonymous check.

Create an album or EP. Put tracks on it afterward with set_album_tracks.

create_album input schema
{
  "type": "object",
  "required": [
    "fields"
  ],
  "properties": {
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "fields": {
      "type": "object",
      "description": "The fields to set, by the `name` get_requirements gives each one.",
      "additionalProperties": true
    },
    "dry_run": {
      "type": "boolean",
      "description": "True to check the call and see what it would replace, without writing anything."
    },
    "idempotency_key": {
      "type": "string",
      "description": "Send the same key if you retry, and the create happens once."
    }
  },
  "additionalProperties": false
}
create_album annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
update_album — Change an album
Advertised by the server during the last successful anonymous check.

Amend an album's details. Refused once its release has been submitted.

update_album input schema
{
  "type": "object",
  "required": [
    "album_id",
    "fields"
  ],
  "properties": {
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "fields": {
      "type": "object",
      "description": "The fields to set, by the `name` get_requirements gives each one.",
      "additionalProperties": true
    },
    "dry_run": {
      "type": "boolean",
      "description": "True to see what would change, and what it would replace, without writing anything. Use it before overwriting words the artist wrote."
    },
    "album_id": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
update_album annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
set_album_tracks — Set an album's running order
Advertised by the server during the last successful anonymous check.

Put these tracks on this album, in this order. Replaces whatever was on it. A track left out is taken off the album, not deleted.

set_album_tracks input schema
{
  "type": "object",
  "required": [
    "album_id",
    "track_ids"
  ],
  "properties": {
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "dry_run": {
      "type": "boolean",
      "description": "True to check the call and see what it would replace, without writing anything."
    },
    "album_id": {
      "type": "string"
    },
    "track_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "In running order."
    }
  },
  "additionalProperties": false
}
set_album_tracks annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
request_upload — Get somewhere to put a file
Advertised by the server during the last successful anonymous check.

Ask for a one-time address to upload a master, cover art, a logo or an artist photo to. You need the file's NAME, nothing else. Never ask the artist how big a file is. PUT the file to the address you get back, then call finalize_upload, which reads the file itself and checks the size, the format and the account's storage against it.

request_upload input schema
{
  "type": "object",
  "required": [
    "kind",
    "filename"
  ],
  "properties": {
    "kind": {
      "enum": [
        "audio",
        "cover_art",
        "logo",
        "artist_image"
      ],
      "type": "string"
    },
    "bytes": {
      "type": "number",
      "description": "Optional. The size in bytes, IF you already know it: it saves a doomed upload. Never ask anyone for it. The server measures the file when it arrives."
    },
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "album_id": {
      "type": "string"
    },
    "filename": {
      "type": "string",
      "description": "The file's own name, with its extension. Audio is .wav, .flac or .m4a (Apple Lossless); images are .png, .jpg or .webp. A release going out through Audora needs a stereo master and a .jpg cover (square, 3000–6000 px, RGB). Other images upload but cannot be a release cover."
    },
    "track_id": {
      "type": "string",
      "description": "Required for audio; for cover art, give this or album_id."
    },
    "mime_type": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
request_upload annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
finalize_upload — Check an uploaded file and attach it
Advertised by the server during the last successful anonymous check.

Audora reads the file you uploaded (the file itself, not its name) and attaches it only if it meets the upload spec. A master that is secretly an MP3, or a cover that is not square or is under 3000 pixels, is refused here and the file is removed. Passing here is not the same as being releasable: a release also needs a stereo master and a square RGB JPG cover of 3000–6000 px, which check_readiness reports on.

finalize_upload input schema
{
  "type": "object",
  "required": [
    "upload_id"
  ],
  "properties": {
    "name": {
      "type": "string",
      "description": "A short name, for an artist image."
    },
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "upload_id": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
finalize_upload annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
save_release_draft — Prepare a release, as a draft
Advertised by the server during the last successful anonymous check.

Write the release details for a track or album as a DRAFT. A draft costs nothing, can be changed and goes nowhere until the artist says so. Returns a draft_hash identifying exactly what you prepared, and release_rules: everything the track or album still needs to meet the stores' rules (master format, cover, sub-genre, languages, countries, performer roles) before it can be submitted. An older track or album usually needs some of it. A draft saves even when it is unfinished: a release date sooner than the stores take is saved and comes back in `warnings`, and submitting refuses it until it is changed.

save_release_draft input schema
{
  "type": "object",
  "required": [
    "type",
    "item_id"
  ],
  "properties": {
    "type": {
      "enum": [
        "track",
        "album"
      ],
      "type": "string"
    },
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "item_id": {
      "type": "string",
      "description": "The track's or album's id."
    },
    "release": {
      "type": "object",
      "description": "The release fields, by the names get_requirements(entity: \"release\") gives them, for example { \"release_type\": \"single\", \"scheduled_date\": \"2026-11-20\", \"description\": \"...\", \"pitching_directly\": \"...\", \"release_timeline\": \"...\", \"artist_quotes\": \"...\" }. Add \"splits\" for royalty splits. Send only what you are setting.",
      "additionalProperties": true
    }
  },
  "additionalProperties": false
}
save_release_draft annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
get_release_questions — What Audora has asked the artist
Advertised by the server during the last successful anonymous check.
Advertised read-only

Questions Audora's reviewers asked about the artist's releases (for example, whether the rights to a remix are cleared), with the whole conversation. A release with an unanswered question does not go out until the artist answers. Omit release_id for every open question.

get_release_questions input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "release_id": {
      "type": "string",
      "description": "One release, including a closed conversation. Omit for all open questions."
    }
  },
  "additionalProperties": false
}
get_release_questions annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
answer_release_question — Send the artist's answer to Audora
Advertised by the server during the last successful anonymous check.

Send the ARTIST'S answer to a question Audora asked about their release (see get_release_questions). Ask the artist and relay what they say. Never answer for them and never guess: an answer can be a statement about rights or ownership that Audora relies on. Audora is told it came through their assistant. The release status does not change; Audora reads the answer and moves the release on.

answer_release_question input schema
{
  "type": "object",
  "required": [
    "release_id",
    "answer"
  ],
  "properties": {
    "answer": {
      "type": "string",
      "description": "The artist's answer, in their words. Up to 4000 characters."
    },
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "dry_run": {
      "type": "boolean",
      "description": "True to check the question is open, without sending anything."
    },
    "release_id": {
      "type": "string"
    },
    "idempotency_key": {
      "type": "string",
      "description": "Send the same key if you retry, and the answer is sent once."
    }
  },
  "additionalProperties": false
}
answer_release_question annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
list_releases — Releases and their status
Advertised by the server during the last successful anonymous check.
Advertised read-only

Every release in this account with where it has reached (status_label: Draft, Submitted, Changes asked, Going to the stores, Ready for release day, Live, Rejected, Takedown asked, Taken down, Released elsewhere), including anything Audora asked about.

list_releases input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    }
  },
  "additionalProperties": false
}
list_releases annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_campaigns — Promo campaigns
Advertised by the server during the last successful anonymous check.
Advertised read-only

Every Promo campaign in this account, with its window, whether it is ahead, running or over, and how many posts are to look at, scheduled, posted or did not go out. A release's campaign is kind release; between releases a campaign is a month (kind between_releases), and none starts by itself: start_campaign with between_releases plans the next one. Also lists upcoming releases that have no campaign yet, and campaigns being planned right now.

list_campaigns input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    }
  },
  "additionalProperties": false
}
list_campaigns annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_campaign — A campaign's calendar
Advertised by the server during the last successful anonymous check.
Advertised read-only

One campaign as Promo's calendar: every post by day and lane, with its words, hashtags, picture or video, status, and schedule_check: exactly what Audora's Schedule would decide about it now, and in the artist's words what it still needs.

get_campaign input schema
{
  "type": "object",
  "required": [
    "campaign_id"
  ],
  "properties": {
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "campaign_id": {
      "type": "string",
      "description": "From list_campaigns."
    }
  },
  "additionalProperties": false
}
get_campaign annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
promo_this_week — What is posting this week
Advertised by the server during the last successful anonymous check.
Advertised read-only

What goes out in the next days across every campaign, what in that time is not scheduled yet (and so will not go out unless it is), and what did not go out lately and needs the artist. last_week: the week that ended, as the Last week sheet on Promo shows it: each post that went out with its numbers and where it stands against the artist's own usual on its platform, the one that did best, their music beside the week before, and what works best so far from their own results.

promo_this_week input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "days": {
      "type": "number",
      "description": "How many days ahead, 1–14. Default 7."
    },
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    }
  },
  "additionalProperties": false
}
promo_this_week annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
promo_results — How the posts did
Advertised by the server during the last successful anonymous check.
Advertised read-only

The posts that went out, best first, with their latest reach, likes, comments, shares, saves and views, the totals over the window, and the followers on each connected account. A missing number is not reported yet, never zero. what_works: per platform, the angles and posting hours that have beaten the artist's usual most often, from their own posts only, with how many posts each rests on.

promo_results input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "days": {
      "type": "number",
      "description": "How far back, 1–365 days. Default 90."
    },
    "limit": {
      "type": "number",
      "description": "How many posts to list, 1–50. Default 10."
    },
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    }
  },
  "additionalProperties": false
}
promo_results annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
start_campaign — Start a Promo campaign
Advertised by the server during the last successful anonymous check.

Start a campaign for an upcoming release, or a month between releases (between_releases: true, from tomorrow; none starts by itself, so start the next month the same way when one ends). A release already out gets no campaign of its own: its start is made between releases with its song first (the answer says between_releases: true). Audora writes the campaign (every post's day, time, words and what picture or video it needs) at a price that grows with its size (2 a week is the least, Every day the most; the dry run's quote.plan says it), charged when it starts and returned if the plan fails; starting it needs the artist's spend permission. Nothing is made: fill each post from the artist's Library with update_post, or have Audora make one with make_posts (priced then). A campaign is planned in moments: one video or picture posted the same day on every connected account it fits, with words for each account. Each post costs 1 credit to go out, every account a post of its own, only when it is scheduled. The answers about the song (the_story, key_lyrics, key_moments, what_works, sonic_references, note) are the Start panel's: optional, filled from what Audora knows when left out, and they turn on posts that use them. A release (or the time between releases) can run several campaigns at once, each with its own language, lead market and accounts; one that would copy a live campaign in all three is refused (a dry run's quote.duplicate_of names it, quote.live_campaigns lists them). Planned posts fit around the posts other campaigns already have on the same accounts: one video and one picture a day per account. Use dry_run first to see the posts, the price and those answers (quote.answers), tell the artist, then start with confirm_cost_credits.

start_campaign input schema
{
  "type": "object",
  "required": [
    "lanes",
    "size"
  ],
  "properties": {
    "note": {
      "type": "string",
      "description": "Optional, ≤ 200 characters: \"Anything we should know?\", anything else the planner should know, in the artist's words. Left out: the last campaign's for this release, if any."
    },
    "size": {
      "enum": [
        "light",
        "steady",
        "loud"
      ],
      "type": "string",
      "description": "How often: light is 2 moments a week, steady 4 a week, loud every day (a video moment and a picture moment each day, so every account posts every day). A release campaign runs 5 weeks before release day and 2 after (49 days: light 14 moments, steady 28, loud 98), its moments climbing toward release day; between releases a month (30 days: light 9, steady 17, loud 60). A release closer than 5 weeks has fewer days and so fewer moments. The dry run quotes the exact moments and posts."
    },
    "about": {
      "enum": [
        "song",
        "artist"
      ],
      "type": "string",
      "description": "Between releases only: what the campaign is about. \"song\" (with about_track_id, one of the artist's songs) or \"artist\" (posts about who they are, their sound and their artist page; no line is kept). Left out: planned as before."
    },
    "lanes": {
      "type": "array",
      "items": {
        "enum": [
          "instagram",
          "story",
          "facebook",
          "tiktok",
          "youtube"
        ],
        "type": "string"
      },
      "description": "Where the posts go. Only lanes with a connected account are planned."
    },
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "dry_run": {
      "type": "boolean",
      "description": "True to check the call and see what it would do, without writing anything."
    },
    "accounts": {
      "type": "object",
      "properties": {
        "tiktok": {
          "type": "string"
        },
        "youtube": {
          "type": "string"
        },
        "facebook": {
          "type": "string"
        },
        "instagram": {
          "type": "string"
        }
      },
      "description": "Optional, for an artist with more than one account on a platform: which account each platform posts through, as the account's id, @handle or name (a dry run's quote.accounts lists them). Every post of the campaign is tied to its account and never goes out on another. Left out for a platform: the account the newest campaign in this language used there, else the artist's main account."
    },
    "the_story": {
      "type": "string",
      "description": "Optional, ≤ 5000 characters: \"The story behind it\", in the artist's own words. Where it was written, what happened, who it is for. Posts tell it in your words. Never write it for them."
    },
    "key_lyrics": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Optional, up to 2: \"A line that matters\", word for word from the song's lyrics (get_track has them). A line not in the lyrics is refused; a song with no lyrics takes a line the artist types; an instrumental takes none."
    },
    "release_id": {
      "type": "string",
      "description": "The release (from list_releases or list_campaigns' can_start). Or use between_releases."
    },
    "what_works": {
      "type": "string",
      "description": "Optional, ≤ 2000 characters: \"What worked before\", in the artist's words. A post, a format or a time that did well for you. Posts can take the same shape again."
    },
    "key_moments": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "date",
          "label"
        ],
        "properties": {
          "date": {
            "type": "string",
            "description": "YYYY-MM-DD, still ahead."
          },
          "kind": {
            "enum": [
              "show",
              "release_party",
              "listening_party",
              "other"
            ],
            "type": "string",
            "description": "show, a party, or other."
          },
          "label": {
            "type": "string",
            "description": "What happens, in the artist's words."
          },
          "event_id": {
            "type": "string",
            "description": "A Scene event's id (list_events): its own date, place and link are used."
          },
          "link_url": {
            "type": "string",
            "description": "Optional https link for tickets or info."
          }
        }
      },
      "description": "Optional, up to 6: \"Something coming up\". A show, a video, a date that matters. Posts lead up to it. Left out: Scene's public shows and parties inside the campaign's days."
    },
    "lead_market": {
      "enum": [
        "us",
        "uk",
        "eu",
        "nordics",
        "dach",
        "france",
        "latam",
        "japan",
        "kpop",
        "china",
        "india",
        "mena",
        "africa",
        "anz",
        null
      ],
      "type": [
        "string",
        "null"
      ],
      "description": "Optional: where most of the listeners for this campaign are. Every post is timed for that market's clock. null: timed where the artist is. Left out: the last campaign's market, else the first market on the artist's page (a dry run's quote.markets says which)."
    },
    "lyric_video": {
      "type": "boolean",
      "description": "Optional: the campaign's first made video shows the song's words in time with the song. Audora times the lyrics when the campaign starts (free), so that video comes about 10 minutes later. false: no video shows lyrics. Left out: on when the song's lyrics can be timed. A dry run's quote.lyric_video says the song and where its lyrics stand (to_time, timing, timed, or why not: no_lyrics, instrumental, language, no_master)."
    },
    "loop_opt_out": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "dimension",
          "platform",
          "value"
        ],
        "properties": {
          "value": {
            "type": "string"
          },
          "platform": {
            "enum": [
              "instagram",
              "story",
              "facebook",
              "tiktok",
              "youtube"
            ],
            "type": "string"
          },
          "dimension": {
            "enum": [
              "angle",
              "hour_band",
              "picture_source"
            ],
            "type": "string"
          }
        }
      },
      "description": "Optional: what the artist does not want Audora to lean on in this campaign, from a dry run's quote.from_results (Start a campaign's \"From your results\": the angles, hours and picture sources the artist's own post results say have done best, each line with its count). Pass a line's opt_out entries for each line the artist unticks; that choice is then made as it is for everyone, for this campaign only. Left out: every line is planned with. Each post still gets one try at something new either way. quote.from_results is null when there is no line."
    },
    "post_language": {
      "enum": [
        "en-US",
        "en-GB",
        "sv",
        "nb",
        "da",
        "fi",
        "is",
        "de",
        "nl",
        "fr",
        "es-ES",
        "es-419",
        "pt-BR",
        "pt-PT",
        "it",
        "zh-CN",
        "zh-TW",
        "ja",
        "ko"
      ],
      "type": "string",
      "description": "Optional: the language every post in this campaign is written in, with the text on its pictures and videos. Left out: the artist's Post language, else the language the artist's own post results have done best in (when their results are in 2 or more languages and one holds 4 or more and beats their usual most often), else the language the release's songs are sung in, else en-US. A dry run's quote.post_language says which and why; its results names the language their results favor, also when their Post language is another (offer it, never assume it). It is the campaign's, never written back to the artist."
    },
    "about_track_id": {
      "type": "string",
      "description": "With about: \"song\", the song the campaign is about (list_tracks)."
    },
    "idempotency_key": {
      "type": "string",
      "description": "Send the same key if you retry, and the change happens once."
    },
    "replace_plan_id": {
      "type": "string",
      "description": "Optional: start that campaign over (an id from list_campaigns, for the same release or between releases). Its posts not yet scheduled are removed once the new campaign is written; scheduled ones stay and go out."
    },
    "between_releases": {
      "type": "boolean",
      "description": "True for a month between releases instead of a release's campaign."
    },
    "picture_fallback": {
      "enum": [
        "stock",
        "new",
        "ask"
      ],
      "type": "string",
      "description": "Optional: what fills a post the artist's own photos and cover do not cover, when Audora is asked to make it (make_posts, or in the app). stock: free Pixabay stock photos, always made into the artist's cards (people and brands left out; not offered for a song about drugs, sex or politics). new: Audora draws a new picture. ask: those posts wait for the artist to pick a photo in the app. Stock and new cost the same (the artist's own photos and cover are free). Left out: the artist's last answer, else stock. A dry run's quote.picture_fallback says the starting choice and whether stock may be used."
    },
    "sonic_references": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Optional, up to 5 names: \"Artists you sound like\". Left out: the Artist page's reference artists."
    },
    "key_lyrics_track_id": {
      "type": "string",
      "description": "The song the lines are from: one of the release's songs, or between releases any of the artist's. Left out: the release's songs are tried; between releases, the artist's newest songs with lyrics."
    },
    "confirm_cost_credits": {
      "type": "number",
      "description": "The price a dry run quoted (charged_at_start: the plan at its size) and you told the artist. Required to start."
    }
  },
  "additionalProperties": false
}
start_campaign annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
update_post — Change a post
Advertised by the server during the last successful anonymous check.

Change a post's words, hashtags, link, day, time, its picture or video (from the Library), or the angle its words take. Send only what changes. Returns the post with schedule_check: what Schedule would decide now. A post already scheduled can be changed only with the schedule permission; one already handed to its platform's own schedule (Facebook, YouTube) or one that went out cannot be changed here.

update_post input schema
{
  "type": "object",
  "required": [
    "post_id"
  ],
  "properties": {
    "date": {
      "type": "string",
      "description": "The day it goes out, YYYY-MM-DD, inside the campaign's window. A draft may be saved with a day gone by; Schedule asks for one still ahead (schedule_check says so)."
    },
    "time": {
      "type": "string",
      "description": "The time it goes out, HH:MM 24-hour, in the artist's own time zone."
    },
    "angle": {
      "enum": [
        "pin_angle.hook_object",
        "pin_angle.listener_pov",
        "pin_angle.lyric_line_on_beat",
        "pin_angle.occasion_day",
        "pin_angle.one_answerable_question",
        "pin_angle.ordinary_scene_contrast",
        "pin_angle.place_light_and_weather",
        "pin_angle.place_named_in_words",
        "pin_angle.release_fact_card",
        "pin_angle.repeat_what_worked",
        "pin_angle.scene_vocabulary",
        "pin_angle.show_coming_up",
        "pin_angle.story_line_that_nearly_went",
        "pin_angle.story_place",
        "pin_angle.tail_section",
        "pin_angle.uploaded_asset_hero"
      ],
      "type": "string",
      "description": "Which of Audora's post angles the words take (the key names it: listener_pov is the listener's side of the song, tail_section a part of the track no other post used, hook_object an object the song names, and so on). Audora counts how each angle does for the artist, and promo_results' what_works shows the result. get_campaign shows each post's angle."
    },
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "caption": {
      "type": "string",
      "description": "The words of the post, as they will be published. The lane's limit and Audora's text rules apply (no placeholders, nothing that points back at another post)."
    },
    "dry_run": {
      "type": "boolean",
      "description": "True to check the call and see what it would do, without writing anything."
    },
    "post_id": {
      "type": "string",
      "description": "The post's id (post_id from get_campaign or promo_this_week)."
    },
    "hashtags": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Up to 12 hashtags, with or without #. Replaces the list."
    },
    "link_url": {
      "type": [
        "string",
        "null"
      ],
      "description": "A web address the post links to, or null to remove it."
    },
    "media_asset_id": {
      "type": "string",
      "description": "A picture (for a picture post) or a video (for a video post) already in the artist's Library, by its media asset id. Audora does not make pictures or videos through this connection."
    },
    "idempotency_key": {
      "type": "string",
      "description": "Send the same key if you retry, and the change happens once."
    }
  },
  "additionalProperties": false
}
update_post annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
keep_post — Keep a post
Advertised by the server during the last successful anonymous check.

Bring a skipped post, or one that did not go out, back as a draft to schedule. A draft is already kept.

keep_post input schema
{
  "type": "object",
  "required": [
    "post_id"
  ],
  "properties": {
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "post_id": {
      "type": "string",
      "description": "The post's id (post_id from get_campaign or promo_this_week)."
    },
    "idempotency_key": {
      "type": "string",
      "description": "Send the same key if you retry, and the change happens once."
    }
  },
  "additionalProperties": false
}
keep_post annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
skip_post — Skip a post
Advertised by the server during the last successful anonymous check.

Skip a post so it does not go out. It stays on the campaign and keep_post brings it back. Skipping a post that is already scheduled takes it out of the queue and returns its posting credit, and needs the schedule permission.

skip_post input schema
{
  "type": "object",
  "required": [
    "post_id"
  ],
  "properties": {
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "post_id": {
      "type": "string",
      "description": "The post's id (post_id from get_campaign or promo_this_week)."
    },
    "idempotency_key": {
      "type": "string",
      "description": "Send the same key if you retry, and the change happens once."
    }
  },
  "additionalProperties": false
}
skip_post annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
add_post — Add a post
Advertised by the server during the last successful anonymous check.

Add a post to a campaign on one lane and day, as Promo's + does, with its words, the angle they take and a picture or video from the Library if you have them. It is a post on its own, not part of a moment, and a draft until it is scheduled.

add_post input schema
{
  "type": "object",
  "required": [
    "campaign_id",
    "lane",
    "date"
  ],
  "properties": {
    "date": {
      "type": "string",
      "description": "The day it goes out, YYYY-MM-DD, inside the campaign's window. A draft may be saved with a day gone by; Schedule asks for one still ahead (schedule_check says so)."
    },
    "lane": {
      "enum": [
        "instagram",
        "story",
        "facebook",
        "tiktok",
        "youtube"
      ],
      "type": "string",
      "description": "Where it goes."
    },
    "time": {
      "type": "string",
      "description": "The time it goes out, HH:MM 24-hour, in the artist's own time zone."
    },
    "angle": {
      "enum": [
        "pin_angle.hook_object",
        "pin_angle.listener_pov",
        "pin_angle.lyric_line_on_beat",
        "pin_angle.occasion_day",
        "pin_angle.one_answerable_question",
        "pin_angle.ordinary_scene_contrast",
        "pin_angle.place_light_and_weather",
        "pin_angle.place_named_in_words",
        "pin_angle.release_fact_card",
        "pin_angle.repeat_what_worked",
        "pin_angle.scene_vocabulary",
        "pin_angle.show_coming_up",
        "pin_angle.story_line_that_nearly_went",
        "pin_angle.story_place",
        "pin_angle.tail_section",
        "pin_angle.uploaded_asset_hero"
      ],
      "type": "string",
      "description": "Which of Audora's post angles the words take (the key names it: listener_pov is the listener's side of the song, tail_section a part of the track no other post used, hook_object an object the song names, and so on). Audora counts how each angle does for the artist, and promo_results' what_works shows the result. get_campaign shows each post's angle."
    },
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "caption": {
      "type": "string",
      "description": "The words of the post, as they will be published. The lane's limit and Audora's text rules apply (no placeholders, nothing that points back at another post)."
    },
    "dry_run": {
      "type": "boolean",
      "description": "True to check the call and see what it would do, without writing anything."
    },
    "hashtags": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Up to 12 hashtags, with or without #. Replaces the list."
    },
    "link_url": {
      "type": [
        "string",
        "null"
      ],
      "description": "A web address the post links to, or null to remove it."
    },
    "campaign_id": {
      "type": "string",
      "description": "From list_campaigns."
    },
    "media_asset_id": {
      "type": "string",
      "description": "A picture (for a picture post) or a video (for a video post) already in the artist's Library, by its media asset id. Audora does not make pictures or videos through this connection."
    },
    "idempotency_key": {
      "type": "string",
      "description": "Send the same key if you retry, and the change happens once."
    }
  },
  "additionalProperties": false
}
add_post annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
list_todos — What the artist still needs to do
Advertised by the server during the last successful anonymous check.
Advertised read-only

Every open to-do the artist sees on their pages, most urgent first: what it is, how urgent, where it is fixed and the tool that fixes it from here. Each has a key; closable says whether close_todo can close it.

list_todos input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    }
  },
  "additionalProperties": false
}
list_todos annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
close_todo — Close a to-do
Advertised by the server during the last successful anonymous check.

Close one to-do the artist does not want to see, exactly as closing it in Audora does: it comes back by itself when what it is about changes. A track's or album's missing details are not closed: they are fixed.

close_todo input schema
{
  "type": "object",
  "required": [
    "key"
  ],
  "properties": {
    "key": {
      "type": "string",
      "description": "The to-do's key, from list_todos."
    },
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "idempotency_key": {
      "type": "string",
      "description": "Send the same key if you retry, and the change happens once."
    }
  },
  "additionalProperties": false
}
close_todo annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
list_release_todos — A release's checklist
Advertised by the server during the last successful anonymous check.
Advertised read-only

With release_id: the release's "Around the release" checklist (pitch, pre-save, Canvas, lyrics, release day and the weeks after), each with when it is due, why, where it is done and whether it is done. Without: the artist's "Set up once" list (Instagram ready to post, photos and clips for the posts, claiming the store profiles, the bio link).

list_release_todos input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "release_id": {
      "type": "string",
      "description": "The release (list_releases). Leave out for \"Set up once\"."
    }
  },
  "additionalProperties": false
}
list_release_todos annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
set_todo_done — Tick a checklist item
Advertised by the server during the last successful anonymous check.

Mark one checklist item done, or not done again: the tick in Audora.

set_todo_done input schema
{
  "type": "object",
  "required": [
    "todo_id",
    "done"
  ],
  "properties": {
    "done": {
      "type": "boolean"
    },
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "todo_id": {
      "type": "string",
      "description": "From list_release_todos."
    },
    "idempotency_key": {
      "type": "string",
      "description": "Send the same key if you retry, and the change happens once."
    }
  },
  "additionalProperties": false
}
set_todo_done annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
list_media — The artist's Library
Advertised by the server during the last successful anonymous check.
Advertised read-only

The artist's pictures or videos in Audora's Library, newest first, searchable by name and filterable by category (Brand kit, Logo, Cover art, Promo, a platform, Made by Audora, Uploaded, Found online, Stock footage). Each has a media_asset_id (what update_post takes) and a preview link valid for an hour.

list_media input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "kind": {
      "enum": [
        "images",
        "videos"
      ],
      "type": "string",
      "description": "Pictures (default) or videos."
    },
    "limit": {
      "type": "integer",
      "maximum": 50,
      "minimum": 1
    },
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "offset": {
      "type": "integer",
      "minimum": 0
    },
    "search": {
      "type": "string",
      "description": "Words in the item's name, or the artist, track or album it belongs to."
    },
    "categories": {
      "type": "array",
      "items": {
        "enum": [
          "branding",
          "logo",
          "cover-art",
          "promo",
          "tiktok",
          "instagram",
          "youtube",
          "facebook",
          "ai-generated",
          "uploaded",
          "found-online",
          "stock"
        ],
        "type": "string"
      },
      "description": "Only items in every one of these."
    }
  },
  "additionalProperties": false
}
list_media annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
set_first_listen — First listen on release day
Advertised by the server during the last successful anonymous check.

Switch a release on or off the list other artists on Audora see on release day, to give it a first listen. Refused for a release out more than four weeks ago or released elsewhere.

set_first_listen input schema
{
  "type": "object",
  "required": [
    "release_id",
    "on"
  ],
  "properties": {
    "on": {
      "type": "boolean"
    },
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "release_id": {
      "type": "string",
      "description": "From list_releases."
    },
    "idempotency_key": {
      "type": "string",
      "description": "Send the same key if you retry, and it happens once."
    }
  },
  "additionalProperties": false
}
set_first_listen annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
list_events — The artist's shows and parties
Advertised by the server during the last successful anonymous check.
Advertised read-only

The shows, release parties and listening parties the artist has posted, with who is invited and who is coming, and their drafts (saved, not posted, seen by nobody else). Artist connections only: Scene is between artists.

list_events input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    }
  },
  "additionalProperties": false
}
list_events annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
save_event — Save or post a show or party
Advertised by the server during the last successful anonymous check.

Save the artist's own show, release party or listening party, or change one (pass event_id). It is saved as a DRAFT that only the artist sees, with whatever is known (only kind is needed), unless you pass post: true. Posting puts it on Scene for artists on Audora (and on the public page when is_public) and needs a title, starts_at and a place: a city and a country, and/or an online link. Post only when the artist asked for it to go out. An event already posted stays posted, so its changes need the same. Inviting artists or Audora stays the artist's to do in Audora; an edit keeps what they chose. Artist connections only.

save_event input schema
{
  "type": "object",
  "required": [
    "event"
  ],
  "properties": {
    "post": {
      "type": "boolean",
      "description": "true puts it on Scene now (needs title, starts_at and a place). Leave out to save a draft."
    },
    "event": {
      "type": "object",
      "required": [
        "kind"
      ],
      "properties": {
        "city": {
          "type": [
            "string",
            "null"
          ]
        },
        "kind": {
          "enum": [
            "show",
            "release_party",
            "listening_party"
          ],
          "type": "string"
        },
        "line": {
          "type": [
            "string",
            "null"
          ],
          "description": "One line about it, in the artist's words."
        },
        "title": {
          "type": "string"
        },
        "country": {
          "type": [
            "string",
            "null"
          ],
          "description": "The country's name as Audora's country list writes it (get_requirements has the list), e.g. Sweden."
        },
        "ends_at": {
          "type": [
            "string",
            "null"
          ],
          "description": "ISO date and time, or null."
        },
        "is_public": {
          "type": "boolean",
          "description": "Show it on the artist's public page once posted. Defaults: on for a show, off for a party."
        },
        "starts_at": {
          "type": "string",
          "description": "ISO date and time."
        },
        "time_zone": {
          "type": "string",
          "description": "IANA zone where it happens, e.g. Europe/Stockholm. Needed with starts_at."
        },
        "online_url": {
          "type": [
            "string",
            "null"
          ],
          "description": "https link, for one online."
        },
        "release_id": {
          "type": [
            "string",
            "null"
          ],
          "description": "A party for one of the artist's releases (once it is out)."
        },
        "ticket_url": {
          "type": [
            "string",
            "null"
          ],
          "description": "https link to tickets or info."
        },
        "venue_name": {
          "type": [
            "string",
            "null"
          ]
        }
      }
    },
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "event_id": {
      "type": "string",
      "description": "To change one; leave out to save a new one."
    },
    "idempotency_key": {
      "type": "string",
      "description": "Send the same key if you retry, and the change happens once."
    }
  },
  "additionalProperties": false
}
save_event annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
cancel_event — Cancel a show or party
Advertised by the server during the last successful anonymous check.

Cancel one of the artist's events. Everyone invited or coming is told. Artist connections only.

cancel_event input schema
{
  "type": "object",
  "required": [
    "event_id"
  ],
  "properties": {
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "event_id": {
      "type": "string"
    },
    "idempotency_key": {
      "type": "string",
      "description": "Send the same key if you retry, and the change happens once."
    }
  },
  "additionalProperties": false
}
cancel_event annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
find_my_music — Find the artist's released music
Advertised by the server during the last successful anonymous check.
Advertised read-only

Find which artist on Deezer (and Apple Music) is this artist, to bring their released records in: the confirmed one, or candidates to show the artist. A link to their music (Deezer, Spotify or Apple, artist or record) searches from that instead of the name.

find_my_music input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "link": {
      "type": "string",
      "description": "Optional: a link to the artist's music."
    },
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    }
  },
  "additionalProperties": false
}
find_my_music annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
confirm_my_music — Confirm which music is the artist's
Advertised by the server during the last successful anonymous check.

"That's me": record the candidates the ARTIST said are theirs (a catalog can be split across pages). Only ids find_my_music offered. Ask the artist. Never confirm on a guess.

confirm_my_music input schema
{
  "type": "object",
  "required": [
    "deezer_ids"
  ],
  "properties": {
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "deezer_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "The candidates' ids the artist picked."
    },
    "idempotency_key": {
      "type": "string",
      "description": "Send the same key if you retry, and it happens once."
    }
  },
  "additionalProperties": false
}
confirm_my_music annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
preview_catalog_import — What can come in
Advertised by the server during the last successful anonymous check.
Advertised read-only

The records of the confirmed artist, newest first and 50 a page, with their codes, date and type, matched against the catalog: new, already in the catalog, or in conflict with another account. total says how many there are in all. Also the plan's room for songs and albums.

preview_catalog_import input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "page": {
      "type": "integer",
      "minimum": 0,
      "description": "Optional: which page, 0 the newest (the default)."
    },
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "deezer_album_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Optional: only these records."
    }
  },
  "additionalProperties": false
}
preview_catalog_import annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
import_catalog — Bring the records in
Advertised by the server during the last successful anonymous check.

Start bringing the chosen records into the catalog, within the plan's room. Covers come in only when the artist said they are theirs to use (rights_confirmed: true, their own words, recorded as their consent); otherwise every record comes in with its codes and the cover is left to upload.

import_catalog input schema
{
  "type": "object",
  "required": [
    "items"
  ],
  "properties": {
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "deezer_album_id",
          "include"
        ],
        "properties": {
          "include": {
            "type": "boolean"
          },
          "deezer_album_id": {
            "type": "string"
          }
        }
      }
    },
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "idempotency_key": {
      "type": "string",
      "description": "Send the same key if you retry, and it happens once."
    },
    "rights_confirmed": {
      "type": "boolean",
      "description": "Only true when the artist said the covers are theirs to use."
    }
  },
  "additionalProperties": false
}
import_catalog annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
catalog_import_status — How the import is going
Advertised by the server during the last successful anonymous check.
Advertised read-only

The latest import (or the one named): how many records are in, and each record's outcome.

catalog_import_status input schema
{
  "type": "object",
  "required": [],
  "properties": {
    "artist": {
      "type": "string",
      "description": "Only when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection."
    },
    "job_id": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
catalog_import_status annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (2 of 2 answered).

  1. 2026-11-07: 1 of 1 checks answered
  2. 2026-11-09: 1 of 1 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
1302 ms
95th percentile latency
1302 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 1302 ms · metadata changed · 52 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http audora-mcp https://audora.music/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add audora-mcp --url https://audora.music/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable audora-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "audora-mcp": {
      "url": "https://audora.music/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "audora-mcp": {
      "type": "streamableHttp",
      "url": "https://audora.music/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start audora-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "audora-mcp": {
      "type": "http",
      "url": "https://audora.music/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http audora-mcp https://audora.music/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://audora.music/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "audora-mcp": {
      "serverUrl": "https://audora.music/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Audora MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run Audora MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing