Guide for driving the Asset Manager MCP (Asset_Manager_MCP) to publish and
organize assets in Unity Cloud. This is the endpoint both Asset Transformer skills
point at when they say "chain an Asset Manager action" / "push the result to
Asset Manager": once an AT workflow has produced a local file (GLB, FBX, etc.),
the tools here create the asset and upload it.
Identity model — assets are addressed by name
Almost every tool takes asset_name as the primary handle, plus an
org/project scope. You rarely pass raw asset IDs:
- Org / project scope resolves in this order: explicit
org_id/project_idargs →project_name(resolved by name) → the session defaults set viaset_default_organization/set_default_project. - At the start of a session:
list_organizations→ ask the user →set_default_organization, thenlist_projects→set_default_project(orset_default_project_by_name; offercreate_projectwhen none fits), then omit the scope on later calls. - Discover scope with
list_organizations,list_projects,list_assets.
Authentication
The MCP authenticates the same way as Pipeline Automation:
- Run
unity_login(browser PKCE) once; tokens are cached and refreshed automatically. - Check state with
unity_auth_status. If a call fails with an auth error, that's the first thing to verify — don't retry blindly.
Core lifecycle — create, upload, freeze
The canonical publish flow:
create_asset— creates the asset, or a new uploadable version if it already exists. Returns the asset/version to upload into.tagsmust be a list (["a", "b"]).asset_typetakes the dashboard's spaced values ("3D Model", "Prefab", "Scene", "Shader", ...; legacy unspaced spellings are mapped) — pick the specific type, and usechange_asset_typeto retype an existing asset. New assets default to "3D Model"; on a re-version, leaving it empty keeps the current type.upload_files_to_asset— uploads local files to the current (unfrozen) version.model_filesis a list of local paths.freeze_after_upload=Truefreezes in one step.upload_preview_image_to_asset(optional) — uploads a thumbnail to the preview dataset. The asset must already exist with an unfrozen version.freeze_asset— freezes the current version. Freezing is required before a new version can be created.change_asset_status— advance the asset's status (e.g. to Published). If the requested status isn't directly reachable, the tool reports the reachable ones rather than forcing it.get_asset_statusreads the current status and reachable transitions without changing anything.
Then get_asset_url returns the dashboard link — surface it to the user.
New versions
To revise an existing asset: create_new_draft_version (or create_asset again
with the same name) → upload_files_to_asset → freeze_asset. You must freeze the
previous version before a new draft can be created.
Bulk
batch_upload_assets— create + upload many assets in one call.download_files_from_asset— pull an asset's files locally (e.g. to feed into an Asset Transformerrun_pythonimport).
Metadata and field definitions
update_asset_metadata— merges custom metadata fields into an asset (fields not supplied are left untouched).- Custom fields must be defined at the organization level first. Manage them with
list_field_definitions,create_field_definition,delete_field_definition. Setting metadata for an undefined field will not stick — define it first. - Labels —
list_asset_labelsshows the labels on an asset's versions ("Latest"/"Pending" are system-assigned). User labels are fully manageable:create_labeldefines one at the org level,assign_label/unassign_labelattach it to an asset's current version,list_labelsshows the org's labels. - Finding assets —
search_assets_across_projectssearches the whole org when you don't know which project holds an asset;list_asset_versionsshows an asset's full version history including old frozen versions. - Deletion is recoverable by default —
delete_assetwithdelete_all_versions=Truesoft-deletes to the trash;list_trashed_assets+restore_assetbring things back. Passtrash=Falseonly for a deliberate permanent removal.
References (dependencies between assets)
Recently extended with relativePath and reference metadata — use them:
add_asset_reference— linksource_asset_name→target_asset_namewithin a project. Options:dependency_type— the kind of dependency.target_label— resolve the target by label.relative_path— the path the source expects the target at (e.g. a texture's location relative to a model). Set this when the consumer needs the dependency laid out at a specific path.metadata— arbitrary metadata on the reference itself.- The target version is pinned to the current version by default.
list_asset_references—context=source|target|both(unrecognized values fall back toboth).remove_asset_reference— drop a link.
Collections
Organize assets into collection paths:
list_collections, create_collection, delete_collection,
link_asset_to_collection, unlink_asset_from_collection. upload_files_to_asset
and batch_upload_assets also accept a collection_path to place the asset on
upload.
Projects & organizations
list_organizations, list_projects, create_project, delete_project,
set_default_project, set_default_project_by_name.
The Asset Transformer → Asset Manager handoff
- In-process (
at-scripting/run_python): the AT MCP writes a file to a local path; then callcreate_asset+upload_files_to_asset(this skill) to publish it. There is no direct "AT writes to AM" call — it's two steps. - In a pipeline (
at-upa-scripting): the custom-script action has no AM credentials, so you chain the pipeline'sCreate asset/Add fileactions instead (seepipeline-authoring). That's a different mechanism from this MCP.
Best practices
- Freeze a version before creating the next one; you can't upload into a frozen version.
tagsand other list-typed params must be arrays, not comma-strings.- Define custom metadata fields before setting their values.
- Prefer resolving by name (
*_name) and a session default project over threading IDs through every call — but pass explicit IDs when acting across projects. - After publishing, return
get_asset_urlso the user can verify in the portal. - Publishing an asset is outward-facing — confirm the target project with the user when it isn't already established in the conversation.
Out of scope
- Pipeline
Create asset/Add fileactions and their parameters → seepipeline-authoring(known-action-ids.md). Those run inside a pipeline, not via this MCP. - Writing/optimizing 3D scenes with pxz → see
at-scripting(in-process) andat-upa-scripting(pipeline custom scripts).