MCP App Store
by KeenEthics

Overview

Generate and edit sound effects, foley, and ambience from text or video. Extend existing audio and replace selected audio regions. Convert existing recordings into MIDI and notation with Audio-to-MIDI transcription. Uses your Mirelo account and credits.

Tools

audio_to_midi

ChatGPT
Convert a musician's recording into editable MIDI and MusicXML. Default timing preserves the performance; set timing to quantized only when the musician asks to snap notes to the beat. Set score_pdfs for engraved sheet music and optional tablature. This is a paid asynchronous job: use preflight after inspect_asset, then wait_job or get_job. Pass idempotency_key when retrying the same request.

create_asset

ChatGPT
Inline upload, kept for small files only: the bytes have to be emitted into this conversation, so it is capped at ~96 KB decoded. Use create_upload for external media of any real size. The returned asset_id can go straight to a generate or edit tool as { "type": "asset", "id": asset_id }; video_to_sfx measures the clip itself, so duration_ms can be omitted.

create_upload

ChatGPT
Preferred way to send external media. Returns a pre-signed storage URL so the bytes go straight from disk to storage without passing through this conversation — run the returned upload command in a shell, then pass the asset straight to a generate or edit tool as { "type": "asset", "id": asset_id }: video_to_sfx measures the clip itself so you can omit duration_ms, and extend_audio reads the source for you. inspect_asset is optional and only worth a call when you want the metadata before committing credits. Download remote media to a local file before using this tool; hosted MCP accepts a url input only for a file url from one of your own jobs. Two commands come back, one per shell family: run curl_command in a POSIX shell (bash, zsh, Git Bash, or pwsh on macOS/Linux) or windows_powershell_command in Windows PowerShell. They quote differently and the wrong one will not work, so pick by the shell you are about to run and paste it as given rather than rewriting it — it already sets the Content-Type the URL was signed for, and a PUT that sends a different one (or none) is rejected outright. Files up to max_size_bytes work on this path. The URL stops working after expires_in seconds, so upload right away and call create_upload again if it lapses. If the PUT fails with a proxy error, your shell has no outbound network — that is a client setting, not a Mirelo error, and retrying will not help. Either ask the user to allow outbound requests to the upload host and start a NEW conversation (the setting does not apply to the current one), or ask them to upload the file at https://mirelo.ai/studio/mcp-upload and paste back the asset_id it shows. Falling back to create_asset only works for files of a few KB.

extend_audio

ChatGPT
Continues audio past where it stops, optionally following a video. You never need to measure the input audio: append_duration_ms is how much new audio to add, and the server reads the source itself. Pass external media as { "type": "asset", "id": ... } with an asset_id from create_upload. { "type": "url", "url": ... } is reserved for a file url from a prior job. Chaining: a prior job's file url (a variant's files.audio.url or files.video.url) that is a Mirelo download link (its path starts with /dl/) can go straight back as { "type": "url", "url": ... }. Any other result url is not accepted as input: download it and stage it with create_upload. Inline base64 on create_asset is a poor fit for audio: uncompressed WAV at the shortest length these tools accept is already well over the inline limit. A short, heavily compressed clip can fit, but use create_upload rather than shrinking audio to clear the limit, since the waveform is what the model conditions on. Returns the job (id, status, model); use wait_job (or get_job) with its id until it is final. Pass idempotency_key on retries to avoid a second paid job.

get_account

ChatGPT
Get the authenticated Mirelo account’s available credits, shortfall for a minimum billable request, and provisioning state/deadline.

get_job

ChatGPT
Poll a job by the id text_to_sfx / video_to_sfx / extend_audio / inpaint_audio / audio_to_midi returned (job_id for audio_to_midi). Prefer this when the client can drive its own poll loop. A sound job is final at succeeded, partially_succeeded, failed, canceled or expired; its files are each variant's files.audio or files.video under result, and each file says when its url stops working (url_expires_at). Check each variant's status before reading its files. A Mirelo download link (its path starts with /dl/) can be passed straight back as an input url to extend_audio / inpaint_audio / video_to_sfx; download any other and stage it with create_upload. An audio_to_midi job is final at succeeded or errored, with its artifact links under result.

get_transcription_notes

ChatGPT
Read completed Audio-to-MIDI note data in pages. Use this only when note-level data is needed for MIDI visualizations or editing; job results intentionally return a compact summary instead.

inpaint_audio

ChatGPT
Replaces a section inside audio, optionally following a video. The result is the whole file with that section replaced. Pass external media as { "type": "asset", "id": ... } with an asset_id from create_upload. { "type": "url", "url": ... } is reserved for a file url from a prior job. Chaining: a prior job's file url (a variant's files.audio.url or files.video.url) that is a Mirelo download link (its path starts with /dl/) can go straight back as { "type": "url", "url": ... }. Any other result url is not accepted as input: download it and stage it with create_upload. Inline base64 on create_asset is a poor fit for audio: uncompressed WAV at the shortest length these tools accept is already well over the inline limit. A short, heavily compressed clip can fit, but use create_upload rather than shrinking audio to clear the limit, since the waveform is what the model conditions on. Returns the job (id, status, model); use wait_job (or get_job) with its id until it is final. Pass idempotency_key on retries to avoid a second paid job.

inspect_asset

ChatGPT
Read what an uploaded asset actually contains: duration_ms, content_type, size_bytes, plus width and height for video. Optional before generating — video_to_sfx measures an uploaded clip itself, and extend_audio reads its source — so call it when you want to confirm the create_upload PUT landed, or to see the duration and dimensions before committing credits. Each call spends one ffprobe pass, so do not call it as a routine step before every job. A not-found error means the PUT has not completed. A null duration_ms means we could not read one: usually the file is not decodable media, so re-check it before retrying, and supply duration_ms yourself if you know it.

list_models

ChatGPT
List the models this account can use, as GET /v3/models lists them: each one's operations with their duration and variant limits, the controls and output media they take, and its prompt limits. default_model is the model text_to_sfx and video_to_sfx run when model is omitted; the edit tools run the first model that serves them. Call it before naming a model or choosing a duration you are unsure of.

preflight

ChatGPT
Quote a generation before running it: exact credits, latency, and whether the account can fund it. operation names the tool (text-to-sfx, video-to-sfx, extend, inpaint) and request is the body you would send it, refused exactly as the tool would refuse it; a generation quote names the model it is for. For video-to-sfx pass duration_ms here even when the tool would measure the clip; read it from inspect_asset. For audio-to-midi pass duration_ms from inspect_asset instead of a request. Call a generation tool only when credit_recovery shows provisioning_state "ready" and a credit_shortfall of 0; while it is "pending", wait until provisioning_deadline. An answer without credit_recovery is not metered and always affordable.

text_to_sfx

ChatGPT
Generates sound effects, foley and ambience from a text prompt. Music is not available through this MCP server. text_to_sfx is not a substitute for music generation, and sound-effect generation consumes account credits. Mirelo does generate music in Studio and its editor plugins. Audio-to-MIDI transcription is available separately for converting an existing recording into MIDI and notation. The prompt is what the sound is generated from. Use it to add one specific sound to an edit that already has its sound. Returns the job (id, status, model); use wait_job (or get_job) with its id until it is final. Pass idempotency_key on retries to avoid a second paid job.

video_to_sfx

ChatGPT
Generates sound effects, foley and ambience conditioned on a video. This tool does not generate music. Omit prompt unless the user asked for something specific: the model already conditions on the video, so a prompt written by describing the footage competes with what it can see, and a wrong guess steers away from it. Pass prompt only to carry an explicit user instruction — a mood, or a restriction to particular sounds. Do not analyse the video in order to author one. Pass external media as { "type": "asset", "id": ... } with an asset_id from create_upload. { "type": "url", "url": ... } is reserved for a file url from a prior job. You do not need to measure the video for duration_ms. On this tool you can omit it when input.video is an asset: the server measures the uploaded file and scores the rest of the clip from start_offset_ms. Pass duration_ms whenever you want a shorter window than that, since the window is what you are billed for. With a url (a chained result) you must pass duration_ms, because a remote length comes from the container header, which some formats do not carry. inspect_asset reports the same measurement up front if you want it before committing credits, but you do not have to call it first. Chaining: a prior job's file url (a variant's files.audio.url or files.video.url) that is a Mirelo download link (its path starts with /dl/) can go straight back as { "type": "url", "url": ... }. Any other result url is not accepted as input: download it and stage it with create_upload. A variant is files.video when its file is the clip with the new sound on it, files.audio otherwise. Asking for output.media "video" does not guarantee video, so pass a result on as a video only when it is under files.video. If you cannot play or process media files yourself, request output.media "video" so the result is the clip with its new sound. Returns the job (id, status, model); use wait_job (or get_job) with its id until it is final. Pass idempotency_key on retries to avoid a second paid job.

wait_job

ChatGPT
Block until a job from text_to_sfx / video_to_sfx / extend_audio / inpaint_audio / audio_to_midi is final, or the wait times out. Prefer get_job when the client can poll itself. Min poll_interval_ms is 500; Convex mcpPoll rate limits apply. Modern Streamable HTTP clients can cancel an in-flight wait. Legacy stateless clients cannot reliably reach an already-running request after disconnecting; prefer get_job and drive polling from the client when cancellation matters. A sound job is final at succeeded, partially_succeeded, failed, canceled or expired; its files are each variant's files.audio or files.video under result, and each file says when its url stops working (url_expires_at). Check each variant's status before reading its files. A Mirelo download link (its path starts with /dl/) can be passed straight back as an input url to extend_audio / inpaint_audio / video_to_sfx; download any other and stage it with create_upload. An audio_to_midi job is final at succeeded or errored, with its artifact links under result.

Capabilities

Writes

Similar Apps