ue5-audio-mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited ue5-audio-mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Drive the C++ TCP server inside Unreal Editor. All commands use 4-byte big-endian length prefix + UTF-8 JSON on 127.0.0.1:9877.
# Python SDK
from ue_audio_mcp.ue5_connection import get_ue5_connection
conn = get_ue5_connection()
resp = conn.send_command({"action": "ping"})
# Raw TCP
python3 -c "
import socket, struct, json
s = socket.socket(); s.settimeout(5); s.connect(('127.0.0.1', 9877))
p = json.dumps({'action':'ping'}).encode()
s.sendall(struct.pack('>I', len(p)) + p)
r = s.recv(4); l = struct.unpack('>I', r)[0]; print(json.loads(s.recv(l)))
"| Command | Params | Returns |
|---|---|---|
ping | — | engine, version, project, features[] |
| Command | Params | Returns |
|---|---|---|
create_builder | asset_type (Source/Patch/Preset), name | asset_type, name |
add_interface | interface | — |
build_to_asset | name, path (/Game/...) | name, path |
| Command | Params | Returns |
|---|---|---|
add_graph_input | name, type, default? | name, type |
add_graph_output | name, type | name, type |
| Command | Params | Returns |
|---|---|---|
add_node | id, node_type, position? [x,y] | id, node_type |
set_default | node_id, input, value | node_id, input |
connect | from_node, from_pin, to_node, to_pin | all four |
__graph__ = sentinel node ID for graph boundary connections.
| Command | Params | Returns |
|---|---|---|
audition | name? | — |
stop_audition | — | — |
open_in_editor | — | — |
| Command | Params | Returns |
|---|---|---|
add_graph_variable | name, type, default? | name, type |
add_variable_get_node | id, variable_name, delayed? | id, variable_name |
add_variable_set_node | id, variable_name | id, variable_name |
| Command | Params | Returns |
|---|---|---|
convert_to_preset | referenced_asset (/Game/...) | referenced_asset |
convert_from_preset | — | — |
| Command | Params | Returns |
|---|---|---|
list_node_classes | filter?, limit? (200) | nodes[], total, shown |
get_node_locations | asset_path | nodes[], edges[] |
export_metasound | asset_path | asset_type, is_preset, interfaces[], graph_inputs[], graph_outputs[], variables[], nodes[], edges[] |
get_graph_input_names | — | names[], count |
set_live_updates | enabled (bool) | enabled |
| Command | Params | Returns |
|---|---|---|
call_function | function, args? | function, return_value? |
list_assets | class_filter?, path?, limit? | assets[], total, shown |
scan_blueprint | asset_path, audio_only?, include_pins? | graphs[], audio_summary |
Allowlisted functions: PlaySound2D, PlaySoundAtLocation, SpawnSoundAtLocation, SpawnSound2D, SetSoundMixClassOverride, ClearSoundMixClassOverride, PushSoundMixModifier, PopSoundMixModifier, SetGlobalPitchModulation, SetGlobalListenerFocusParameters, PlayDialogue2D, PlayDialogueAtLocation, SpawnDialogue2D, SpawnDialogueAtLocation, GetPlayerCameraManager, GetPlayerController, GetPlayerPawn.
class_filter values: Blueprint, WidgetBlueprint, AnimBlueprint, MetaSoundSource, MetaSoundPatch, SoundWave, SoundCue, SoundAttenuation, SoundClass, SoundConcurrency, SoundMix, ReverbEffect.
Full pin reference: scripts/ms_node_specs.json (93 nodes, 464 pins)
{"action":"create_builder", "asset_type":"Source", "name":"MySine"}
{"action":"add_interface", "interface":"MetaSound"}
{"action":"add_graph_output", "name":"Out Mono", "type":"Audio"}
{"action":"add_node", "id":"osc", "node_type":"UE::Sine::Audio"}
{"action":"set_default", "node_id":"osc", "input":"Frequency", "value":440}
{"action":"connect", "from_node":"osc", "from_pin":"Audio", "to_node":"__graph__", "to_pin":"Out Mono"}
{"action":"build_to_asset", "name":"MySine", "path":"/Game/Audio/MCP"}{"action":"create_builder", "asset_type":"Source", "name":"FilteredSynth"}
{"action":"add_interface", "interface":"MetaSound"}
{"action":"add_graph_output", "name":"Out Mono", "type":"Audio"}
{"action":"add_graph_input", "name":"Cutoff", "type":"Float", "default":"2000.0"}
{"action":"add_node", "id":"osc", "node_type":"UE::Saw::Audio"}
{"action":"add_node", "id":"filt", "node_type":"UE::Biquad Filter::Audio"}
{"action":"add_node", "id":"env", "node_type":"AD Envelope"}
{"action":"add_node", "id":"mul", "node_type":"UE::Multiply::Audio"}
{"action":"connect", "from_node":"osc", "from_pin":"Audio", "to_node":"filt", "to_pin":"In"}
{"action":"connect", "from_node":"__graph__", "from_pin":"Cutoff", "to_node":"filt", "to_pin":"Cutoff Frequency"}
{"action":"connect", "from_node":"filt", "from_pin":"Out", "to_node":"mul", "to_pin":"Primary Operand"}
{"action":"connect", "from_node":"env", "from_pin":"Out Envelope", "to_node":"mul", "to_pin":"Operand"}
{"action":"connect", "from_node":"mul", "from_pin":"Out", "to_node":"__graph__", "to_pin":"Out Mono"}
{"action":"build_to_asset", "name":"FilteredSynth", "path":"/Game/Audio/MCP"}{"action":"list_assets", "class_filter":"Blueprint"}
{"action":"scan_blueprint", "asset_path":"/Game/BP_Player", "audio_only":true}
{"action":"list_assets", "class_filter":"MetaSoundSource"}
{"action":"export_metasound", "asset_path":"/Game/Audio/MS_Gunshot"}Or batch: python scripts/scan_project.py --full-export --import-db --rebuild-embeddings
create_builder before any node/connection ops__graph__ is NOT a real node — it's the boundary sentinel/Game/ or /Engine/, no ..list_node_classes discovers real class names — the 65-name registry may miss someue5_plugin/UEAudioMCP/Source/UEAudioMCP/Private/Commands/ue5_plugin/UEAudioMCP/Source/UEAudioMCP/Private/AudioMCPTCPServer.cppsrc/ue_audio_mcp/tools/src/ue_audio_mcp/knowledge/metasound_nodes.py (144 nodes, 798 pins)$ARGUMENTS
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.