Skip to main content
Glama

midifier

Turns a song into a multi-track General MIDI file. It works out which instruments are playing, transcribes each one, and names and assigns the tracks, so the result can be practised against in kinesthesia.

Available as a REST API and as MCP tools.

Run it

uv sync --extra dev
uv run python -m midifier          # API on :8000, docs at /docs
uv run python -m midifier mcp      # MCP server

No configuration is needed to start; results are written to ./data.

Related MCP server: Claud-Ear

Use it

# start a transcription
curl -F 'file=@song.mp3' http://localhost:8000/v1/jobs
# {"id":"...","state":"queued"}

# poll it
curl http://localhost:8000/v1/jobs/<id>

One job runs at a time, and each takes roughly three times the length of the song, so jobs are polled rather than waited on. While a job waits, GET /v1/jobs/<id> reports queue_ahead and eta_seconds, and GET /v1/queue reports how busy the service is. The estimate is measured from completed jobs rather than configured, so it reflects whatever hardware this runs on.

The OpenAPI schema is at /openapi.json.

Secure it

The service holds only the hash of an API key, so reading the deployed secret does not let anyone call it. Generate a pair:

uv run python -m midifier keygen

Deploy the hash as MIDIFIER_API_KEY_HASH, and give the key to callers. With no hash configured the service is open, which suits local use.

Callers present the key one of three ways, whichever their client makes easiest:

caller

how

REST

X-API-Key: <key>

MCP over HTTP

X-API-Key: <key> or Authorization: Bearer <key>

MCP over stdio

the api_key tool argument

The MCP server is served from the same app at /mcp, so one URL and one key cover both surfaces, and a job started over MCP is visible over REST.

Configure it

Every setting is an environment variable prefixed MIDIFIER_. See .env.example for the full list. The ones that matter:

variable

default

MIDIFIER_API_KEY_HASH

unset

when set, callers must present the key

MIDIFIER_STORAGE_BACKEND

local

local or s3

MIDIFIER_MINIO_BUCKET

with the other MINIO_* values, for s3

MIDIFIER_MODEL_SIZE

large

small, medium or large

MIDIFIER_HF_TOKEN

needed to download the transcription weights

MIDIFIER_MAX_DURATION_SECONDS

360

longest song accepted

MIDIFIER_MAX_CONCURRENT_JOBS

1

transcriptions run at a time

MIDIFIER_SEGMENT_SECONDS

60

length of each decoded segment

MIDIFIER_DECODE_ATTEMPTS

3

tries per segment before a job fails

Develop it

uv run pre-commit run --all-files   # everything CI runs
uv run pytest --cov                 # tests, 80% gate

Conventions and the reasoning behind the pipeline are in AGENTS.md.

Licence

MIT. The transcription weights it downloads are licensed separately and are not redistributed here.

Available Tools

1 tool
transcribe_audioA

Start transcribing a song into a multi-track MIDI file.

Returns a job id to poll with transcription_status. Transcription runs at roughly three times the length of the song, and one job runs at a time.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesPublicly reachable URL of the audio to transcribe.
api_keyNoAPI key. Not needed when the request already carried it as a header.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals that the tool initiates an async job, returns a job ID, and runs with a 3x time multiplier and single-job concurrency. These details go beyond the minimal, though it does not specify what happens when a job is already running (error vs. queue) or authorization requirements beyond the optional API key.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences long, each earning its place: the first states the core function, the second explains the return value and how to use it with a companion tool, and the third provides timing and concurrency constraints. There is no redundant or extraneous information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists and the tool is relatively simple, the description covers the key aspects: purpose, return type, timing, and concurrency. However, it lacks details on error handling when a job is already running and does not mention any input format restrictions. Still, it is fairly complete for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are already well-documented in the schema. The tool description does not add additional meaning to the parameters; it merely mentions 'song' while the schema says 'audio'. Hence, the description adds no extra value beyond the schema, resulting in a baseline score of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states what the tool does: 'Start transcribing a song into a multi-track MIDI file.' This is a specific verb+resource combination. Although it mentions 'song' while the schema says 'audio', the purpose is unambiguous and no sibling tools exist to confuse.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides context on when to use the tool by stating the asynchronous nature ('Returns a job id to poll'), the approximate runtime ('three times the length of the song'), and concurrency limit ('one job runs at a time'). It does not explicitly mention alternatives since no sibling tools exist, but the guidance is clear and useful.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 1 tool updatev0.1.0
    • First observedtranscribe_audio

TDQS

A3.9/5.0
Disambiguation5/5

Only one tool exists, so there is no ambiguity between tools.

Naming Consistency5/5

With a single tool, naming consistency is trivially maintained.

Tool Count2/5

The server has only one tool, which is insufficient for the stated purpose. It references a polling tool that is not provided, making the interface incomplete.

Completeness1/5

The tool only starts a transcription job but provides no way to check status or retrieve results, leaving agents with a dead end. The domain requires at least a status-checking tool.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    An MCP server that enables transcribing local audio files and Telegram voice messages using OpenAI's Whisper via local inference or cloud API. It supports multiple audio formats, automatic language detection, and optional word-level timestamps for AI-powered audio analysis.
    5
    1
    MIT
  • -
    license
    Not graded
    quality
    Not graded
    maintenance
    MCP server for vibe coding with music, enabling format conversion (LilyPond, MusicXML, MIDI, ABC, etc.), audio-to-sheet transcription, and transposition with robust fallback outputs.
    1
    -

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/matheusfillipe/midifier'

If you have feedback or need assistance with the MCP directory API, please join our Discord server