Skip to main content
Glama

sfxbrew

Procedural game sound effects for humans and AI coding agents. Eastern (wuxia / xianxia) sounds plus the usual game sounds, synthesized locally, with no API keys, no network and no per-call cost.

  • 29 presets: sword qi, guqin, pipa, erhu, wooden fish, war drum, lightning, temple bell, gong, spell cast, heavenly thunder, breakthrough, talisman, alchemy, wind chime, bamboo flute, qi gathering, coin, pickup, click, confirm, error, jump, hit, explosion, laser, power-up, level up, whoosh

  • Every generation is a fresh variation; a seed reproduces it exactly

  • Output: 16-bit WAV, or a ~7 KB dependency-free JavaScript snippet that plays the same sound with Web Audio

  • Free for commercial use, no attribution required for the sounds you generate

For AI agents (MCP)

Claude Code:

claude mcp add sfxbrew -- npx -y sfxbrew mcp

Other MCP clients (Cursor, Windsurf, Claude Desktop …):

{
  "mcpServers": {
    "sfxbrew": { "command": "npx", "args": ["-y", "sfxbrew", "mcp"] }
  }
}

Tools:

Tool

What it does

list_presets

Presets and what each one is good for

generate_sfx

Write one or more WAV variants (and optionally a .js file with play functions)

render_patch

Render a hand-tuned patch JSON

get_js_code

One drop-in JS snippet with playX() functions for several sounds

Then just ask: "add a coin sound and a hit sound to my game".

Related MCP server: sfx-gen-mcp

Agent skill

A free SKILL.md that teaches your agent when and how to use SFX Brew: skills/sfxbrew/SKILL.md, also installable from Agensi.

CLI

npx sfxbrew list
npx sfxbrew coin --out assets/sfx/coin.wav
npx sfxbrew swordQi --count 5 --out assets/sfx/sword.wav
npx sfxbrew hit --seed 42 --js src/sfx.js
npx sfxbrew render my-patch.json --out boom.wav

Sound packs

Ready-made WAV packs: Xianxia & Wuxia Game Sound Pack on itch.io (44 sounds), or download any pack as a ZIP from sfxbrew.com/sounds.

Library

const sfx = require('sfxbrew');
const { patch, seed } = sfx.generate('coin');
const { bytes } = await sfx.renderWav(patch);

Browser editor

Tweak any sound with sliders and export WAV / JS in the web editor (same engine).

License

Code: MIT. Generated sounds: yours, free for any use.

A few presets (war drum, lightning, gong, erhu) use short CC0 recordings from Freesound, listed with their recordists in samples/CREDITS.md.

Available Tools

4 tools
generate_sfxGenerate sound effect WAV filesA

Synthesize game sound effects locally from a preset and write 16-bit mono 44.1 kHz WAV files. Free for commercial use, no attribution. Returns file paths, the seed of each variant (reuse it to get the exact same sound) and the patch JSON (edit it and call render_patch to fine-tune). Presets: swordQi, guqin, bell, gong, spell, thunder, lightning, breakthrough, talisman, alchemy, chime, flute, qiGather, pipa, erhu, woodfish, drum, coin, pickup, click, confirm, error, jump, hit, explosion, laser, powerUp, levelUp, whoosh, arrow, swordClash, footstepStone, rain, notify, footstepGrass, land, shieldBlock, wind, campfire, stream, caveDrip, pageTurn, typing, chestOpen, monsterGrowl.

NameRequiredDescriptionDefault
seedNoSeed for a reproducible result; variant i uses seed + i
countNoNumber of variants to write (default 1). Useful to let the user pick, or for randomized playback.
mutateNoExtra random tweak amount on top of the seeded result, 0-1 (e.g. 0.15)
presetYesPreset id, see list_presets
js_pathNoAlso write a dependency-free .js file with play functions for these sounds (Web Audio, no audio files needed)
out_pathYesWAV file to write, e.g. "assets/sfx/coin.wav". Relative paths resolve against the server working directory. With count > 1, files get -01, -02 ... suffixes.

TDQS

A4/5.0
Behavior4/5

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

Annotations only declare destructiveHint=false, so the description carries most of the burden and does add real context: synthesis happens locally, files are written to disk, output is free for commercial use with no attribution, and the return payload includes file paths, per-variant seeds and patch JSON. It is consistent with the non-destructive annotation (new files, not overwrites). Minor gaps: no statement about overwrite behavior when out_path already exists.

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

Conciseness3/5

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

The first three sentences are front-loaded and information-dense with no waste. However, the trailing enumeration of 44 preset ids duplicates the enum already present in the schema, adding significant length without new meaning and diluting the useful content.

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?

With six parameters, full schema coverage and no output schema, the description does the necessary work of explaining what comes back (paths, seeds, patch JSON) and how variants are named. An agent has enough to call it correctly; only overwrite/collision behavior for existing out_path is unaddressed.

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 the schema already documents every parameter including seed arithmetic, count suffixes and mutate range. The description adds only the seed-reuse framing and the patch-to-render_patch workflow, and leaves js_path entirely to the schema. Baseline 3 is appropriate.

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?

States a specific verb and resource ('Synthesize game sound effects locally from a preset') plus the concrete output format (16-bit mono 44.1 kHz WAV). It also distinguishes itself from the render_patch sibling by naming that tool as the fine-tuning path once you have the patch JSON.

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?

Gives clear routing: use this tool to generate from a preset, then edit the returned patch JSON and call render_patch to fine-tune. It also explains the seed-reuse workflow for exact reproduction. It does not explicitly say when to prefer list_presets or get_js_code, though the schema references list_presets.

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

get_js_codeGet drop-in JavaScript for soundsA
Read-only

Return one self-contained JavaScript snippet (Web Audio, ~7 KB, no dependencies, no audio files) that defines play functions for several sounds. Best for browser games: paste it in and call e.g. playCoin() after a user gesture. Each sound is either {name, preset, seed} or {name, patch}.

NameRequiredDescriptionDefault
soundsYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true; the description adds real behavioral context on top: no dependencies, no audio files, ~7 KB single snippet, and the requirement for a user gesture before playback. It does not mention the 50-item cap or what happens with larger requests, but the added disclosure is meaningful for a read-only generator.

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?

Three sentences, all load-bearing: output form first, usage second, input shape third. No hedging, no restating the title, and the size/dependency facts are packed parenthetically rather than as filler.

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?

There is no output schema, so the description must characterize the return value, and it does — a single self-contained snippet exposing play functions. For a one-parameter tool this is close to sufficient; only the absence of an upper-bound note (max 50 sounds) keeps it from full marks.

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

Parameters4/5

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

With schema description coverage reported at 0%, the description carries the load by explaining the two shapes: "Each sound is either {name, preset, seed} or {name, patch}." That conveys the preset/patch alternative structure, which the JSON schema does not make explicit as an either/or. It still doesn't explain the seed round-trip with generate_sfx or the name-to-playCoin() mapping, so not a 5.

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?

States a specific verb and resource: "Return one self-contained JavaScript snippet (Web Audio, ~7 KB...)" and specifies it defines play functions for several sounds. The output form is distinct from what list_presets, generate_sfx, or render_patch would produce, so an agent can tell it apart from siblings without opening another schema.

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?

Gives a clear use context — "Best for browser games: paste it in and call e.g. playCoin() after a user gesture" — which signals both the target scenario and the autoplay-gesture prerequisite. It stops short of naming alternatives or exclusion conditions (e.g. when to prefer generate_sfx or render_patch instead), which keeps it below a 5.

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

list_presetsList sound presetsA
Read-only

List the procedural sound effect presets (Eastern wuxia/xianxia sounds and general game sounds) with category, tags and what each is good for. Optionally filter by category (combat, magic, instrument, ui, items, character, ambience, creature) or a search query such as "metal", "calm" or "sword". Every call to generate_sfx with a preset gives a new random variation; pass a seed to reproduce one.

NameRequiredDescriptionDefault
queryNoWords that must all match the name, description, keywords or tags
categoryNoOnly presets in this category

TDQS

A4.1/5.0
Behavior4/5

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

readOnlyHint=true already declares the safety profile, and the description adds genuinely useful behavior beyond that: what fields come back per preset and the nondeterminism/seed semantics of downstream generation. It does not say whether the entire preset catalog is returned or capped, which is the one behavioral gap.

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

Conciseness4/5

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

Front-loaded with the core action, then filtering, then generation semantics — a logical order with no filler. The closing seed sentence is slightly tangential to a listing tool but earns its place by preventing confusion with generate_sfx.

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?

For a two-optional-parameter, read-only listing tool with no output schema, the description covers inputs, returned fields, and cross-tool behavior, which is nearly everything an agent needs. The only omission is result-set size/pagination expectations when no filter is supplied.

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 coverage is 100% and already defines both parameters, including the category enum and the all-terms-must-match rule for query. The description's category list merely repeats the enum, and the query examples ("metal", "calm", "sword") illustrate intent but add little semantics beyond the schema.

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?

States a specific verb and resource ("List the procedural sound effect presets") and immediately characterizes the content (Eastern wuxia/xianxia and general game sounds) plus what each entry carries (category, tags, use case). It is clearly distinguishable from the mutating sibling generate_sfx, which it names.

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?

Gives concrete filtering paths (by category enum or a search term) and states the relationship to generate_sfx — presets are inputs to generation, each call yields a random variation, and a seed reproduces one. That is clear context for when to reach for this tool, though it never explicitly says "call this first to discover presets before generating."

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

render_patchRender a custom sound patchA

Render a hand-edited patch (for example one returned by generate_sfx with changed values) to a WAV file. A patch is JSON: { layers: Layer[1..6], reverb 0-1, echo 0-0.9, echoTime s, drive 0-1, crush 0|1-16 bits, gain 0-1 }. Layer fields (all optional, defaults in brackets): type: "tone"|"fm"|"string"|"pluck"|"bell"|"noise" ["tone"]; wave: "sine"|"triangle"|"square"|"sawtooth" (tone/fm/pluck) string: physically modelled plucked string (Karplus-Strong); bright 0-1 [0.5] = darker (guqin) to brighter (pipa); decay = ring time bell: partials = [[ratio, amplitude, decayMultiplier 0-1], ...] (max 16) for custom bells, gongs, wood blocks; default is a metal bar sample: a CC0 recording; sample = one of drum-center-loud, drum-center-soft, drum-edge-loud, drum-rim, lightning-1, lightning-2, gong-1, gong-2, erhu-d3, erhu-f5, sword-clash, footstep-stone, arrow, footstep-grass, land, shield-block, page-turn, typewriter, chest-open, monster-growl, campfire, stream; pitch / pitchEnd semitones (slide over slideTime); offset s into the recording; set hold ≈ recording length to let it ring naturally (lengths s: drum-center-loud 2.7, drum-center-soft 2.7, drum-edge-loud 3.5, drum-rim 1.8, lightning-1 6.5, lightning-2 7, gong-1 10, gong-2 12, erhu-d3 4.9, erhu-f5 6, sword-clash 7.2, footstep-stone 5.4, arrow 4, footstep-grass 3.2, land 2.1, shield-block 3.6, page-turn 8.75, typewriter 4.55, chest-open 11.1, monster-growl 12.8, campfire 10.4, stream 10.4) freq, freqEnd: Hz, pitch slides exponentially from freq to freqEnd; slideTime: s the slide takes (0 = whole sound) hold: s to stay at full volume before the decay starts (louder, more violent bodies) repAccel: gap multiplier per repeat (<1 speeds up, e.g. 0.86 for an accelerating drum build-up); repGain: loudness multiplier per repeat (>1 crescendo) freqPeak / cutoffPeak (Hz, 0 = off): go up to this value by the end of attack, then down to freqEnd / cutoffEnd (Doppler-like pass-by for swishes) start: s delay; attack: s; decay: s (exponential fade); vol: 0-1 filter: "none"|"lowpass"|"highpass"|"bandpass"; cutoff, cutoffEnd: Hz; sweepTime: s (0 = whole); q: resonance vib: vibrato depth in cents; vibRate: Hz rep: number of repeats; repGap: s between repeats; repStep: pitch step per repeat; scale: "penta"|"chromatic" (unit of repStep) jitter 0-1: random gaps (1 = Poisson-like) and loudness per repeat; pitchJitter: semitones of random pitch/cutoff per repeat (crackles, bubbles, debris) noise layers: color "white"|"pink"|"brown"; any layer: trem 0-1 + tremRate Hz = wavering loudness (flames, rumble) patch.seed: integer that fixes the random pattern of jitter unison: 1-5 stacked voices; detune: cents spread fmRatio, fmIndex, fmDecay: FM modulator ratio, depth and how fast the depth decays (type "fm" only) Tips: punchy impacts = short noise layer (decay ~0.01) + tone with fast slideTime (~0.04); metallic = fm or bell; keep total vol*gain under ~1.

NameRequiredDescriptionDefault
nameNoName used for the JS play function (default: file name)
patchYesPatch JSON object with a "layers" array
js_pathNoAlso write a .js file with a play function for this sound
out_pathYesWAV file to write

TDQS

A4.4/5.0
Behavior4/5

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

Annotations only declare destructiveHint=false, so the description carries most of the load and does state the material side effects: a WAV is written to out_path and, if js_path is given, a .js play function file is also written. It omits overwrite semantics, error behavior on invalid patches, and runtime cost, which keeps it below a 5.

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

Conciseness3/5

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

The purpose is front-loaded and the reference block is genuinely useful, but the description is very long and crammed into dense semicolon-chained lines with inline sample-length tables that would read better as schema properties or linked docs. Size is defensible for the payload complexity, but structure and density cost it.

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

Completeness5/5

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

For a nested-object tool with no output schema, the definition supplies the full patch grammar, defaults, value ranges, seed semantics, and even construction tips for common timbres. An agent has enough to author a valid patch and predict the audible outcome without further lookups.

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

Parameters5/5

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

Top-level schema coverage is 100%, but the patch parameter is an opaque `additionalProperties: {}` object, so the schema documents none of the layer structure. The description fully compensates by enumerating layer types, field ranges defaults in brackets, and sample names with their recording lengths, which is meaning the schema cannot provide.

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 first sentence states a specific verb and resource ('Render a hand-edited patch ... to a WAV file') and identifies the sibling generate_sfx as the producer of such patches, so the agent can distinguish it from generate_sfx and list_presets without opening any schema.

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?

It gives a clear when-to-use signal: this is for patches you have edited yourself, such as one returned by generate_sfx with changed values, which implicitly routes generation-only requests to generate_sfx. It stops short of explicit exclusions or prerequisites such as whether an existing out_path is overwritten.

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.

  1. 4 tool updatesv0.1.0
    • First observedgenerate_sfx
    • First observedget_js_code
    • First observedlist_presets
    • First observedrender_patch

TDQS

A4.2/5.0

Scored across 4 tools

Disambiguation4/5

Each tool has a clear role in the pipeline: discover presets, synthesize from a preset, render a hand-edited patch, and export browser JS. The only mild overlap is that generate_sfx and render_patch both output WAV files, but their inputs (preset vs. patch JSON) and intended stages are clearly distinguished.

Naming Consistency5/5

All four names follow a clean verb_noun snake_case pattern: list_presets, generate_sfx, render_patch, get_js_code. The convention is predictable and readable.

Tool Count5/5

Four tools is compact and well-scoped for a procedural SFX generator, and each tool earns its place in a coherent discover → generate → fine-tune → export workflow. Nothing feels redundant or missing at the count level.

Completeness4/5

The core lifecycle is covered: browsing presets, generating variants with seeds, editing patch JSON for fine-tuning, and exporting playable JS snippets. Minor gaps remain, such as no audio preview/playback tool and no way to list, manage, or delete previously generated files.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    A game-agnostic MCP toolkit for composing chiptune/retro MIDI and rendering game audio, enabling AI agents to generate multi-track MIDI files and render them to OGG/WAV.
    7
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Generates four game-ready AI sound effect candidates from a text description, lets users audition them, and installs only the selected WAV into Unity, Godot, or generic game projects.
    6
    28 npm
    1
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables coding agents to synthesize and play video-game sound effects by translating natural-language descriptions into layered synthesis specs, then rendering normalized WAV files.
    9
    MIT