Skip to main content
Glama

threenative-asset-mcp

npm version Node.js requirement CI

A Model Context Protocol server that lets AI clients find, inspect and download game-ready 3D assets, textures, HDRIs, animations and audio. It gives each provider structured search, metadata and guarded downloads, and it converts owned Unreal/Fab packs and Unity Asset Store packages to GLB.

Status: experimental. Fab's /i/* JSON routes are undocumented and can change or restrict automated access. Sketchfab licenses vary per model. Review each provider's terms and each asset's license. Unreal and Unity support cover specific formats and verified cases; they do not certify whole packs. Unity imports are verified on three real packs; real Unity Editor reference renders are not yet available. Blendkit is optional and needs documented provider permission. Live Blendkit downloads remain UNVERIFIED.

Contents

I want to…

Read

Install it and connect my MCP host

Install and Host configuration below

See every tool and how to chain them

docs/tools.md

Generate or inspect game audio

docs/audio.md

Import an Unreal / Fab pack as GLB

docs/unreal-import.md

Import a Unity Asset Store package as GLB

docs/unity-import.md

Check which Unreal formats work

docs/unreal-format-support.md

Check which Unity formats work

docs/unity-format-support.md

Load imported assets in Three.js

docs/unreal-threejs-usage.md

Read what each importer version changed

docs/unreal-importer-history.md

Set environment variables

docs/configuration.md

Understand provider rules, caching and TLS

docs/providers.md

Fix an error, or learn what the browser profile touches

docs/troubleshooting.md

Run the tests and CI checks

docs/development.md

Read the Fab API contract notes

docs/fab-contract.md

Use Blendkit (optional, permission required)

docs/blendkit-integration.md

Related MCP server: envato-mcp

Supported providers

Provider

Content

License

Needs

Fab

3D, free-file downloads, owned Unreal packs

Per listing

FabCLI login for owned packs only

Poly Haven

HDRIs, textures, models

CC0 (API use needs a visible credit)

Nothing

ambientCG

Materials, HDRIs, decals, models

CC0

Nothing

Smithsonian 3D

Open Access scanned models

Open Access

Nothing

Sketchfab

Public models

Varies per model

SKETCHFAB_API_TOKEN for downloads only

Kenney

3D packs, audio

CC0

Nothing

itch.io (curated)

Quaternius animations, KayKit, Brackeys VFX, Tallbeard music

CC0

Nothing

Blendkit (optional)

Free models through your own Blendkit-Client

Private use only, never redistributed

Local Client plus BLENDKIT_PROVIDER_PERMISSION

Game audio catalog

Sonniss, Kenney, Tallbeard, Scott Buckley, Mixkit, Pixabay, Freesound, OpenGameArt, Abstraction

Per source

ELEVENLABS_API_KEY for generation only

Fab search defaults to free assets, meaning at least one license tier is free. Call fab_get_asset before making license or price claims. More in docs/providers.md.

Requirements

  • Node.js 20.19 or newer

  • Playwright Chromium, only when Fab requests browser verification

  • FFmpeg and FFprobe on PATH for the audio tools

  • Unreal imports on Linux also need build packages for older packs. Run npm run doctor for the list. See docs/unreal-import.md.

  • Unity imports need Blender 4.5 LTS to read FBX models. The MCP downloads a pinned copy into its toolchain cache on first use. See docs/unity-import.md.

No Epic or Fab login is needed for search and free downloads. The MCP never signs in for you.

Install

An MCP host can launch the published package with:

npx -y threenative-asset-mcp

For a local checkout:

npm ci
npm run browser:install
npm run build
node dist/index.js

MCP host configuration

Codex (~/.codex/config.toml):

[mcp_servers.assets]
command = "npx"
args = ["-y", "threenative-asset-mcp"]

Claude Desktop:

{
  "mcpServers": {
    "assets": {
      "command": "npx",
      "args": ["-y", "threenative-asset-mcp"]
    }
  }
}

VS Code (.vscode/mcp.json):

{
  "servers": {
    "assets": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "threenative-asset-mcp"]
    }
  }
}

For a local build, use command = "node" and the absolute path to dist/index.js. Restart the host after changing its configuration.

Tools at a glance

Group

Tools

Unified

asset_search_sources, asset_search, asset_get, asset_download, asset_download_file

Fab

fab_search_assets, fab_get_asset, fab_download_free_asset, fab_list_owned, fab_import_asset

Poly Haven

polyhaven_search_assets, polyhaven_get_asset, polyhaven_list_files

ambientCG

ambientcg_search_assets, ambientcg_get_asset, ambientcg_list_files

Smithsonian 3D

smithsonian_search_assets, smithsonian_get_asset, smithsonian_list_files

Sketchfab

sketchfab_search_models, sketchfab_get_model, sketchfab_get_downloads

Blendkit

blendkit_status, blendkit_import_asset

Audio

audio_search_assets, audio_download_asset, audio_inspect_asset, audio_generate_sound

itch.io bundles

itch_list_downloads, asset_list_bundle_entries, asset_download_bundle_animation

Unreal

asset_import_unreal

Unity

unity_list_packages, asset_import_unity

Mesh optimization

mesh_optimize

mesh_optimize shrinks a heavy static GLB behind a rendered before/after gate; it never overwrites its input and keeps the original when the gate fails. See docs/tools.md.

Recommended flow: asset_search_sources → the returned search tool → the returned files tool → the returned download tool with acceptLicense: true. All discovery tools are read-only. Download tools write only inside their own directories, and never purchase, sign in or overwrite. Full list: docs/tools.md.

audio_generate_sound spends your own ElevenLabs credits. Nothing else costs money.

Unreal / Fab import

fab_import_asset and asset_import_unreal turn an Unreal pack (UE4 and UE5, cooked or uncooked) into self-contained GLBs plus an import-report.json. Unreal Engine is not required. The importer reports what it could not convert instead of claiming a full conversion. Setup, login and output types: docs/unreal-import.md. Per-class status: docs/unreal-format-support.md.

Unity Asset Store import

asset_import_unity turns a .unitypackage, a UPM tarball or a Unity project folder you already have into self-contained GLBs (one per model, plus one per prefab with its materials bound) and an import-report.json. unity_list_packages lists the packages your Unity Editor cached. fab_import_asset hands a Unity-format Fab artifact to the same importer when FabCLI exposes it. The MCP never signs in to Unity, never calls Unity services and never decrypts a download. Unity is not required. The importer reports what it could not convert, such as custom shaders, which keep their saved colour and base texture. Setup and output: docs/unity-import.md. Per-class status: docs/unity-format-support.md.

Privacy

No analytics or remote telemetry. Logs go to stderr only and omit query text unless FAB_LOG_QUERIES=1. The dedicated browser profile never reads your normal browser profile or Epic session. See docs/troubleshooting.md.

Development

npm ci && npm run typecheck && npm test

npm run doctor lists missing local prerequisites. CI details and live probes: docs/development.md.

Contributing and help

Start with Troubleshooting and npm run doctor. Report bugs through GitHub issues with the package version, Node version, OS, affected tool and sanitized reproduction steps. Never include credentials, signed download URLs or licensed asset files. Before a pull request, read AGENTS.md and run the checks in docs/development.md.

License

The package declares UNLICENSED in package.json. No open-source license is granted. Downloaded assets and external tools keep their own licenses and terms. Public availability does not grant redistribution rights.

Available Tools

41 tools
ambientcg_get_assetGet an ambientCG assetA
Read-onlyIdempotent

Get normalized metadata and CC0 licensing for one ambientCG asset.

Inputs: assetId (required). Returns: id, url, maps, tags, +10 more

ambientcg_list_categoriesList ambientCG categoriesB
Read-onlyIdempotent

List ambientCG category metadata and asset counts.

Inputs: type. Returns: provider, categories

ambientcg_list_filesList ambientCG filesB
Read-onlyIdempotent

List official CC0 asset archives with variant attributes, extensions, URLs, and byte sizes.

Inputs: assetId (required), limit, cursor, extension, +1 more. Returns: files, total, license, provider, +1 more

ambientcg_search_assetsSearch ambientCG assetsC
Read-onlyIdempotent

Search CC0 materials, HDRIs, models, decals, atlases, brushes, terrains, and other ambientCG assets.

Inputs: sort, type, limit, query, +1 more. Returns: items, total, provider, nextCursor

asset_auto_rigAuto-rig an unrigged humanoidA
Idempotent

Fit an 18-joint humanoid skeleton to an unrigged local GLB by measured geometry landmarks, bind smooth or rigid skin weights and publish the skinned GLB under the project root. Preserves an existing rig unless replaceRig is set; ambiguous anatomy returns a landmark correction request instead of a bad rig.

Inputs: output (required), target (required), projectRoot (required), overrides, +5 more. Returns: bytes, joints, output, sha256, +13 more

asset_download_bundle_animationDownload one animation from a bundled GLBA
Idempotent

Export one named animation as a small standalone GLB after range-fetching only the aggregate source entry. Unrelated clips, meshes, materials, and textures are removed; cached source entries are reused.

Inputs: packId (required), uploadId (required), acceptLicense (required), animationName (required), +1 more. Returns: path, packId, sha256, license, +9 more

asset_download_bundle_entryDownload one file from a remote asset bundleA
Idempotent

Extract one selected ZIP entry through HTTP byte ranges, cache it locally, and avoid downloading unrelated bundle contents. Requires explicit license acknowledgement.

Inputs: packId (required), uploadId (required), entryPath (required), acceptLicense (required). Returns: path, packId, sha256, license, +6 more

asset_download_fileDownload a direct provider asset fileA
Idempotent

Download a file URL returned by Poly Haven, ambientCG, or Smithsonian MCP tools, or a curated Game-icons.net/Kenney direct ZIP, into guarded local storage after license acknowledgement. Provider hosts and URL shapes are allowlisted, redirects are revalidated, files are streamed with a byte cap, and existing files are never overwritten.

Inputs: url (required), fileName (required), provider (required), acceptLicense (required). Returns: path, sha256, fileName, provider, +4 more

asset_import_unrealImport a local Unreal asset directoryA
Idempotent

Convert a local directory of Unreal .uasset/.umap files into self-contained model and scene GLBs under a game's assets directory, with reconstructed PBR materials, actor transforms, and a provenance report. Works on any already-downloaded Unreal pack, whatever downloaded it.

Inputs: outputDir (required), sourceDir (required), packages, maxTextureSize. Returns: audio, fonts, counts, failed, +19 more

asset_inspect_rigInspect a humanoid rig and its animation donorsB
Read-onlyIdempotent

Inspect a local humanoid GLB and optional local UAL ZIP/GLB libraries: meshes, joints, suggested bone mappings, clips, attributes, extensions, measured bounds and attachment candidates. Reads only caller-selected local files and downloads nothing.

Inputs: target (required), libraries. Returns: limits, target, catalog, sources, +3 more

asset_list_bundle_animationsList animation clips inside a bundled GLBA
Read-onlyIdempotent

Range-extract and cache only the aggregate GLB from a curated bundle, then return its named animation clips. The standard non-root-motion GLB is selected automatically when entryPath is omitted.

Inputs: packId (required), uploadId (required), entryPath. Returns: packId, license, uploadId, entryPath, +5 more

asset_list_bundle_entriesList files inside a remote asset bundleA
Read-only

Inspect a curated itch.io ZIP through HTTP byte ranges without downloading the whole archive. Returns individual entry paths and compressed/uncompressed sizes; signed URLs are never exposed.

Inputs: packId (required), uploadId (required). Returns: name, packId, entries, license, +4 more

asset_list_sourcesList recommended asset sourcesA
Read-onlyIdempotent

List agent-ready sources by default: every result has an MCP download path requiring no manual browser, login, checkout, or paywall. Set agentReadyOnly=false to inspect the broader research directory, including package-manager, Git, authenticated, and provider-page sources.

Inputs: agentReadyOnly. Returns: total, sources

asset_preview_animationPreview a prepared rig or clipA
Idempotent

Render a prepared GLB from several angles with an optional clip sample time or explicit bone pose, and publish a nonblank contact sheet under the project root. A missing rendering backend returns an explicit unavailable result instead of claiming success.

Inputs: output (required), prepared (required), projectRoot (required), clip, +6 more. Returns: bounds, canvas, images, output, +8 more

asset_retarget_animationsRetarget selected donor clips onto a prepared targetA
Idempotent

Fetch the selected pinned release donors, retarget their clips onto a prepared target skeleton with a world-space rest correction, preserve the target's mesh/materials/UVs and (by default) its existing clips, and publish a game minimal GLB. Root motion requires the matching _RM donor.

Inputs: clips (required), output (required), target (required), projectRoot (required), +3 more. Returns: bytes, clips, output, sha256, +8 more

asset_search_sourcesSearch recommended asset sourcesA
Read-onlyIdempotent

Search agent-ready asset sources by category, license, access mode, or text query. Manual/provider-page sources are excluded unless agentReadyOnly=false.

Inputs: query, access, license, category, +1 more. Returns: total, sources

audio_download_assetDownload a curated game-audio packA
Idempotent

Download one catalog asset by ID into the dedicated audio directory after explicit license acknowledgement. URLs and redirects are restricted to curated official hosts; existing files are never overwritten.

Inputs: assetId (required), acceptLicense (required). Returns: path, sha256, assetId, license, +7 more

audio_list_sourcesList game-audio sourcesA
Read-onlyIdempotent

List supported audio libraries, best uses, licensing caveats, browse pages, and whether this MCP has a curated direct-download contract.

Inputs: no named parameters. Returns: total, sources

audio_search_assetsSearch downloadable game-audio packsA
Read-onlyIdempotent

Search the curated catalog of official audio packs with stable direct URLs and explicit license metadata. Use audio_list_sources for broader provider-page discovery.

Inputs: kind, limit, query, cursor, +1 more. Returns: items, total, nextCursor

creature_guideRead pinned anyCreature authoring guidanceA
Read-onlyIdempotent

Read a bounded syntax or workflow section from the verified anyCreature 1.3.1 payload. This does not run or extract the compiler.

Inputs: section (required). Returns: guide, section, upstream, integrity, +1 more

creature_statusGet anyCreature availabilityA
Read-onlyIdempotent

Report the pinned anyCreature payload, currently available operations, and optional local tooling without starting a browser or requesting credentials.

Inputs: no named parameters. Returns: setup, limits, tooling, upstream, +3 more

fab_download_free_assetDownload a free Fab asset fileA
Idempotent

Download one directly available free Fab file into the configured local download directory. This never purchases or adds an asset to a library.

Inputs: format (required), acceptFabEula (required), listingIdOrUrl (required). Returns: path, format, sha256, fileName, +4 more

fab_get_assetGet a Fab assetA
Read-onlyIdempotent

Get normalized public details and per-license prices for one Fab listing.

Inputs: listingIdOrUrl (required), currency. Returns: id, url, tags, files, +21 more

fab_import_assetImport an owned Fab Unreal assetA
Idempotent

Download an Unreal asset the signed-in Fab account already owns and convert it to source GLBs in one step. Uses the FabCLI session the user established themselves; it never logs in, claims, or purchases anything.

Inputs: outputDir (required), acceptFabEula (required), listingIdOrUrl (required), engine, +3 more. Returns: audio, fonts, counts, failed, +19 more

fab_list_filtersList Fab search filtersB
Read-onlyIdempotent

List usable public Fab filter labels and slugs. A warning identifies versioned fallback or stale values.

Inputs: kinds, refresh. Returns: source, filters, warnings, capturedAt, +1 more

fab_list_limited_time_freeList limited-time-free Fab promotionsA
Read-onlyIdempotent

List Fab's dedicated curated limited-time-free promotions separately from general free search.

Inputs: limit. Returns: items, source, warnings

fab_list_ownedList the Fab assets this account ownsA
Read-onlyIdempotent

List every listing already in the signed-in Fab library, optionally filtered to the ones that publish an Unreal artifact fab_import_asset can convert. Search free assets first with fab_search_assets; reach for this when you want something already paid for. Read-only — it never claims or purchases.

Inputs: query, unrealOnly. Returns: total, listings

fab_search_assetsSearch Fab assetsC
Read-onlyIdempotent

Search public Fab marketplace listings. Free assets are returned by default.

Inputs: sort, tags, limit, query, +15 more. Returns: items, warnings, transport, nextCursor, +1 more

itch_download_assetDownload a curated itch.io asset packA
Idempotent

Resolve a fresh signed itch.io file URL for a listed upload and stream it into guarded local storage after explicit license acknowledgement. Signed URLs are not exposed in the MCP result.

Inputs: packId (required), uploadId (required), acceptLicense (required). Returns: name, path, packId, sha256, +7 more

itch_list_downloadsList curated itch.io pack downloadsA
Read-only

Resolve a fresh no-account itch.io download page and list its upload IDs, names, sizes, license, and safe suggested filenames. Signed page tokens are never returned.

Inputs: packId (required). Returns: name, packId, caution, license, +3 more

polyhaven_get_assetGet a Poly Haven assetA
Read-onlyIdempotent

Get normalized metadata, authorship, dimensions, and CC0 license information for one Poly Haven asset.

Inputs: assetId (required). Returns: id, url, lods, name, +17 more

polyhaven_list_categoriesList Poly Haven categoriesA
Read-onlyIdempotent

List Poly Haven category labels and asset counts for HDRIs, textures, or models.

Inputs: type (required). Returns: provider, categories

polyhaven_list_filesList Poly Haven asset filesA
Read-onlyIdempotent

List official download URLs, byte sizes, MD5 hashes, and file dependencies for a Poly Haven asset, with format and resolution filters.

Inputs: assetId (required), limit, cursor, format, +2 more. Returns: files, total, provider, nextCursor

polyhaven_search_assetsSearch Poly Haven assetsB
Read-onlyIdempotent

Search CC0 HDRIs, textures, and models from Poly Haven. Results include explicit Poly Haven attribution.

Inputs: sort, type, limit, query, +2 more. Returns: items, total, provider, nextCursor, +1 more

sketchfab_get_downloadsGet Sketchfab download URLsA
Read-only

Get temporary download URLs for a downloadable Sketchfab model using the user's SKETCHFAB_API_TOKEN. This does not store credentials or download files.

Inputs: modelId (required). Returns: warning, provider, downloads, authentication

sketchfab_get_modelGet a Sketchfab modelA
Read-onlyIdempotent

Get public metadata and explicit Creative Commons requirements for one Sketchfab model.

Inputs: modelId (required). Returns: id, name, tags, author, +18 more

sketchfab_list_categoriesList Sketchfab categoriesA
Read-onlyIdempotent

List public Sketchfab model category names and slugs.

Inputs: no named parameters. Returns: provider, categories

sketchfab_search_modelsSearch Sketchfab modelsA
Read-onlyIdempotent

Search public Sketchfab models and return per-model license, author, geometry, and archive metadata.

Inputs: limit, query, cursor, sortBy, +5 more. Returns: items, provider, nextCursor, downloadAuthentication

smithsonian_get_assetGet a Smithsonian 3D assetA
Read-onlyIdempotent

Get a normalized summary of one Smithsonian Open Access 3D model.

Inputs: modelId (required). Returns: id, url, title, license, +4 more

smithsonian_list_filesList Smithsonian 3D filesC
Read-onlyIdempotent

List direct Smithsonian Open Access files with format, quality, compression, and orientation metadata.

Inputs: modelId (required), limit, cursor, quality, +2 more. Returns: files, total, license, provider, +1 more

smithsonian_search_assetsSearch Smithsonian 3D assetsA
Read-onlyIdempotent

Search Smithsonian Open Access 3D models and file variants by text, type, quality, and owning unit.

Inputs: limit, query, cursor, quality, +5 more. Returns: items, provider, nextCursor, totalFiles

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.4/5.0

    Scored across 41 tools

    Disambiguation4/5

    Most tools are cleanly separated by provider prefix and action (search/get/list/download), and asset processing tools target distinct stages (inspect, rig, preview, retarget). A few pairs like asset_list_sources vs asset_search_sources and several download variants could cause hesitation, but descriptions provide enough boundary detail. The unrelated creature_status and creature_guide are distinct from each other but oddly placed.

    Naming Consistency4/5

    Tool names overwhelmingly follow a source_verb_noun convention such as polyhaven_get_asset, itch_download_asset, and sketchfab_list_categories, making the set predictable. Deviations include the generic asset_* family with mixed object nouns and the two creature_* names that do not follow the pattern, though these are minor relative to the total.

    Tool Count2/5

    41 tools is far beyond the usual well-scoped MCP surface. While the server aggregates many provider integrations plus a processing pipeline, the count still feels heavy and increases cognitive load. The bundle, audio, and creature subsets could be split into separate servers or trimmed significantly.

    Completeness4/5

    The asset lifecycle is well covered: discover, inspect metadata, list files, download, rig/retarget, preview, and import for the major supported sources. Minor gaps exist, such as no direct guarded download path for Sketchfab URLs and no category listing for audio, but agents can work around them.

    Maintenance

    ActivityActive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers