Skip to content

MCP server

LyricWinter MCP tools reference

Every tool exposed by the LyricWinter Studio MCP server, with inputs, required scopes, side effects, and the recommended agent workflow.

BetaUpdated

The LyricWinter MCP server exposes 22 tools. Read-only Studio tools need the studio:read scope; tools that create or change Studio content need studio:write. Voice tools need voices:read or voices:write. Every tool calls the LyricWinter REST API as the connected user.

In ChatGPT, Claude, and other chat apps#

Chat apps that support interactive MCP Apps show a story player and a voice panel inside the conversation. The server tells the model to call create_audio_story once with the full story text: the player shows casting and generation progress, then plays the finished audio with the script. Use play_story to reopen a story, share_story for a public link, find_voices with recast_character to change a character's voice, and add_my_voice when the user wants their own voice. Listing tools and loading the widgets works before an account is linked; every tool that reads or changes an account asks the user to connect LyricWinter.

For advanced work on existing Studio projects, use list_projects and list_project_sections to find IDs, read documents before changing them or generating audio, treat workflow starts as asynchronous and call get_workflow until they finish, and never repeat a paid audio start unless the user wants another run.

A typical session:

  1. list_projects to find the project, or create_story to start a new one.
  2. get_document to read the script and its versions.
  3. start_audio_workflow after the user confirms which sections to generate.
  4. get_workflow until the run reaches completed, partially_completed, failed, or cancelled.
  5. get_section_media or get_playback_manifest to return playable audio.

Tool summary#

ToolPurposeScopeSide effects
profileIdentify the connected accountstudio:readNone
create_audio_storyTurn story text into fully cast audio with a playerstudio:writeCreates content, consumes words
play_storyOpen the player for an existing storystudio:writePrepares an MP3 mix
share_storyCreate a public listening linkstudio:writePublishes the story
find_voicesSearch the voice library or the user's voicesnone, or voices:readNone
recast_characterChange a character's voice and regenerate their linesstudio:write, voices:readChanges casting, consumes words
add_my_voiceOpen the voice panel to add the user's own voicevoices:writeNone until the user uploads
get_story_statePlayer only: refresh progress and the audio URLstudio:writePrepares an MP3 mix
upload_voice_sampleVoice panel only: create a private voice from a samplevoices:writeCreates a voice
get_voice_statusVoice panel only: check voice processingvoices:readNone
list_projectsList projects and standalone storiesstudio:readNone
list_project_sectionsList a project's sections in orderstudio:readNone
get_documentRead a section's documentstudio:readNone
list_project_speakersList a project's speakersstudio:readNone
create_storyCreate a standalone storystudio:writeCreates content
create_sectionAdd a section to a projectstudio:writeCreates content
prepare_sectionsStructure sections into a scriptstudio:writeChanges documents
start_audio_workflowGenerate audiostudio:writeConsumes words
get_workflowCheck workflow progressstudio:readNone
cancel_workflowCancel a running workflowstudio:writeStops work
get_section_mediaGet per-block audio for a sectionstudio:readNone
get_playback_manifestGet the compiled playback timelinestudio:readNone

Results and errors#

The chat-app tools (create_audio_story, play_story, share_story, find_voices, recast_character, add_my_voice) return a short summary for the model as structuredContent; the full script, line timings, and signed audio URL go only to the player in _meta. The other tools return the REST API's JSON response, including data and request_id. Tools that accept a mutation_id wrap it as { "result": ..., "mutation_id": "..." } so the agent can retry the same change. A failed tool sets isError and returns the API error, plus the mutation_id when there is one. If LyricWinter could not confirm whether a write happened, the error says "No result was confirmed"; retry with the same mutation_id.

Account#

profile#

Identifies the connected LyricWinter account. Returns id, name, and email as structured content. Takes no input.

Projects and sections#

list_projects#

Lists the user's Studio projects and standalone stories with their IDs. Takes no input. Calls GET /studio/projects.

list_project_sections#

Lists the sections of one project in order, including each section's ID and the project's section_order_version. Calls GET /studio/projects/{projectId}/sections.

InputTypeRequiredDescription
project_idUUIDYesThe project to list.

create_story#

Creates a standalone Studio story from text. Calls POST /studio/sections.

InputTypeRequiredDescription
titlestring, 1–500 charactersYesStory title.
raw_textstring, 1–100,000 charactersYesThe story text.
mutation_idUUIDNoReuse only when retrying the exact same creation. Generated if omitted.

create_section#

Adds a section to an existing project. Read the project's sections first to get its current section_order_version. Calls POST /studio/projects/{projectId}/sections.

InputTypeRequiredDescription
project_idUUIDYesThe project to add to.
base_section_order_versioninteger or nullYesThe section_order_version from list_project_sections.
titlestring, 1–500 charactersYesSection title.
raw_textstring, 1–100,000 charactersYesThe section text.
mutation_idUUIDNoReuse only when retrying the exact same creation.

Documents and speakers#

get_document#

Reads a section's current document: its version, blocks, speakers, and edit targets. Agents should read the document before generating audio. Calls GET /studio/sections/{sectionId}/document.

InputTypeRequiredDescription
section_idUUIDYesThe section to read.

list_project_speakers#

Lists the speakers used in a project and their casting status. Calls GET /studio/projects/{projectId}/speakers.

InputTypeRequiredDescription
project_idUUIDYesThe project to inspect.

Workflows#

prepare_sections#

Starts an asynchronous workflow that structures sections into narration and dialogue without generating audio. Poll get_workflow for completion. Calls POST /studio/projects/{projectId}/workflows with workflow_kind: "prepare_sections".

InputTypeRequiredDescription
project_idUUIDYesThe project that owns the sections.
section_idsarray of UUIDs, 1–100YesSections to prepare.
mutation_idUUIDNoReuse only when retrying the same request.

start_audio_workflow#

Starts the paid, asynchronous Create Audio workflow for selected sections. It prepares text, casts voices, directs performances, adds sound effects, and generates audio. Confirm the scope and cost with the user first, then poll get_workflow. Calls POST /studio/projects/{projectId}/workflows with workflow_kind: "create_audio".

InputTypeRequiredDescription
project_idUUIDYesThe project that owns the sections.
section_idsarray of UUIDs, 1–12YesSections to generate.
include_generated_sfxbooleanNoAdd AI-generated sound effects. Defaults to true.
place_project_soundsbooleanNoPlace sounds linked to the project. Defaults to true.
mutation_idUUIDNoReuse only when retrying the same run. A new ID starts a new, separately billed run.

get_workflow#

Returns a workflow's status, current stage, step progress, warnings, and errors. Calls GET /studio/workflows/{workflowRunId}.

InputTypeRequiredDescription
workflow_idUUIDYesThe run.id returned when the workflow started.

cancel_workflow#

Requests cancellation of a running workflow. Agents should ask the user before cancelling. Calls POST /studio/workflows/{workflowRunId}/cancel.

InputTypeRequiredDescription
workflow_idUUIDYesThe workflow to cancel.

Media and playback#

get_section_media#

Returns the generated audio state of every block in a section, with short-lived signed playback URLs. Calls GET /studio/sections/{sectionId}/media.

InputTypeRequiredDescription
section_idUUIDYesThe section to inspect.

get_playback_manifest#

Returns the compiled playback timeline for a section. Pass the versions returned by get_document. Calls GET /studio/sections/{sectionId}/playback-manifest.

InputTypeRequiredDescription
section_idUUIDYesThe section to play.
document_versionintegerYesdocument.document_version from get_document.
speaker_registry_versionintegerYesdocument.speaker_registry_version from get_document.

Listening in chat apps#

create_audio_story#

Turns a story, fanfic, script, or chapter into fully cast audio. Creates a standalone story (POST /studio/sections) and starts Create audio, which detects characters, casts voices, directs the performances, and adds sound. Returns the story player, which tracks progress on its own. Uses words from the user's balance.

InputTypeRequiredDescription
story_textstring, 1–100,000 charactersYesThe complete story text.
titlestring, 1–200 charactersNoStory title. Derived from the first line if omitted.
sound_effectsbooleanNoAdd ambient sound and sound effects. Defaults to true.

play_story#

Opens the player for a story the user already made. Prepares an MP3 mix of the current audio when needed.

InputTypeRequiredDescription
section_idUUIDNoThe story to open. Defaults to the user's most recent story.

share_story#

Publishes a story and returns its public listening link. Anyone with the link can listen and read the script. Calls POST /studio/sections/{sectionId}/share.

InputTypeRequiredDescription
section_idUUIDYesThe story to share.

Voices#

find_voices#

Searches LyricWinter's public voice library, or the user's own voices, and returns voice IDs for recast_character. Library search works without a linked account.

InputTypeRequiredDescription
querystring, up to 200 charactersNoWords describing the voice, or a voice name.
minebooleanNoSearch only the user's voices. Requires a linked account.

recast_character#

Changes a character's voice with Studio's preferred engine for that voice, then regenerates the character's lines unless told not to.

InputTypeRequiredDescription
section_idUUIDYesThe story.
characterstringYesThe character's name as shown in the cast.
voice_idUUIDYesA voice from find_voices.
regenerate_audiobooleanNoRegenerate the changed lines. Defaults to true.

add_my_voice#

Opens the voice panel, where the user records or uploads a 10–30 second sample of their own voice and confirms they have permission to use it. The new voice is private.

InputTypeRequiredDescription
voice_namestring, 1–80 charactersNoSuggested name for the voice.

Player and voice panel#

These tools are called by the widgets and hidden from the model.

get_story_state#

Refreshes a story's progress, cast, script timings, and signed audio URL.

InputTypeRequiredDescription
section_idUUIDYesThe story.
workflow_idUUID or nullNoThe Create audio run to track.

upload_voice_sample#

Creates a private voice from the user's sample through the same upload flow as LyricWinter's apps.

InputTypeRequiredDescription
namestring, 1–80 charactersYesVoice name.
mime_typestringYesThe sample's audio type, such as audio/webm.
data_base64stringYesThe sample, base64-encoded, up to 2.5 MB.
permission_confirmedtrueYesThe user confirmed they have permission to use this voice.

get_voice_status#

Checks whether a new voice has finished processing.

InputTypeRequiredDescription
voice_idUUIDYesThe voice to check.