vibe-mcp
An MCP server that reads the code you are working on and generates music to match — the genre comes from the programming language, and the mood partly from the code’s binary representation.

What it is
An MCP server that turns the code in front of you into music. It exposes three tools — start a session, generate more as the current track runs out, stop — analyses the code snippet it is handed, and asks a music-generation API for a track matching what it found. Playback happens on the server, not in the editor, with a two-second crossfade between tracks so the music does not stop while the next piece is being generated.
Who built itA Seattle-based AI consultant who describes his work as helping clients automate with AI and lists Vaib Studio, an AI consultancy, as his company; its portfolio includes a Cline product-leadership case study. He has been on GitHub since 2012 and has fifty-seven public repositories, a large share of them forks of other people’s work.
Build log
6 stages- 01
Three tools, and playback on the wrong side of the wire
The server exposes `start_vibe_session`, `generate_more_music` and `stop_vibe_session`, all of which take the current coding context as a required argument. The unusual choice is where the music comes out: playback runs on the MCP server itself, through the `speaker` package, rather than being handed back to the editor. That is what makes the crossfade possible — `playback.ts` holds two player slots and fades one out over two seconds in fifty-millisecond steps while the other fades in, so asking for the next track early is seamless instead of a gap. FFmpeg is a hard requirement, pulled in through `fluent-ffmpeg`, and the README lists an install command for each of the three platforms.
- 02
How code becomes a music prompt
`buildPrompt()` truncates the snippet to 1,200 characters and derives the musical parameters from it with keyword heuristics, then pastes the raw code into the prompt under a `CODE CONTEXT:` heading. Genre comes from the detected language, and the table is the most legible thing in the repository: JavaScript is lo-fi house, chillhop and trip hop; TypeScript is synthwave and ambient techno; Python is ambient and downtempo; Java is orchestral and cinematic; Ruby is jazz and bossa nova; Go is minimal techno; Rust is industrial and dark ambient; PHP is vaporwave and future funk; SQL is acid jazz and broken beat; and shell scripts are breakbeat, drum and bass and jungle. Language detection is fourteen regular expressions, tempered by the file extension. Tempo comes from an `analyzeComplexity()` score bucketed into five ranges — 60–80 BPM for the simplest code up to 140–160 for the most complex — and then a random offset is added inside the chosen range.
- 03
The mood is read out of the binary
The best detail is `analyzeCodeBinaryForMood()`, which converts the source to a string of bits and reads moods off that. The ratio of ones to zeros above 0.6 yields “dense” and “intense”, below 0.4 yields “sparse” and “minimal”, and anything between yields “balanced”. It then counts occurrences of the literal bit pattern `0101` and adds “rhythmic” and “patterned” if it appears more often than a threshold the source itself annotates as `// Arbitrary threshold`. Finally it walks the bits in chunks to measure how fast the density of ones changes, under a heading the author put in scare quotes: a “Differential Equation” simulation. The function’s own docblock describes it as a conceptual example.
- 04
The instruction file left in the repository
The repository carries a `.clinerules/` directory — the per-project instruction file Cline reads — containing a single short document called `No test.md`. In full: “Please don’t test without me asking you to. Do not run the application. Always use the MCP instead. NEVER RUN node dist/index.js!!!!!” It is four lines of the author telling his coding agent what not to do, and it is the most direct evidence in the repository of how the project was built. The rule is also slightly out of step with the build script, which emits to `build/`, not `dist/`.
- 05
What the numbers look like
Nine commits across five days, from 27 April to 2 May 2025, and nothing since. One author, no releases, no tags, and no issues or pull requests ever opened. Twelve stars and four forks. The README ends with a `## License` heading and the single word “MIT”, but the repository contains no licence file, so GitHub reports no licence for it. The `package.json` marks the package `private`, pins the MCP SDK at `0.7.0` — an exact pre-1.0 version rather than a range — and lists `speaker` and `fluent-ffmpeg` alongside `axios` and `dotenv`. Running it needs at least one paid key, from Stability AI or PiAPI, and the generator chosen depends on which one you have.
- 06
The homepage field points somewhere else
The repository’s homepage field is set to `cline.bot`, which is the site of the editor the server plugs into rather than anything belonging to this project. Along with the `cline` and `mcp` topics and the `.clinerules` directory, it places the project squarely inside the Cline ecosystem. There is no separate demo, and the last commit added the `language` parameter to the tool schemas, which is what lets the model report the language rather than leaving it to be guessed from the code.
Adjacent records
All records →No. 038
VibeRave
A fork of Strudel that lets you hold a key, say a genre out loud, and have the music change on the next bar without the beat ever stopping.
No. 034
N.O.R.A.Core
A single-author AI companion with two brains, an encrypted diary of its own, and 98 commits signed in its own name.
No. 033
AudioNoise
Linus Torvalds learning digital audio DSP by writing guitar effects — with the Python visualiser vibe-coded.