fmod-mcp
The fmod-mcp server lets an AI coding agent programmatically drive FMOD Studio via 35 tools that communicate with Studio's built-in JavaScript scripting terminal over TCP.
Discovery & Inspection
Ping the FMOD Studio connection and retrieve version info
List all banks, events (with optional path prefix filtering), and mixer buses
Get detailed info for a specific event (tracks, instruments, bank assignments)
List available effect types, effects on a bus/event-track chain, and get parameters/bypass state for a specific effect by GUID
Audio Management
Import local
.wav/.oggfiles into the project's audio bin
Event Authoring
Create empty events (auto-creates parent folders), assigned to a bank and optionally routed to a bus
Add a group track with a Single-Sound instrument (looping, streaming, async, start/length options)
Set scalar properties on an event (e.g. volume, pitch)
Assign events to banks or route to a mixer bus
Effects
Add/remove effects on buses or event-track chains
Set effect parameters (e.g.
decayTime,gain,threshold)Toggle effect bypass
Project & Build
Save the open FMOD Studio project
Build banks for the default platform
Escape Hatch
Run arbitrary JavaScript directly in Studio's scripting terminal for anything not covered by a named tool
Drives FMOD Studio to import audio, create events, wire instruments, build banks, and manage project operations via its scripting terminal over TCP.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@fmod-mcpimport audio /my/sound.wav and create event event:/test/sfx"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
fmod-mcp
An MCP server that lets an AI coding agent drive FMOD Studio: import audio, create events, wire instruments, place effects on buses, set up sends/returns, manage parameters, and build banks. It does this by speaking to Studio's built-in JavaScript scripting terminal over TCP (port 3663).
v0.2: 35 tools, 143 tests passing (106 unit + 37 live, plus 1 gated persist test). See CLAUDE.md for the tool catalog, docs/effects.md for the effect-parameter reference, docs/troubleshooting.md when something breaks, and examples/ for worked walkthroughs.
Built for use with Claude Code, but works with any MCP-compatible client.
Requirements
FMOD Studio 2.02+ (the scripting terminal has been stable across recent versions)
Python 3.11+
A running FMOD Studio instance with the target project open
Install
git clone https://github.com/jmperez127/fmod-mcp.git
cd fmod-mcp
python3 -m venv .venv
source .venv/bin/activate
pip install -e .Register with Claude Code
Run this from inside the cloned fmod-mcp directory (so $(pwd) resolves correctly):
claude mcp add fmod -s user -- "$(pwd)/.venv/bin/python" -m fmod_mcpThe -- ends claude mcp add's flag parsing so -m fmod_mcp is treated as
arguments to Python. -s user registers the server for every Claude Code
session on your machine; drop it for a project-local registration.
Alternatively, if you prefer a globally-callable shim, install via pipx:
pipx install .
claude mcp add fmod -s user fmod-mcpVerify:
claude mcp listConfigure host/port (optional)
Defaults to 127.0.0.1:3663. Override with environment variables:
export FMOD_MCP_HOST=127.0.0.1
export FMOD_MCP_PORT=3663Enable TCP scripting in Studio
FMOD Studio's scripting terminal listens on TCP/3663 by default. If it's disabled:
Open FMOD Studio
Edit→Preferences(orFMOD Studio→Preferenceson macOS)Look for
Scripting/TerminalsettingsEnable TCP listener, note the port
Quick smoke test
With FMOD Studio running and a project open:
> ping
{ ok: true, version: { productVersion: 2, majorVersion: 2, minorVersion: 20, ... } }
> list_banks
[ { path: "bank:/Master", guid: "...", name: "Master" }, ... ]Worked examples
The examples/ directory has prompt-style walkthroughs you can paste into a Claude Code session:
File | Scenario |
Minimum pipeline: import → event → sound → save → build | |
Loop the above over a folder of wavs | |
Reverb return + global send (with parameter reference) | |
Music-ducks-to-VO routing | |
Local game parameter for an event | |
Find and delete orphan audio in the bin |
Files it writes
~/.cache/fmod-mcp/commands.log: every JS snippet sent to Studio, timestamped by request ID. Audit trail + replay source.
Testing
Unit tests run without Studio (mock-based):
pytest -q
# 106 passed, 38 skipped (live tests)Live tests require FMOD Studio running with any project open:
FMOD_MCP_LIVE=1 pytest -q
# 143 passed, 1 skipped (persist-gated)The persist-gated save+build verification additionally writes to disk; opt in explicitly:
FMOD_MCP_LIVE=1 FMOD_MCP_LIVE_PERSIST=1 pytest tests/live/test_save_build_live.pyLive tests use a per-test scratch folder under event:/__mcp_test_scratch__/<hex>/ and clean up via studio.project.deleteObject on tear-down. A session-scoped sweep also runs at start AND end so an interrupted run doesn't leave orphans.
When things break
See docs/troubleshooting.md for the common failure modes and their fixes. The short version:
Check
~/.cache/fmod-mcp/commands.logfor the exact JS that went out.Paste it into Studio's own Scripting window (
Window→Scriptingin the Studio GUI) and iterate.Once working, patch the corresponding JS template in
fmod_mcp/tools/*.py.
For anything not covered by a named tool, use run_js:
> run_js return studio.project.model.Event.findInstances().length;
42Layout
fmod_mcp/
├── studio_client.py # TCP/3663 client. Single persistent connection, sentinel-framed IIFE protocol
├── server.py # FastMCP tool registration, stdio transport
├── __main__.py # python -m fmod_mcp
└── tools/
├── discovery.py # ping, list_banks, list_events, list_buses, get_event
├── audio.py # import_audio, delete_audio, move_audio
├── events.py # create_event, add_single_sound, add_multi_sound,
│ # set_event_property, assign_to_bank, assign_to_bus,
│ # delete_event, delete_folder, rename_event, move_event,
│ # add_local_parameter, add_global_parameter
├── effects.py # list_effect_types, add_effect, list_effects, get_effect,
│ # set_effect_param, remove_effect, bypass_effect
├── routing.py # add_return, remove_return, list_returns,
│ # add_send, list_sends, remove_send, set_send_level
├── project.py # save_project, build_banks, deploy_banks
└── escape.py # run_js
tests/
├── (mock-based unit tests)
└── live/ # opt-in via FMOD_MCP_LIVE=1; auto-skip when port 3663 isn't reachableLicense
MIT © 2026 jmperez127.
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/jmperez127/fmod-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server