FmodStudioMCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| FMOD_STUDIO_HOST | No | The hostname or IP address where FMOD Studio's scripting server is listening. | 127.0.0.1 |
| FMOD_STUDIO_PORT | No | The TCP port used by FMOD Studio's scripting server. | 3663 |
| FMOD_STUDIO_MCP_PROFILE | No | Workflow-specific subset of tools. Options: full, events, mixer, banks, minimal. | full |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| event_playA | Play an event instance — the equivalent of pressing play in FMOD Studio's transport controls. This is how you actually hear a result instead of guessing from the event tree. Args: target: event:// path or {guid}. |
| event_stopA | Stop a playing event instance. Args: target: event:// path or {guid}. immediate: True (default) stops instantly, skipping the stopping state. False lets release/fade-outs and one-shot tails play out before stopping. |
| event_toggle_pauseC | Toggle the pause state of a playing event instance. Args: target: event:// path or {guid}. |
| event_key_offA | Send the keyoff command to a playing event instance — triggers the release behavior for any sustain point ahead of the playhead. Args: target: event:// path or {guid}. |
| event_return_to_startA | Return a playing/paused/stopping event instance's timeline playback position to the cursor (or to the timeline start, if the instance is stopped). Args: target: event:// path or {guid}. |
| event_playback_statusA | Check whether an event instance is playing/paused/stopping, and its current timeline playhead position — use this to validate a play/stop/pause call actually took effect. Args: target: event:// path or {guid}. |
| automation_add_curveA | Bind a property to a curve so it changes as the driver changes —
e.g. crossfade music layers by automating each layer's Args: target: Mixer group/bus/VCA/event mixer group {guid} — NOT a track guid (use mixerGroupGuid, not trackGuid). property: 'volume' | 'pitch' | 'gain'. driver: 'parameter:/Name' (parameter-driven) or 'event:/...' (timeline-driven). driver_type: 'parameter' | 'timeline'. points: [[position, value], ...]. Parameter-driven: position is a parameter value. Timeline-driven: position is seconds. |
| automation_addA | Add one point to an existing curve (or start a new one). Same target/driver/property reuses the matching curve. Args: target: Mixer group/bus/VCA/event mixer group {guid}. property: 'volume' | 'pitch' | 'gain'. driver: 'parameter:/Name' or 'event:/...'. driver_type: 'parameter' | 'timeline'. position: Parameter value or timeline seconds. value: Mapped property value. |
| automation_listA | List the real automation curves + points on a target's automator for a given property — every curve's guid, the driver parameter it's bound to, and its actual [position, value] points. Args: target: The automated object (mixer group, bus, VCA, event). property: 'volume' | 'pitch' | 'gain' (default 'volume'). |
| bank_createA | Create a bank to hold events and sounds. Args: name: Bank name. Note: the "Master" bank always exists already. |
| bank_listA | List every bank in the project (capped). |
| bank_infoC | Get a bank's guid, name and path. Args: target: bank:/ path or {guid}. |
| bank_renameA | Rename a bank. Args: target: bank:/ path or {guid}. name: New name. |
| bank_deleteB | Delete a bank and its contents. Args: target: bank:/ path or {guid}. |
| bank_add_eventA | Assign an event to a bank (so it ships with the build). Args: bank_target: bank:/ path or {guid}. event_target: event:/ path or {guid}. |
| bank_remove_eventA | Remove an event from a bank. Args: bank_target: bank:/ path or {guid}. event_target: event:/ path or {guid}. |
| bank_list_eventsB | List the events assigned to a bank (capped). Args: bank_target: bank:/ path or {guid}. |
| event_createB | Create an event in the master event folder (or an event:// folder). Args: name: Event name (e.g. "Hit", "UI/Hover"). folder: Optional event:// path or {guid} of the owning folder. |
| event_deleteC | Delete an event. Args: target: event:// path or {guid}. |
| event_infoB | Get an event's guid, name, path and maxVoices. Args: target: event:// path or {guid}. |
| event_listA | List every event in the project (capped). |
| event_lookupA | Resolve an event reference to its canonical event:/ path and guid. Args: target: A path (event:/...) or {guid}. |
| event_set_nameC | Rename an event. Args: target: event:// path or {guid}. name: New name. |
| event_set_folderB | Move an event into a folder (or the master folder root). Args: target: event:// path or {guid}. folder: event:// folder path or {guid}. |
| event_add_trackA | Add a group (audio) track to an event's timeline. Returns two distinct GUIDs — a track and its mixer group are
different objects. Use Args: target: event:// path or {guid}. name: Optional mixer-group name for the track ("Audio 1" by default). |
| event_list_tracksA | List an event's group tracks (mixer-group name + both guids each). Args: target: event:// path or {guid}. include_master: Whether to include the event's master track (True). |
| event_set_max_voicesA | Cap simultaneous instances of an event (maxVoices). Args: target: event:// path or {guid}. max_voices: 1-1000. |
| event_timeline_cursorA | Scrub an event's timeline cursor to a position (in seconds). Args: target: event:// path or {guid}. position: Cursor position in seconds (>= 0). |
| folder_createA | Find-or-create a folder chain (e.g. "UI/HUD" resolves/creates UI then HUD) — safe to call repeatedly, reuses existing folders. Args: kind: EventFolder | AssetFolder. AssetFolder isn't creatable in FMOD Studio 2.03.14 (errors clearly rather than no-op'ing). path: Slash-separated, e.g. "UI/HUD". |
| folder_listA | List folders in the project browser (capped). Args: kind: Optional filter — EventFolder | AssetFolder. Omit for all. |
| event_add_marker_trackA | Get-or-create a marker (logic) track on an event's timeline.
Reuses an existing marker track if the event already has one (most
events only need one) — check event_list_tracks-style state before
assuming a fresh track is needed; call this and it will tell you
via Args: target: event:// path or {guid}. |
| marker_add_namedA | Add a named (destination) marker — a labeled point on the timeline that transition markers/regions elsewhere can jump to. Errors if a marker with this name already exists on the track, rather than creating a duplicate — use marker_list to check first. Args: track_target: Marker track {guid} from event_add_marker_track. name: Marker name. position: Timeline position in seconds (>= 0). |
| marker_add_regionB | Add a destination (loop) region to a marker track — a labeled range, e.g. a section transition markers/regions can jump into. Errors if a region with this name already exists on the track, rather than creating a duplicate. Args: track_target: Marker track {guid} from event_add_marker_track. name: Region name. position: Start position in seconds (>= 0). length: Region length in seconds (> 0). loop_mode: None | Looping | Magnet (default Looping). |
| marker_add_sustain_pointA | Add a sustain point — playback holds here until a keyoff command (event_key_off) releases it. Used for loop-until-released sounds (e.g. a footstep that holds mid-loop until the game says "stop"). Args: track_target: Marker track {guid} from event_add_marker_track. position: Timeline position in seconds (>= 0). |
| marker_add_transitionA | Add a transition marker — when playback crosses this point, the timeline jumps to the given destination. Args: track_target: Marker track {guid} from event_add_marker_track. position: Timeline position in seconds (>= 0). destination_target: {guid} of a NamedMarker or LoopRegion (from marker_add_named / marker_add_region). |
| marker_add_transition_regionA | Add a transition region — while playback is inside this range, the timeline jumps to the given destination. Args: track_target: Marker track {guid} from event_add_marker_track. position: Start position in seconds (>= 0). length: Region length in seconds (> 0). destination_target: {guid} of a NamedMarker or LoopRegion. |
| marker_listA | List every marker/region/sustain point/transition on a marker track (capped at 200), tagged with its marker type. Args: track_target: Marker track {guid} from event_add_marker_track. |
| marker_renameA | Rename a named marker or region. Args: target: Marker/region {guid}. name: New name. |
| marker_set_positionA | Move a point-type marker (named marker, sustain point, transition marker) to a new timeline position. Args: target: Marker {guid}. position: New position in seconds (>= 0). |
| marker_set_regionA | Move/resize a region-type marker (loop region, transition region). Args: target: Region {guid}. position: New start position in seconds (>= 0). length: New length in seconds (> 0). |
| marker_deleteB | Delete a marker/region/sustain point/transition. Args: target: Marker {guid}. |
| marker_add_transition_timelineA | Add a transition timeline to a transition marker/region/loop region/magnet region, with a source+destination sound pair — FMOD's "Add Transition Timeline" feature: a crossfaded transition instead of a hard jump-cut, the professional technique for a seamless loop. Structurally verified live: this produces a valid TransitionTimeline
plus TransitionSourceSound/TransitionDestinationSound, both correctly
bound (a TransitionSourceSound/TransitionDestinationSound requires
both its Args: transition_target: TransitionMarker/TransitionRegion/LoopRegion/ MagnetRegion {guid} to add the timeline to. audio_track_target: The GroupTrack {guid} whose audio is transitioning — the track being looped, for a simple single-track loop. crossfade_length: Overlap between outgoing and incoming audio, in seconds (default 1.0, must be > 0). Larger = smoother/slower blend. |
| mixer_group_createB | Create a mixer group (routed to Master by default). Args: name: Group name. output_target: Optional output bus/group path or {guid}. |
| mixer_group_listB | List every mixer group in the project (capped). |
| mixer_group_infoA | Get a mixer group's guid, name, path and current volume (dB). Args: target: Group path or {guid}. |
| mixer_group_renameB | Rename a mixer group. Args: target: Group path or {guid}. name: New name. |
| mixer_group_deleteA | Delete a mixer group. Warning: objects routed through it will need re-routing afterwards. Args: target: Group path or {guid}. |
| mixer_group_routeA | Route a group's output to a bus or group. Keep routing inside the same event/mixer surface — routing an event's master track into a different event's mixer has been known to crash Studio. Args: target: Group path or {guid}. output_target: Destination bus/group path or {guid}. |
| mixer_group_volumeA | Set a mixer group's volume, in dB (-80 .. +10). Args: target: Group path or {guid}. db: Volume in decibels. |
| mixer_effect_addB | Add an effect to a group's effect chain. Args: target: Group path or {guid}. effect: Effect type, e.g. CompressorEffect, LimiterEffect, ParamEqEffect, LowpassEffect, DelayEffect, ConvolutionReverbEffect, DistortionEffect, ... |
| mixer_effect_listB | List the effects on a group's chain. Args: target: Group path or {guid}. |
| mixer_master_infoA | Get the master bus guid, name and volume. |
| mixer_master_volumeA | Set the master bus volume, in dB (-80 .. +10). Args: db: Volume in decibels. |
| vca_createA | Create a VCA (Voltage-Controlled Amplifier) — a volume control that scales every mixer strip assigned to it, for grouping several buses under one fader (e.g. "Music", "SFX", "Voice"). Args: name: VCA name. |
| vca_listA | List every VCA in the project (capped). |
| vca_infoA | Get a VCA's guid, name and current volume (dB). Args: target: vca:/ path or {guid}. |
| vca_volumeA | Set a VCA's volume, in dB (-80 .. +10). Args: target: vca:/ path or {guid}. db: Volume in decibels. |
| vca_assignA | Assign a mixer strip (group/bus) to a VCA so the VCA's fader scales it alongside every other strip assigned to it. FMOD's docs don't name the exact assignment relationship — this tries a couple of plausible names and raises a clear error instead of silently doing nothing if neither applies. Args: vca_target: vca:/ path or {guid}. strip_target: Mixer group/bus path or {guid} to assign. |
| mixer_send_createA | Create a return track + send within one event's mixer (e.g. a shared reverb bus). Per-event only — no cross-event/global send here. Args: event_target: event:// path or {guid}, owns both the source group and the new return. source_group_target: Source mixerGroupGuid to send from. return_name: Name for the new return track. level_db: Send level in dB (-80..+10, default 0). |
| parameter_addA | Add a game parameter to an event. Errors if a parameter with this name already exists on the event, rather than creating a duplicate — use parameter_set_initial/parameter_list on the existing one instead. The parameter is then settable by the game at runtime, or provides an automation line target on the event's timeline. Args: event_target: event:/ path or {guid}. name: Parameter name. param_type: User | UserEnumeration | Distance | Direction | Elevation | EventConeAngle | EventOrientation. min: Minimum value (default 0). max: Maximum value (default 1). |
| parameter_listA | List an event's game parameters (name + guid). A parameter's name
lives behind its presetOwner relationship, not a direct property —
don't read Args: event_target: event:/ path or {guid}. |
| parameter_set_initialA | Set a game parameter's initial value on an event. Args: event_target: event:/ path or {guid}. parameter_name: Name of the parameter (from parameter_list). value: Initial value. |
| parameter_set_labelsA | Set enumeration labels on a UserEnumeration parameter. Args: event_target: event:/ path or {guid}. parameter_name: The parameter's name. labels: Human-readable labels, in order (e.g. ["Off","Quiet","Loud"]). |
| project_get_infoA | Get the open project's file path and display name. |
| project_saveB | Save the open FMOD Studio project (the active .fspro). |
| project_save_allA | Save the project and every edited file (assets, banks, plugins). |
| project_buildB | Build banks for the selected platform(s), or scope to specific banks/platforms (scoping a big project to one bank is much faster). Args: banks: Bank name or list (default: every bank). platforms: Platform name or list (default: every platform). |
| project_get_modifiedA | Check whether the project has unsaved changes. |
| snapshot_createB | Create a mixer snapshot. A snapshot captures a set of mixer state changes (group/bus/VCA volumes, effect settings) that the game activates as a blendable state — e.g. a 'dungeon' or 'night' reverb/level shift layered over the base mix. Mixer settings are captured by Studio when you move a control while the snapshot is armed; pass the returned path to snapshot_bind_group to pin a group's current settings. Args: name: Snapshot name. |
| snapshot_listA | List every mixer snapshot in the project (capped). |
| snapshot_infoA | Get a snapshot's guid, name and path. Args: target: snapshot:/ path or {guid}. |
| snapshot_renameB | Rename a mixer snapshot. Args: target: snapshot:/ path or {guid}. name: New name. |
| snapshot_deleteA | Delete a mixer snapshot. Args: target: snapshot:/ path or {guid}. |
| snapshot_bind_groupA | Bind a mixer group's captured settings to a snapshot. Snapshots store per-group mixer states. Binding a group to a snapshot tells Studio that group owns a setting within it, so later mixer edits while the snapshot is armed capture into that snapshot. Args: snapshot_target: snapshot:/ path or {guid}. group_target: bus:/ or mixer group path/{guid}. |
| audio_importA | Import an audio file into the project as a reusable asset. Returns the asset's {guid} so it can be assigned to an instrument. Long operation — asset files are copied into the project. Args: file_path: Absolute path to a .wav/.aiff/.flac/.mp3/.ogg file. |
| audio_assetsA | List imported audio assets in the project (capped). |
| sound_add_to_trackA | Place an instrument on an event's track timeline. Returned {guid} is for follow-up calls (sound_set_audio_file, sound_set_owner). Args: event_target: event:/ path or {guid}. track_target: trackGuid (not mixerGroupGuid) from event_list_tracks. sound_type: SingleSound | MultiSound | ProgrammerSound | SoundScatterer | EventSound. start: Start position, seconds. length: Length in seconds (0 = untrimmed). name: Optional instrument name. |
| sound_createB | Create a standalone instrument (usually a SingleSound for a Multi's playlist). Args: sound_type: SingleSound | MultiSound | ProgrammerSound | SoundScatterer | EventSound. name: Optional instrument name. |
| sound_set_audio_fileA | Assign an imported audio asset to an instrument. Reads the assignment back before returning — a Args: target: Instrument {guid} or path. audio: Asset {guid} from audio_import. |
| sound_set_ownerB | Set a sound's owning instrument (e.g. a SingleSound into a MultiSound). Reads the assignment back before returning — see sound_set_audio_file. Args: target: SingleSound {guid}. owner: Owner MultiSound/Scatterer {guid}. |
| sound_set_nameA | Rename an instrument. Args: target: Instrument {guid} or path. name: New name. |
| sound_infoA | Get an instrument's guid, name, path, and whether it actually has an audio asset attached (hasAudioFile / audioFileName) — a SingleSound with no audio assigned shows an empty box with no waveform in Studio and plays silence; check this after sound_set_audio_file rather than assuming the assignment stuck. Args: target: Instrument {guid} or path. |
| utility_lookupB | Resolve any object (event, bank, group, asset, ...) to its identity. Args: target: Path (event:/..., bank:/...) or {guid}. |
| utility_listB | List every object of a given type (capped). Args: obj_type: Event | Bank | MixerGroup | MixerBus | MixerVCA | Snapshot | Folder | Preset. |
| utility_is_validC | Check whether an object is valid (survived recent edits). Args: target: Object path or {guid}. |
| utility_deleteA | Delete any object from the project. Warning: destructive and not undoable from the terminal. Args: target: Object path or {guid}. |
| utility_dumpA | Real introspection: every plain property (with value) + every
relationship (cardinality + count) on a live object. Use this BEFORE
concluding a capability "doesn't exist" — FMOD's docs only list
methods, not plain properties (e.g. Args: target: Object path or {guid}. |
| utility_validateB | Run the project's validation and report issues. |
| workspace_infoA | Get the workspace's key roots: event/asset/bank roots and the master bus. |
| workspace_browser_currentA | Get the object currently selected in the project browser. |
| workspace_navigateA | Open an object in the relevant editor (event editor, mixer, ...). Args: target: Object path or {guid}. |
| workspace_editor_selectionB | Get the object currently selected in the open editor window. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 92 tools
Many tools are clearly scoped by resource type, but there are several overlapping boundaries: generic utility_delete/utility_lookup/utility_list duplicate specific delete/lookup/list tools, project_save and project_save_all are near-twins, and automation_add_curve vs. automation_add plus the marker_add_transition* family are easy to confuse. The detailed descriptions help, but an agent navigating 92 tools will still face selection ambiguity.
The set overwhelmingly follows a consistent lowercase snake_case [domain]_[operation] pattern, e.g. event_create, bank_delete, mixer_group_volume, sound_set_owner. Minor exceptions like workspace_editor_selection, workspace_browser_current, and audio_assets break the verb pattern slightly, but overall naming is predictable and readable.
92 tools is far beyond what an MCP server should expose, even for a complex domain like FMOD Studio. The rubric treats 50+ as an extreme mismatch; this server has nearly double that, which is excessive for agent context windows and creates unnecessary selection burden. Many tools could be consolidated into parameterized operations.
The domain is broadly covered: events, banks, mixer groups, VCAs, snapshots, markers, parameters, automation, audio assets, project save/build, and workspace navigation are all represented. There are minor gaps such as no dedicated VCA delete/rename, no parameter delete/rename, no effect removal, and no sound deletion, but utility_delete and related generic tools provide workarounds.