uefn-assets-data
Create, search, copy, move, delete and tag assets, and work with DataTable and CurveTable via MCP in the lab. Verified recipes in recipes.json.
Files1
View on GitHubSKILL.mduser-level-skills/uefn-assets-data/SKILL.md
GitHubuefn-assets-data
Sources: Claude/docs/mcp/assets.md, entry B2 of SKILLS-PROPOSAL.md, recipes.json.
Cross-cutting skills to always follow: uefn-mcp-lab-guard e uefn-create-use-remove-one-script (create, use, remove in ONE script).
Rules
- Paths always in GUID form:
{lab}=/<guid>/<progetto>(e.g./09e4e8d3-.../root_ai_lab). Never/root_ai_lab/.... - AssetTools: package path (without
.Name); DataTable/CurveTable:{"refPath":"<pkg>.<Name>"};diff: plain strings. - The guard is not bypassed: a refusal is reported. If a recipe fails: exact error and STOP.
add_rows,set_rows,remove_rowsreturn null: re-read (get_rows/list_rows) to confirm.find_assetsalways with a filter (folder_path,name,asset_type): without arguments ~120 MB.
Verified recipes
Toolset: editor_toolset.toolsets.asset.AssetTools, editor_toolset.toolsets.data_table.DataTableTools, editor_toolset.toolsets.curve_table.CurveTableTools.
Assets:
create_folder {"path":"{lab}/Assets_X"}find_assets {"folder_path":"{lab}/Assets_X","asset_type":{"refPath":"/Script/Engine.DataTable"},"recursive":true}exists {"path":..},get_asset_class {"asset_path":..},get_asset_tags,is_dirty,get_dependencies,get_referencers,load_asset,reload_asset(discards unsaved changes),list_folders {"root_path":..,"recursive":false}duplicate {"path":..,"new_path":..}(false if it exists),move {"path":..,"new_path":..},delete {"path":..}(folder included)save_assets {"asset_paths":["{lab}/Assets_X/DT_X"]}update_metadata_tags {"asset_path":..,"set_tags":{"MyTag":"v1"}}poiget_metadata_tags(metadata is NOT the registry tags of thetagsfilter).
DataTable:
7. search_row_structs {"struct_name":"*Table*"}; create {"folder_path":"{lab}/Assets_X","asset_name":"DT_X","schema":{"refPath":"/Script/GameplayTags.GameplayTagTableRow"}} -> refPath {dt}
8. get_schema, add_rows {"data_table":{"refPath":"{dt}"},"row_names":["RowA","RowB"]}, set_rows {..,"values":"{\"RowA\":{\"devComment\":\"hello\"}}"} (JSON TEXT, existing row), get_rows {..,"row_names":["RowA"]}, list_rows, rename_rows {..,"renames":{"RowA":"RowAA"}}, remove_rows, diff {"old_asset_path":..,"new_asset_path":..}
CurveTable:
9. create {"folder_path":..,"asset_name":"CT_X"} (already has a Curve row); add_row {"curve_table":{"refPath":"{ct}"},"row_name":"Speed","default_value":1.0}; set_keys {..,"keys":[{"time":0,"value":0},{"time":1,"value":10}]}; add_key {..,"key":{"time":5.0,"value":9.0}}; get_keys, list_rows, rename_row {..,"row_name":"Speed","new_row_name":"Velocity"}, remove_row, diff.
Cleanup: AssetTools/delete {path:"{lab}/Assets_X"}.
To try (not verified)
DataTableTools/import_file,CurveTableTools/import_file: guard-refused (disk path). Do not bypass.AssetTools/update_metadata_tagsconremove_tags: rejected (3 attempts); no known way to remove a tag except deleting the asset.AssetTools/existsright afterdelete: unreliable as proof of deletion (unverified).find_assetswithout filters,ListTags: deliberately not run (120 MB / 2.8 MB).
Don't
find_assets without filters; import from disk; treating null as success; writing outside the lab folder.