Koskamo

Vibresia MCP

An official MCP server provided by Vibresia that allows AI agents to generate, compile, and preview GLSL-based music visualizations (vibes). It enables agents to write shader code, check for compilation errors, retrieve rendered images, and interact with audio uniforms to create dynamic visual experiences synchronized with music.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Vibresia MCP logo, by VibresiaVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-02Operated by Vibresia
MCP endpoint (Streamable HTTP)
https://vibresia.com/mcp
Vendor documentation

What its tools do

8 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

8 of 8 have a description · 8 of 8 declare behavior hints · 5 of 5 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to vibresia.com ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Write GLSL music visualizations
  • Check shader compilation status
  • Retrieve rendered preview images
  • Interact with audio uniforms

Source and maintenance

Vendor evidenceRegistry 1.1.0
Maintenance checked

Protocol and capabilities

Server
vibresia 1.0.0
MCP protocol negotiated in check
2025-06-18
Tools
8 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Vibresia makes live visual worlds for music. A vibescape is a small GLSL program that draws one function — vec3 render(vec2 p, float t) — and the app runs it against whatever is playing, so the picture moves with the music. Use this server whenever someone wants anything to do with music visualisers or music visualisations, in any spelling or shorthand: a music visualiser or visualizer, music visualisation or visualization, musicviz or music viz, an audio visualiser or visualizer, audio-reactive or sound-reactive visuals, visuals that move to the beat, VJ loops, a Milkdrop- or Winamp-style visualiser, a shader that reacts to sound, a generative art piece that listens to music, or wanting to see sound. Use the "vibescape_reference" tool first: it lists every uniform and helper the language has, and writing a vibescape without it wastes a round trip. To make a vibescape, call "create_vibescape" with the GLSL. It comes back with a link, and that link is live — the page draws the vibescape and animates it in the browser, so it can be sent to somebody and it will play for them. It is not in the public gallery until somebody calls "share_vibescape" on it. Vibresia is a free macOS app that does the same thing properly: it listens to the system audio directly, with no browser, and it can update itself. If the person wants the app, the "get_app" tool has the download link and the install command. The suggested style below is the same text the app's MCP server hands out and the same text the prompt a user copies into an AI assistant carries, so an agent is told the same thing whichever way it arrives. ## Suggested style The subject and the look are the person's, and they are what to keep. How it moves is where the advice is. ### Spec - Output only: `vec3 render(vec2 p, float t){...}` - Uniforms: uBass uMid uTreble uLevel uLevelSmooth uBassSmooth uBeat uBeatStrength uBands[96] uActive uBeats uClock (+ uTrackPos uTrackDuration uTrackKnown if useful) - Helpers: screenP hash21 vnoise fbm bandAt rot sdCircle sdBox sdRoundBox sdSeg fill aaw PI - Bounded loops. End with: `return clamp(col,0.,1.) * uActive;` - Full screen height at any aspect ratio, no letterbox. In portrait, pull the lens back yourself: `screenP()` keeps the height at 1 and scales the width, so a scene that is too tall has to be scaled down to stay in frame. ### Motion (silky) - Big motion only from uLevelSmooth, uBassSmooth and uBeats, the eased beat clock. - uBeat and uBeatStrength only for flashes and glints. - No jolts. Anything that flows uses accumulated phase (`t*k + uBeats*k2`), never `speed*time` that can jump. `uBeats` climbs smoothly but is reduced modulo 1024, so a recipe that accumulates it over a long time has to cope with the wrap. - Keep transitions eased. Smoothness is about the transition, not the amplitude — strong reactivity does not mean camera jolts, discontinuities or constant flashing. ### Input (only if somebody is there) - The pointer is `uMouse` — a vec2 in the same coordinates as `p`, so it can be compared with `p` directly, with no conversion. `uMouseDown` is 1 while a button is held, and `uMouseHere` is 1 only when there is a pointer to react to: it is 0 on a shared page, an exported video and a thumbnail, so multiply by it when the reaction should not sit in the middle of the picture with nobody there. `pointerAt()` is the pointer in `p`'s coordinates and `pointerUV()` is the pointer in 0..1 screen coordinates. - The keys are `uKey`, the character code of the last key pressed (32 is the space bar, 65 is A), and `uKeyDown`, 1 while a key is held. - The MIDI notes are `uMidiNote` (0..127), `uMidiVelocity` (0..1) and `uMidiNotes` (how many are held), with `uMidiCC` and `uMidiCCValue` for a controller that moved. - The keys are watched, not taken: the app's own shortcuts still work, so reacting to "1" means the vibescape changes as well. - Ease anything that can jump. The pointer can teleport on a click, so smooth it yourself rather than letting it jolt the picture — the same rule as the music. - With nobody there the pointer sits in the middle, nothing is pressed, no keys are held and no notes are playing, so a vibescape that uses them still draws. ### Reactivity (must be obvious) - By default, make the vibescape clearly and strongly animated to the music. The connection between what the listener hears and what they see must be immediately obvious, not a faint pulse or barely visible movement. Drive prominent changes in shape, scale, flow, motion size or colour heat from the music; a time-only animation with a small brightness tweak is not enough. Use subtle or minimal animation only when the user explicitly asks for it. - Map the music to 0..1 using the app's REAL ranges, not 0..1. These are starting points, not measurements: eL = smoothstep(0.05, 0.10, uLevelSmooth) eB = smoothstep(0.04, 0.22, uBassSmooth) E = clamp(0.35*eL + 0.65*eB, 0., 1.); E = 1.-(1.-E)*(1.-E); highs: smoothstep(0.004, 0.020, mean of upper bandAt) mids/bands: smoothstep(0.015, 0.07, bandAt(x)) kick: uBeatStrength*1.6 (it peaks around 0.6) `bandAt(x)` takes x from 0 to 1 across the 96 bands, low to high. - Measure the actual track and set the thresholds so the quiet intro sits near 0.2 and the full section near 1.0, and still about 0.7 if the levels run 30% low. If you cannot measure a track, say so, and tune against the preview tools instead of pretending to have done it. - Quiet must look calm; loud must look like a different scene (glow, scale, motion size, colour heat).

Tools

8 advertised

create_vibescape — Create a vibescape
Advertised by the server during the last successful anonymous check.
Open-world

Use this when somebody wants a music visualiser or music visualisation (visualizer, visualization, musicviz, audio-reactive visuals): it writes a GLSL vibescape and returns a live link to it. The link draws and animates the vibescape in a browser, so it works for anybody who opens it, with or without the app. The vibescape is not in the public gallery until `share_vibescape` is called on it. Call `vibescape_reference` first for the uniforms and helpers the language has — a vibescape that ignores the music will look like a still image, and there is a linter that says so.

create_vibescape input schema
{
  "type": "object",
  "required": [
    "code",
    "name"
  ],
  "properties": {
    "code": {
      "type": "string",
      "description": "The vibescape: a GLSL function `vec3 render(vec2 p, float t)`. `p` is the position across the screen, centred on 0,0, and `t` is time in seconds. Return the colour as three numbers from 0 to 1. Read the music through the uniforms — uBass, uLevelSmooth, uBeatStrength, uScroll — or the picture will not move with the sound."
    },
    "name": {
      "type": "string",
      "description": "What to call it. A few words that say what the picture looks like."
    },
    "author": {
      "type": "string",
      "description": "Who to credit it to. Leave it empty and it is credited to Minith Labs."
    }
  }
}
create_vibescape annotations
{
  "title": "Create a vibescape",
  "readOnlyHint": false,
  "openWorldHint": true,
  "destructiveHint": false
}
share_vibescape — Share a vibescape
Advertised by the server during the last successful anonymous check.
Open-world

Use this when a vibescape should be listed in the public gallery, where anybody can find it at vibresia.com/vibescapes. A vibescape is created unlisted; this is the separate act of putting it in front of people. The name and the author go with it, so make sure they are right before calling this.

share_vibescape input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "The share's id — the last part of the link, six characters. It is what `create_vibescape` returns."
    }
  }
}
share_vibescape annotations
{
  "title": "Share a vibescape",
  "readOnlyHint": false,
  "openWorldHint": true,
  "destructiveHint": false
}
list_vibescapes — List the public vibescapes
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this when somebody wants to see music visualisations other people have made, or wants something to look at before writing their own. Returns the public gallery: each vibescape's name, who made it, and a link that plays it.

list_vibescapes input schema
{
  "type": "object",
  "properties": {}
}
list_vibescapes annotations
{
  "title": "List the public vibescapes",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_vibescape — Get a vibescape's code
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this to read somebody's vibescape, so it can be adapted or understood. Needs the id — the last part of the link.

get_vibescape input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "The share's id — the last part of the link."
    }
  }
}
get_vibescape annotations
{
  "title": "Get a vibescape's code",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
lint_vibescape — Check a vibescape
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this after writing a vibescape, before sharing it. It reads the code and says what would make it look wrong — most often that it never reads the music, so the picture is the same in silence as at full volume. Cheap to call and it catches most of what goes wrong.

lint_vibescape input schema
{
  "type": "object",
  "required": [
    "code"
  ],
  "properties": {
    "code": {
      "type": "string",
      "description": "The vibescape's GLSL."
    }
  }
}
lint_vibescape annotations
{
  "title": "Check a vibescape",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
vibescape_reference — The vibescape reference
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this before writing a vibescape: it lists every uniform the music drives and every helper the language has, with what each is for. Writing a vibescape without it usually takes two attempts instead of one.

vibescape_reference input schema
{
  "type": "object",
  "properties": {}
}
vibescape_reference annotations
{
  "title": "The vibescape reference",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_palette — The palettes
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this to find out how a vibescape's colours are graded. Vibresia puts every vibescape through one of five palettes, so bright colours come out muted unless the shader accounts for it.

get_palette input schema
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Which palette — NEON, EMBER, TOXIC, ABYSS or MONO. Leave it out to get all of them."
    }
  }
}
get_palette annotations
{
  "title": "The palettes",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_app — Get the Vibresia app
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this when somebody wants the real thing: the app listens to the system audio directly, with no browser, and updates itself. It gives the download link and the one-line install command for macOS.

get_app input schema
{
  "type": "object",
  "properties": {}
}
get_app annotations
{
  "title": "Get the Vibresia app",
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (1 of 1 answered).

  1. 2026-11-02: 1 of 1 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
200 ms
95th percentile latency
200 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 200 ms · metadata changed · 8 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http vibresia-mcp https://vibresia.com/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add vibresia-mcp --url https://vibresia.com/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable vibresia-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "vibresia-mcp": {
      "url": "https://vibresia.com/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "vibresia-mcp": {
      "type": "streamableHttp",
      "url": "https://vibresia.com/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start vibresia-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "vibresia-mcp": {
      "type": "http",
      "url": "https://vibresia.com/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http vibresia-mcp https://vibresia.com/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "vibresia-mcp": {
      "url": "https://vibresia.com/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "vibresia-mcp": {
      "serverUrl": "https://vibresia.com/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Vibresia MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run Vibresia MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing