Skip to main content
Glama

find_unused_assets

Read-onlyIdempotent

Find assets in an Unreal folder with zero referencers, annotate protected, config-named, and base-library forks with keep reasons, and list only deletion candidates.

Instructions

Find assets in a folder with zero referencers, and annotate each survivor with the reasons it should be KEPT anyway. "Zero referencers" is not the same as "safe to delete": there are three common ways an asset stays alive with an empty referencer set -- it is explicitly protected, a Config/Default*.ini names it, or it is a fork descending from a vendored base library. Each becomes a keep_reason string on the entry; deletion_candidates lists only the entries with NO keep_reason. Nothing is ever removed from unused_assets by these flags (hiding a genuinely unreferenced asset would be the same lie in the other direction). NOTE: there is deliberately no is_world -- it is already visible in class_name ("World").

Returns: { folder_path, folder_exists, recursive, dependency_type, protect_paths: [string], include_lineage_reasons, base_libraries: [string], unused_assets: [{path, class_name, size_kb, keep_reasons: [string], keep_reason_detail: {...}}], unused_count, total_scanned, deletion_candidates: [string], deletion_candidate_count, assets_with_keep_reason, keep_reason_counts: {protected_path, referenced_by_config, descends_from_base_library}, config_scan: {files_scanned: int, files: [string]}, lineage_scan: {attempted, blueprints_loaded, skipped_non_blueprint, load_failures} }

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
recursiveNoIf true, scan subfolders, default true
folder_pathYesContent folder to scan, e.g. /Game/Unused
protect_pathsNoWildcard patterns (FString::MatchesWildcard, case-insensitive, `*` spans '/') matched against the package name and the object path. Default [] . A match adds keep_reason "protected_path".
base_librariesNoVendored-library content roots for the lineage check. Default: the project's Read Only Content Roots (same default as audit_class_purity).
dependency_typeNoReferencer filter: "hard"|"soft"|"all" (case-insensitive), default "all" (identical behavior to omitting it)
exclude_classesNoOptional list of class name fragments to skip
include_lineage_reasonsNoDefault FALSE because it LOADS every candidate Blueprint. When true, a Blueprint whose super chain reaches a class owned by one of base_libraries gets keep_reason "descends_from_base_library" -- the only signal that saves a fork carrying no fork-origin tag (project setting Fork Origin Tag).

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv1.1.0

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With readOnlyHint/destructiveHint already covering the safety profile, the description adds real operational context: nothing is removed by the keep flags, and include_lineage_reasons defaults false because it LOADS every candidate Blueprint. It also explains the deliberate absence of is_world. This is meaningful disclosure beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and the key distinction, then details. Dense and mostly earns its length, though the prose runs long relative to the parameter set and could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, but the description inlines the full return shape (unused_assets, keep_reasons, deletion_candidates, counts, config_scan, lineage_scan), so an agent has everything needed to interpret results for a read-only scan tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description nevertheless adds semantics the schema lacks: the exact keep_reason strings produced by protect_paths/base_libraries/lineage, and the guarantee that these flags do not filter unused_assets. Modest but genuine added value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (find) and resource (assets with zero referencers) plus the additional output behavior (annotating survivors with keep reasons). It is clearly distinguishable from siblings like get_asset_referencers or audit_asset_references by scoping to zero-referencer assets in a folder.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives strong semantic context ('zero referencers' is not 'safe to delete') and names the sibling audit_class_purity for the base_libraries default. However, it never explicitly says when to choose this over get_asset_referencers or audit_asset_references, so routing is inferable rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Deploy Server

Other Tools