Vibe with your AI
Let your agent
build the visuals.
Vibresia comes with a small local server that AI assistants can talk to. Point an agent at it and it can write a vibescape, check that it compiles, look at what it drew and try again — without you copying a line of code back and forth.
Or use the web version
If your agent runs in a browser — ChatGPT, Claude on the web, anything that talks to a remote server — there is one here too, and it needs nothing installed:
https://vibresia.com/mcpAdd it as a custom connector. It can write a vibescape and hand you a link, and that link plays in any browser — the picture is drawn live on the page, so it works for whoever you send it to, with or without the app. It is a slightly smaller server than the local one: it cannot draw, so it cannot show you a preview or check that a shader compiles, and it cannot see the music playing on your Mac.
Set it up
It works with any assistant that speaks MCP. Pick yours below.
In the app, View All → + Custom Vibescape → Vibe with your AI of choice shows this same setup with the path filled in for the copy of Vibresia on your Mac, so you don't have to work out where it went.
The one thing to know
Vibresia is the server. It needs the app on your Mac, so if you moved it, use where it actually is — usually /Applications/Vibresia.app.
Connect to this mcp: vibresia -- "/Applications/Vibresia.app/Contents/MacOS/Vibresia" --mcpThat's the whole thing: a name, the program to run, and the argument to run it with. Every client below wants the same three, just spelled its own way.
Per assistant
| Assistant | How to add it |
|---|---|
| Claude Code | claude mcp add vibresia -- "/Applications/Vibresia.app/Contents/MacOS/Vibresia" --mcpOr put the same thing in .mcp.json in your project. |
| Claude Desktop | Settings → Developer → Edit Config, and add: |
| Cursor | Cursor → Settings → MCP & Integrations → Add Server, or the same JSON in .cursor/mcp.json. |
| Windsurf | Windsurf → Settings → Cascade → MCP Servers, and add the same JSON. |
| Zed | Add to ~/.config/zed/settings.json: |
| VS Code | Add to .vscode/mcp.json in your project: |
| Continue | Continue → Config → Add a model → Use an MCP server, with the same JSON. |
| Aider | Add to ~/.aider.conf.yml: |
| Gemini CLI | Add to ~/.gemini/settings.json: |
| Anything else | Any client that launches a local program over stdio will do. Give it the path to the binary, with --mcp as its argument. |
What the agent can do
React to the person
A vibescape can react to the person as well as to the music: the pointer, the keyboard and a MIDI keyboard are all uniforms, and the agent can set them by hand to see what happens. The app's own shortcuts still work while it does.
Make it obviously move
It is told to make a vibescape clearly and strongly animated to the music — big changes in shape, scale, flow or colour, not a faint pulse — unless you ask for something subtle. That default lives in one shared style, so it is the same whether the agent is talking to the app or to this website.
See it
It draws a vibescape and gets the picture back, so it can look at what it wrote instead of imagining it. Ask for several frames and it gets the animation, too — a still tunnel and a scrolling tunnel look identical, and one of them is wrong.
Point the music anywhere
It sets the audio uniforms by hand — bass at 0.9, treble at 0.2 — and draws it again, so it can find out how a vibescape behaves when the music isn't playing. No audio required.
Tune to reality
It can read the actual uniform values the app is drawing with right now, and the ranges they run in, so it picks coefficients that work on your music instead of guesses that do nothing.
Hear what you hear
Ask what Vibresia is hearing at that moment — the genre, the instruments, the tempo, the levels, the shape of the spectrum — and write something that suits the track in front of you.
Know the genre
Vibresia works out what is playing: from the song's own catalogue entry when the music app says what it is playing, and from the sound when it cannot. The band vibescape's stage is chosen from it, and every vibescape can read it as uGenre — so a world can change shape with the music in a way the bass alone cannot manage.
Get the colours right
It can read the current palette and see how hard the app tints over what a vibescape draws, so it stops picking colours that come out as something else.
Check before saving
Nothing is saved unless it compiles, and code that doesn't work comes back as an error in words with the line number — not a blank picture.
Save, and compare
Write a new vibescape or replace one that exists, and see the picture of exactly what it saved. When rewriting something, put the old and new side by side under the same music.
What a vibescape is
One function, returning a colour. The music arrives as uniforms, so a vibescape draws with the track rather than redrawing it every frame.
The shape
vec3 render(vec2 p, float t)
{
// p is the position on screen, centred on 0,0 and about -0.5 to 0.5
// vertically. t is time in seconds.
float d = length(p);
float ring = smoothstep(0.05, 0.0, abs(d - 0.25));
vec3 colour = vec3(1.0, 0.3, 0.8) * ring;
colour += vec3(0.2, 0.9, 1.0) * uTreble; // sparkles on the highs
return colour * uActive; // fades out in silence
}
What it can use
The music, as numbers: uBass, uMid, uTreble, uLevel, uBeat, uBeatStrength, uBands[96] (the whole spectrum), uBeats (a beat counter), uActive (how much is playing), uTime, uClock. Plus uGenre — the genre of the music, as a number: 0 classical, 1 electronic, 2 rock, 3 pop, 4 hip-hop, 5 jazz, 6 blues, 7 country, 8 r&b, 9 ambient. And helpers for shapes, colour and noise.
What it can ask
Your agent doesn't have to guess what the music is doing. what_i_hear reports what Vibresia is hearing at that moment: the genre, the instruments it thinks are playing, the tempo, the levels, and the shape of the spectrum. It can write a vibescape that suits the track in front of you rather than one that suits music in general.
Asking before it writes is what makes the difference. The genre is a fact about the song rather than a guess about the sound, and a world written for the track in front of you is a different thing from one written in the abstract.
get_uniform_snapshot goes one level lower and returns the numbers themselves — what uBeatStrength and uBass are actually reading right now, and how far they reach. It's the difference between multiplying by 0.5 because it sounds right and multiplying by 2 because you can see the range.
The full list of uniforms and helpers is one call away, so it never has to remember it.
It draws before it commits
Every vibescape it writes comes back as a picture first. It renders the shader, looks at the result, changes one constant, renders again — about forty milliseconds a frame. That's the difference between a vibescape that was designed and one that was guessed.
Two details worth knowing if you'd rather look over its shoulder. Previews are graded through the same colour palette the app uses, so what the agent sees is what you'll see — ask it to pass grade: false if you want to see a shader's own colours instead. And because the palette shifts everything slightly, the agent can read the current palette and pick colours that survive it.
Without an agent
Prefer to write it yourself? In the app, View All → + Custom Vibescape takes the same route: paste the code, press Test, and you'll see the picture before you keep it.