Critical Risk →

asset

Asset management: list, search, read, CRUD, import meshes/textures, datatables. Actions: - list: List assets via the AssetRegistry (sees /Game and every mounted plugin root). Params: directory? (default /Game), classFilter?, recursive? (default true), maxResults? (default 2000) - search: Search b...

Risk signalsAccepts file system path (items[].filePath) · Accepts freeform code/query input (query) · High parameter count (73 properties) · Admin/system-level operation

Part of the Ue server.

asset can permanently delete data in Ue, with no limits today. PolicyLayer puts allow, deny, and rate-limit rules on every call. Live in minutes.

SECURE UE →

Free to start. No card required.

AI agents may call asset to permanently remove or destroy resources in Ue. Without a policy, an autonomous agent could delete critical data in a loop with no way to undo the damage. PolicyLayer blocks destructive tools by default and requires explicit human approval before enabling them.

Without a policy, an AI agent could call asset in a loop, permanently destroying resources in Ue. There is no undo for destructive operations. PolicyLayer blocks this tool by default and only allows it when a human explicitly approves the action.

Destructive tools permanently remove data. Block by default. Only enable with explicit approval workflows.

policy.json
{
  "version": "1",
  "default": "deny",
  "hide": [
    "asset"
  ]
}

See the full Ue policy for all 22 tools.

Get this rule live on your own Ue server in minutes. PolicyLayer enforces it on every call, before it runs.

ENFORCE ON MY UE →

View all 22 tools →

These attack patterns abuse exactly the kind of access asset gives an agent. Each links to the full case and the policy that stops it:

Browse the full MCP Attack Database →

Every attack above starts with a tool call. PolicyLayer checks each one against your policy first, so asset only ever does what you allow.

SECURE UE →

Other destructive tools across the catalogue. The same approach applies to each: deny by default, or require human approval.

What does the asset tool do? +

Asset management: list, search, read, CRUD, import meshes/textures, datatables. Actions: - list: List assets via the AssetRegistry (sees /Game and every mounted plugin root). Params: directory? (default /Game), classFilter?, recursive? (default true), maxResults? (default 2000) - search: Search by name/class/path. Params: query, directory?, maxResults?, searchAll? - read: Read asset via reflection. Params: assetPath - read_properties: Read asset properties with values. Params: assetPath, propertyName?, includeValues? - duplicate: Duplicate asset. Params: sourcePath, destinationPath - rename: Rename asset. Params: assetPath, newName (or sourcePath, destinationPath), force?. World Partition levels are detected and their __ExternalActors__/__ExternalObjects__ packages migrate atomically alongside the .umap, source-side redirectors get fixed up, and the active editor world is swapped to blank if it matches the source (#409). Refuses if any package is dirty - save first. If a prior rename left externals orphaned at the old path, re-running reconciles them. Rollback descriptor is emitted even on partial failure so the inverse rename can recover. force=true lets the call merge into a destination with pre-existing externals (used by rollback). For batches of 3+ scene-referenced non-world assets use bulk_rename instead. - bulk_rename: Batched rename using IAssetTools::RenameAssets - single transaction with one redirector-fixup pass (matches Content Browser drag). Use this over looped rename for scene-referenced assets. World assets are rejected (status=rejected_world); use rename_asset which handles WP externals atomically (#409). Params: renames[] where each entry is {sourcePath, destinationPath} OR {assetPath, newName}. - move: Move asset. Params: sourcePath, destinationPath - delete: Delete asset. On failure returns reason (open_in_editor / has_referencers / unknown) plus referencer list. Pass force=true to auto-close any open asset editors before deleting (#278). Params: assetPath, force? - delete_batch: Batch-delete assets. Per-path status (deleted/absent/failed) plus reason+referencers on failed entries (#278). Params: assetPaths[], force? - create_data_asset: Create UDataAsset instance of custom class. Params: name, className (/Script/Module.ClassName or loaded name), packagePath?, properties? (key/value map) - save: Save asset(s). Params: assetPath? - save_all_dirty: Flush every dirty package to disk in one call. End-of-workflow shortcut after bulk import/edit. Params: saveMapPackages? (default true), saveContentPackages? (default true). Returns savedAll boolean (#429) - set_mesh_material: Assign material to static mesh slot. Params: assetPath, materialPath, slotIndex? - recenter_pivot: Move static mesh pivot to geometry center. Params: assetPath OR assetPaths - import_static_mesh: Import from FBX/OBJ. Params: filePath, name?, packagePath?, combineMeshes?, importMaterials?, importTextures?, generateLightmapUVs? - import_skeletal_mesh: Import skeletal mesh from FBX. Params: filePath, name?, packagePath?, skeletonPath?, importMaterials?, importTextures? - import_animation: Import anim from FBX. Params: filePath, name?, packagePath?, skeletonPath - import_texture: Import image. Params: filePath, name?, packagePath? - import_texture_batch: Import many textures in one call - the loop stays inside the editor (no per-file bridge round-trip), so this finishes far faster than N import_texture calls. Per-item result records mirror import_texture. Params: items[]: [{filePath, packagePath?, name?, replaceExisting?}], packagePath? (default for items that don't set it), save? (default true), automated? (default true). Returns requested/imported/failed counts + items[] (#430) - reimport: Reimport asset from source file. Params: assetPath, filePath? - read_datatable: Read DataTable rows. Params: assetPath, rowFilter? - create_datatable: Create DataTable. Params: name, packagePath?, rowStruct - reimport_datatable: Reimport DataTable from JSON. Params: assetPath, jsonPath?, jsonString? - list_textures: List textures. Params: directory?, recursive? - get_texture_info: Get texture details. Params: assetPath - set_texture_settings: Set texture settings. Params: assetPath, settings (object with compressionSettings?, lodGroup?, sRGB?, neverStream?). Keys may also be passed at the top level. - add_socket: Add socket to StaticMesh or SkeletalMesh. Idempotent on socket name; pass onConflict='update' to overwrite an existing socket's transform with the supplied relativeLocation/relativeRotation/relativeScale (#412). Params: assetPath, socketName, boneName? (SkeletalMesh only, default 'root'), relativeLocation?, relativeRotation?, relativeScale?, onConflict? (skip\|update\|error, default skip) - remove_socket: Remove socket by name. Params: assetPath, socketName - list_sockets: List sockets on a mesh (StaticMesh or SkeletalMesh). Params: assetPath - set_socket_transform: Update an existing socket's relative transform on StaticMesh or SkeletalMesh. Pass any subset of relativeLocation/relativeRotation/relativeScale; omitted fields stay at their current values. Errors if the socket does not exist (use add_socket to create). Common after FBX import when SOCKET_* empties land with scale=(100,100,100) (#412). Params: assetPath, socketName, relativeLocation?, relativeRotation?, relativeScale? - set_property: Set a UPROPERTY on any loaded asset (Material, DataAsset, DataTable, SubsurfaceProfile, etc.) using a dotted path. Walks nested structs and sub-objects internally - no more read-modify-write copies (e.g. settings.mean_free_path_distance on a UMaterial). Value goes through MCPJsonProperty::SetJsonOnProperty so JSON null clears object refs, structs accept {x,y,z}, arrays/maps round-trip. Params: assetPath, propertyName (dotted path), value (#420) - set_texture_settings_by_type: Apply the canonical (compressionSettings, sRGB, LOD group) combo to every texture in each group: normal -> Normalmap, grayscale -> Grayscale, baseColor -> Default sRGB, hdr -> HDR. Params: groups (object: {normal?:[paths], grayscale?:[paths], baseColor?:[paths], hdr?:[paths]}) (#421) - create_interchange_pipeline: One-call factory for a UInterchangeGenericAssetsPipeline asset with the 15-property mesh-import boilerplate already applied (RecomputeNormals=false, MikkTSpace=true, HighPrecisionTangents=true, BuildNanite=false, CreatePhysicsAsset=false, etc.). Params: assetPath OR (name + packagePath?), meshType? (skeletal default | static), options? (dotted-path overrides on the resulting pipeline e.g. {'MeshPipeline.bBuildNanite': true}), onConflict? (#421) - reload_package: Force reload an asset package from disk. Params: assetPath - health_check: Diagnose stuck-unloadable asset. Returns onDisk/inRegistry/isLoaded/canLoad/isStuck flags so an agent can detect the half-shutdown state where load returns null but the file exists (#279). Params: assetPath - force_reload: Aggressive reload that resets package loaders + GCs + LoadObject. Recovers from the half-shutdown state without an editor restart (#279). Closes any open editors first. Params: assetPath - export: Export asset to disk file (Texture2D → PNG, StaticMesh → FBX, etc.). Params: assetPath, outputPath - search_fts: Ranked asset search (token-scored over name/class/path). Params: query, maxResults?, classFilter? - reindex_fts: Rebuild the SQLite FTS5 asset index. Params: directory? - get_referencers: Reverse dependency lookup. Params: packages[] OR packagePath (#150). Returns {referencersByPackage, totalReferencers}. - set_sk_material_slots: Set materials on a USkeletalMesh by slot name or slotIndex (bypasses the blueprint override-materials path that UE's ICH silently reverts). Params: assetPath, slots[{slotName?|slotIndex?, materialPath}] - diagnose_registry: Scan a content path and compare disk vs AssetRegistry (including in-memory pending-kill entries). Returns onDiskCount, inMemoryIncludedCount, ghostCount and paths. Params: path, recursive? (default true), reconcile? (forceRescan=true) - get_mesh_bounds: Get StaticMesh OR SkeletalMesh bounding box. Params: assetPath. Returns min, max, boxExtent, boxCenter, meshKind (#193/#351) - get_mesh_info: One-call mesh QA: bounds + material slots + skeleton + LOD/vertex counts. Works for both UStaticMesh and USkeletalMesh. Params: assetPath. Returns meshKind, boundsOrigin, boundsExtent, heightM, lodCount, vertexCount, skeletonPath (skeletal only), materialSlots:[{index, slotName, materialPath, isDefaultFallback}], materialCount (#431) - read_import_sources: Read AssetImportData source filenames on an imported asset (StaticMesh, SkeletalMesh, Texture, Animation, etc.). Returns sources[] of {relativeFilename, absolutePath, timestamp, fileHash, displayLabelName}. Params: assetPath (#270) - get_mesh_collision: Inspect StaticMesh collision setup. Params: assetPath. Returns collisionTraceFlag, hasSimple/ComplexCollision, element counts (#177) - move_folder: Move/rename entire content folder with redirector fixup in one transaction. Params: sourcePath, destinationPath (#192) - create_folder: Create empty content browser folder(s). Params: path OR paths[] (e.g. /Game/Foo, /Game/Bar/Baz). Returns per-path created/existed/failed (#212) - delete_folder: Delete content browser folder(s) - counterpart to delete_asset, which leaves the parent directory entry behind as an orphan. Empty folders only by default; pass force=true to also delete any assets still inside (Content Browser 'Delete folder' equivalent). Per-path status (deleted/absent/failed) with reason (invalid_path/protected_path/not_empty/delete_failed) and a sample of contained assets on not_empty entries. Params: path OR paths[], force? - set_mesh_nav: Set StaticMesh nav contribution. Params: assetPath, bHasNavigationData?, clearNavCollision? (#167). It is categorised as a Destructive tool in the Ue MCP Server, which means it can permanently delete or destroy data. Block by default and require explicit approval.

How do I enforce a policy on asset? +

Register the Ue MCP server in PolicyLayer and add a rule for asset: allow, deny, rate-limit, or require approval. Point your MCP client at the PolicyLayer proxy URL and the rule is enforced on every call, before it reaches Ue. Nothing to install.

What risk level is asset? +

asset is a Destructive tool with critical risk. Critical-risk tools should be blocked by default and only enabled with explicit human approval.

Can I rate-limit asset? +

Yes. Add a rate_limit block to the asset rule in your PolicyLayer policy. For example, setting max: 10 and window: 60 limits the tool to 10 calls per minute. Rate limits are tracked per agent session and reset automatically.

How do I block asset completely? +

Set action: deny in the PolicyLayer policy for asset. The AI agent will receive a policy violation error and cannot call the tool. You can also include a reason field to explain why the tool is blocked.

What MCP server provides asset? +

asset is provided by the Ue MCP server (ue-mcp). PolicyLayer sits as a proxy in front of this server to enforce policies before tool calls reach the server.

Enforce policy on every Ue tool call.

Deterministic rules across all 22 Ue tools. Per-identity grants. Full audit log. Live in minutes. Nothing to install.

Free to start. No card required.

4,600+ MCP servers and 31,000+ tools scanned and risk-classified.

// GET IN TOUCH

Have a question or want to learn more? Send us a message.

Message sent.

We'll get back to you soon.