MCP server that drives FMOD Studio live via its scripting terminal (TCP 3663) — full Scripting API access for AI agents.
fmod-studio-mcp provides 7 tools with explicit schemas and descriptions. Strengths: all tools have names starting with action verbs (fmod_get, fmod_set, fmod_add, fmod_remove, fmod_create, fmod_describe, fmod_class), all have descriptions (194 - 342 chars, within the 10 - 1024 baseline), and all critical parameters have type declarations and descriptions. Weaknesses: (1) Parameter descriptions are minimal or missing context, 'property': {type: string} lacks guidance on valid values or format; 'target' descriptions say 'Object path or {guid}' but don't explain lookup syntax or when to use which form. (2) No output schemas documented, tools return plain text (via _run()) with no structured response format, forcing LLMs to parse unstructured reply strings. (3) Generic tools (fmod_get_property, fmod_set_property) lack specificity, they operate on dynamic schema properties unknown at registration time, reducing LLM ability to plan correctly. (4) Error handling returns raw ERROR: prefix strings with no guidance on recovery or categorization. (5) No pagination, filtering, or result limiting, tools like fmod_class_names return unbounded lists. (6) Composite tool fmod_create_event mixes multiple concerns (create + import + assign) without isolation for failures. Overall: solid foundational work with clear naming and basic schemas, but incomplete specification of output formats, error recovery paths, and parameter constraints that would enable confident LLM planning.
Add an object to one of a target's relationships, e.g. relationship 'banks' on an event -> a 'bank:/...'. (target.relationships[name].add(other))
List the project model's class/entity names (introspection: keys of studio.project.model).
Composite: create an event, optionally import a one-shot sound onto a new audio track and assign the event to a bank. Equivalent to a create + importAudioFile + addGroupTrack + addSound + set audioFile + add bank relationship.
List a class's schema-defined property and relationship names — how to discover the dynamic members (use with fmod_get_property/fmod_set_property/fmod_add_relationship).
Read any property of an object — including dynamic, per-class managed properties not in the static reference (e.g. an event's 'timeline').
Remove an object from one of a target's relationships. (target.relationships[name].remove(other))
Output schemas are not documented. All tools return plain-text strings from _run() with no structured response format. LLMs cannot anticipate field names, types, or how to extract data for downstream tool calls.
Parameter descriptions lack constraint and context. 'property': {type: string} offers no guidance on valid names, are they case-sensitive? Must they exist? What happens if invalid?
Error handling returns raw ERROR: strings with no recovery guidance. Example: 'target not found. Try fmod_class_names() to discover valid class names and objects.' Current: raw 'ERROR: ...' invites silent retry loops.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
Set any property of an object (e.g. instrument 'audioFile' = an asset, or 'name'). Value is auto-embedded: numbers/booleans as literals, a path or '{guid}' as an object reference, else a string.
fmod_create_event combines multiple responsibilities (create event + import audio + assign bank). If import fails, the event is created anyway, no compensation or rollback.
No pagination or result limits on introspection tools. fmod_class_names returns unbounded list of all classes; fmod_describe_class returns all properties/relationships for a class.
Generic tools (fmod_get_property, fmod_set_property) operate on dynamic schema properties not enumerated at registration time. LLMs cannot know which properties are valid before calling, requires trial-and-error or introspection calls first.
Ambiguous target parameter format. 'Object path or {guid}', no examples of valid paths (does 'event:/SFX/Hit' need quotes in tool call? Is path case-sensitive? Are forward slashes literal?).