Fab MCP
An MCP server for finding, inspecting, downloading, rigging, animating, and converting game-ready 3D assets, textures, HDRIs, and audio from multiple providers.
Discover agent-ready sources with license, access, and tool routing metadata (
asset_list_sources,asset_search_sources).Search Fab listings, filters, limited-time-free promotions, and owned assets; fetch details and prices; download free files; import owned Unreal packs to GLB (
fab_*tools).Convert local Unreal
.uasset/.umapdirectories into self-contained GLBs with materials, scenes, and a provenance report (asset_import_unreal).Search, inspect, and download CC0 files from Poly Haven, ambientCG, and Smithsonian 3D, plus Sketchfab models with a
SKETCHFAB_API_TOKENfor downloads.Inspect humanoid rigs, auto-rig unrigged models, render rig/clip contact sheets, and retarget pinned UAL animation clips (
asset_inspect_rig,asset_auto_rig,asset_preview_animation,asset_retarget_animations).Browse curated itch.io bundles, range-inspect remote ZIPs, and extract single files or animations from bundled GLBs.
Browse and download curated game-audio packs after license acknowledgement (
audio_*tools).Report anyCreature payload, operation, and tooling status, and read bounded authoring guidance (
creature_status,creature_guide).Guardrails throughout: read-only discovery, explicit license acknowledgement, scoped output directories, no overwrites, and no purchases or logins on your behalf.
Provides tools for listing and downloading assets from curated itch.io packs, including individual file downloads and bundle entry extraction from Quaternius, Tallbeard, Brackeys, and KayKit packs.
Includes Pixabay as a source in its curated game-audio catalog, enabling search and download of audio assets from Pixabay.
Provides tools for searching and retrieving public 3D models, model details, categories, and download URLs (requires API token) from Sketchfab.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Fab MCP search for free 3D models"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
threenative-asset-mcp
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 | |
Generate or inspect game audio | |
Import an Unreal / Fab pack as GLB | |
Import a Unity Asset Store package as GLB | |
Check which Unreal formats work | |
Check which Unity formats work | |
Load imported assets in Three.js | |
Read what each importer version changed | |
Set environment variables | |
Understand provider rules, caching and TLS | |
Fix an error, or learn what the browser profile touches | |
Run the tests and CI checks | |
Read the Fab API contract notes | |
Use Blendkit (optional, permission required) |
Related MCP server: envato-mcp
Supported providers
Provider | Content | License | Needs |
3D, free-file downloads, owned Unreal packs | Per listing | FabCLI login for owned packs only | |
HDRIs, textures, models | CC0 (API use needs a visible credit) | Nothing | |
Materials, HDRIs, decals, models | CC0 | Nothing | |
Open Access scanned models | Open Access | Nothing | |
Public models | Varies per model |
| |
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 |
Game audio catalog | Sonniss, Kenney, Tallbeard, Scott Buckley, Mixkit, Pixabay, Freesound, OpenGameArt, Abstraction | Per source |
|
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
PATHfor the audio toolsUnreal imports on Linux also need build packages for older packs. Run
npm run doctorfor 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-mcpFor a local checkout:
npm ci
npm run browser:install
npm run build
node dist/index.jsMCP 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 |
|
Fab |
|
Poly Haven |
|
ambientCG |
|
Smithsonian 3D |
|
Sketchfab |
|
Blendkit |
|
Audio |
|
itch.io bundles |
|
Unreal |
|
Unity |
|
Mesh optimization |
|
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 testnpm 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 toolsambientcg_get_assetGet an ambientCG assetARead-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 categoriesBRead-onlyIdempotent
List ambientCG category metadata and asset counts.
Inputs: type. Returns: provider, categories
ambientcg_list_filesList ambientCG filesBRead-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 assetsCRead-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 humanoidAIdempotent
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 GLBAIdempotent
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 bundleAIdempotent
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 fileAIdempotent
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 directoryAIdempotent
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 donorsBRead-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 GLBARead-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 bundleARead-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 sourcesARead-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 clipAIdempotent
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 targetAIdempotent
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 sourcesARead-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 packAIdempotent
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 sourcesARead-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 packsARead-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 guidanceARead-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 availabilityARead-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 fileAIdempotent
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 assetARead-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 assetAIdempotent
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 filtersBRead-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 promotionsARead-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 ownsARead-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 assetsCRead-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 packAIdempotent
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 downloadsARead-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 assetARead-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 categoriesARead-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 filesARead-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 assetsBRead-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 URLsARead-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 modelARead-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 categoriesARead-onlyIdempotent
List public Sketchfab model category names and slugs.
Inputs: no named parameters. Returns: provider, categories
sketchfab_search_modelsSearch Sketchfab modelsARead-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 assetARead-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 filesCRead-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 assetsARead-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
Scored across 41 tools
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.
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.
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.
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
Related MCP Connectors
An MCP server that provides asset auto generator
MCP registry & directory: search, find & install 31k+ MCP servers & tools. Catalog and marketplace.
Search and install 4,000+ security-scanned MCP servers from inside any MCP-aware AI client.
MCP server for accessing curated awesome list documentation
Related MCP Servers
- AlicenseBqualityDmaintenanceAn MCP server that allows searching for and retrieving information about Model Context Protocol servers registered on the MCP Hub.12MIT
- FlicenseNot gradedqualityFmaintenanceAn MCP server for the Envato API that enables searching, purchasing, and downloading assets.-
- AlicenseNot gradedqualityDmaintenanceA Python MCP server for searching, downloading, extracting, inspecting, and previewing game assets from multiple public sources.6MIT
- AlicenseAqualityDmaintenanceThis MCP server enables free web search and page content extraction using real browsers, with support for multiple search engines and stealth browser backends. It provides tools for searching, fetching pages, and setting up the Camoufox stealth browser.3MIT