MIDI MCP Server
tubone24/midi-mcp-server · 54 stars · TypeScript · MIT
MCP server MIDI MCP Server is a Model Context Protocol (MCP) server that enables AI models to generate MIDI files from text-based music data. This tool allows for programmatic creation of musical compositions through a standardized interface.
Install
The repo has no one-line install. Follow its README.
Files
MIDI MCP Server
A Model Context Protocol (MCP) server for AI-driven MIDI composition. Generate MIDI files from structured JSON data, with chord name support, an interactive piano-roll preview UI, and multiple deployment modes.
Looking for the Agent Skills approach? It composes better songs with less context: tubone24/midi-agent-skill
Features
- Two MCP tools:
create_midi(with interactive preview UI) andparse_chord - Rich pitch input: MIDI numbers, note name strings (
"C4"), pitch arrays, or chord names ("Cmaj7") - Chord library: 25+ chord qualities — major, minor, dim, aug, 7th, maj7, m7, sus2, sus4, power, and more
- Flexible durations: numeric beats, standard strings (
'4','8'), dotted ('d4'), triplet ('T8') - Music theory resources: 7 built-in reference documents accessible as MCP resources
- Three transport modes: stdio, HTTP, or Cloudflare Workers (remote)
- MCP App UI: Piano-roll visualization and audio playback rendered directly in the conversation
Deployment Options
Option A — Remote (Cloudflare Workers)
A pre-deployed remote server is available:
https://midi-mcp-server.tubone24.workers.dev/mcp
Add it to any MCP client that supports Streamable HTTP (e.g., Claude.ai):
{
"mcpServers": {
"midi": {
"type": "http",
"url": "https://midi-mcp-server.tubone24.workers.dev/mcp"
}
}
}
Option B — Local stdio (recommended for desktop clients)
Build and configure as a local stdio server:
npm install npm run build
{
"mcpServers": {
"musicComposer": {
"command": "node",
"args": ["/path/to/midi-mcp-server/build/index.js"]
}
}
}
Option C — Local HTTP
Run as a local Streamable HTTP server:
node build/index.js --http # or with a custom port: node build/index.js --http --port=8080
The server exposes:
POST /mcp— MCP Streamable HTTP endpointGET /health— Health check ({"status":"ok","version":"0.2.0"})
Tools
create_midi
Generate a MIDI file from structured composition data. Returns base64-encoded MIDI and renders an interactive piano-roll preview with audio playback in supported MCP clients (MCP App).
Input
| Field | Type | Required | Description |
|---|---|---|---|
title |
string |
✓ | Title of the composition |
composition |
object |
✓ | Composition data (see schema below) |
Output (structured content)
| Field | Type | Description |
|---|---|---|
midiBase64 |
string |
Base64-encoded MIDI file data |
title |
string |
Composition title |
bpm |
number |
Tempo used |
trackCount |
number |
Number of tracks generated |
parse_chord
Parse a chord name and return its component MIDI pitches and note names. Useful for understanding voicings before composing.
Input
| Field | Type | Required | Description |
|---|---|---|---|
chord |
string |
✓ | Chord name, e.g. "Cmaj7", "F#m7", "G7sus4" |
octave |
number |
— | Root octave (default: 4) |
Output example
{
"chord": "Cmaj7",
"octave": 4,
"midiNumbers": [60, 64, 67, 71],
"noteNames": ["C4", "E4", "G4", "B4"]
}
Composition Schema
{
"bpm": 120, // tempo (also accepted: "tempo")
"timeSignature": { "numerator": 4, "denominator": 4 }, // optional, default 4/4
"tracks": [
{
"name": "Piano", // optional
"instrument": 0, // GM program number 0–127 (optional)
"notes": [
{
"pitch": 60, // MIDI number, note name "C4", or array [60, 64, 67]
"chord": "Cmaj7", // OR use chord name (overrides pitch)
"beat": 1, // beat position (1-based); OR use startTime
"startTime": 0, // tick offset (alias: "time")
"duration": "4", // see Duration Reference below
"velocity": 100, // 0–127 (optional, default 100)
"channel": 0 // MIDI channel 0–15 (optional)
}
]
}
]
}
Pitch Input Formats
| Format | Example | Description |
|---|---|---|
| MIDI number | 60 |
Standard MIDI note number (0–127) |
| Note name | "C4" |
Letter + optional accidental + octave |
| Pitch array | [60, 64, 67] |
Multiple pitches played simultaneously |
| Chord field | chord: "Cmaj7" |
Chord name expanded automatically |
Supported accidentals: # (sharp), b (flat). Examples: "F#5", "Bb3".
Duration Reference
| Value | Description |
|---|---|
'1' |
Whole note |
'2' |
Half note |
'4' |
Quarter note |
'8' |
Eighth note |
'16' |
Sixteenth note |
'32' |
Thirty-second note |
'd1' 'd2' 'd4' 'd8' 'd16' |
Dotted variants |
'dd4' |
Double-dotted quarter |
'T4' 'T8' … |
Triplet variants |
4 (number) |
Beat-based: 1=quarter, 2=half, 4=whole, 0.5=eighth |
Supported Chord Qualities
| Quality | Example | Description |
|---|---|---|
(none) / maj |
C, Cmaj |
Major |
m / min |
Dm |
Minor |
dim |
Bdim |
Diminished |
aug |
Eaug |
Augmented |
7 |
G7 |
Dominant 7th |
maj7 / M7 |
Cmaj7 |
Major 7th |
m7 / min7 |
Am7 |
Minor 7th |
dim7 |
Bdim7 |
Diminished 7th |
m7b5 |
Bm7b5 |
Half-diminished |
aug7 |
Eaug7 |
Augmented 7th |
6 / m6 |
C6, Am6 |
6th |
9 / maj9 / m9 |
G9 |
9th variants |
add9 |
Cadd9 |
Add 9th |
11 / 13 |
C11 |
Extended |
sus2 / sus4 |
Gsus4 |
Suspended |
7sus4 / 7sus2 |
G7sus4 |
7th suspended |
power / 5 |
G5 |
Power chord |
MCP Resources
The server exposes 7 music theory reference documents as MCP resources:
| URI | Description |
|---|---|
music-theory://harmony |
Intervals, chord types, diatonic chords, cadences, voice leading |
music-theory://chord-progressions |
Common progressions by mood/genre, substitutions, modulation |
music-theory://counterpoint |
Species counterpoint rules, consonance/dissonance, motion types |
music-theory://modes-scales |
Diatonic modes, minor scale variants, pentatonic/blues, genre guide |
music-theory://orchestration |
Instrument ranges, GM program numbers, texture types |
music-theory://rhythm-patterns |
Time signatures, MIDI duration reference, genre grooves |
music-theory://voice-leading |
Forbidden parallels, voicing strategies, non-chord tones |
MCP clients that support resource reading can pass these to the AI as context, enabling theory-aware composition.
Example Composition
const composition = {
bpm: 120,
timeSignature: { numerator: 4, denominator: 4 },
tracks: [
{
name: "Piano",
instrument: 0,
notes: [
{ chord: "Cmaj7", beat: 1, duration: "2", velocity: 90 },
{ chord: "Am7", beat: 3, duration: "2", velocity: 90 },
{ chord: "Fmaj7", beat: 5, duration: "2", velocity: 90 },
{ chord: "G7", beat: 7, duration: "2", velocity: 90 }
]
},
{
name: "Melody",
instrument: 0,
notes: [
{ pitch: "E4", beat: 1, duration: "4", velocity: 100 },
{ pitch: "G4", beat: 2, duration: "4", velocity: 100 },
{ pitch: "A4", beat: 3, duration: "2", velocity: 110 }
]
}
]
};
Demo
The prompt below generates an 8-bar melodic minor choral piece:
Create an 8-bar choral piece in a slightly minor, melodic scale.
2.mp4
Build & Development
npm install # Full build (UI + server) npm run build # Build steps individually npm run build:ui # Vite — builds the MCP App preview HTML npm run build:server # tsc — compiles TypeScript server # Deploy to Cloudflare Workers npm run deploy # Run tests npm test npm run test:coverage
Dependencies
| Package | Purpose |
|---|---|
@modelcontextprotocol/sdk |
MCP server implementation (stdio & HTTP transports) |
@modelcontextprotocol/ext-apps |
MCP Apps extension — interactive UI in conversation |
midi-writer-js |
MIDI file generation |
@tonejs/midi |
MIDI parsing (preview UI) |
soundfont-player |
Audio playback in preview UI |
zod |
Input schema validation |
Facts
- Kind
- MCP server
- Group
- Uncategorized
- Stars
- 54
- License
- MIT
- Language
- TypeScript
- Last push
- 2026-04-12
- Forks
- 11
- 1REAio.github.morluto/reaReverse engineer anything from your terminal or agent with one CLI and MCP server.125.3k
- 2com.browser-use/browser-usecom.browser-use/browser-useControl a real Chrome browser to complete any task: fill forms, extract data, book flights.117.7k
- 3World Monitorapp.worldmonitor/mcpLive markets, conflicts, country risk, chokepoints, energy, and China decision signals. 93 tools.88.3k
- 4Scrapling MCP Serverd4vinci/scrapling🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl! Don't be shy, join here: https://discord.gg/EMgGbDceNQ and follow here for daily tips and tricks: https://x.com/Scraplingdev86.9k
- 5Everythingmodelcontextprotocol/serversThis MCP server attempts to exercise all the features of the MCP protocol. It is not intended to be a useful server, but rather a test server for builders of MCP clients. It implements prompts, tools, resources, sampling, and more to showcase MCP capabilities.85.8k
- 6Fetchmodelcontextprotocol/serversA Model Context Protocol server that provides web content fetching capabilities. This server enables LLMs to retrieve and process content from web pages, converting HTML to markdown for easier consumption.85.8k

