3DAssets.dev

Search and download free CC0 GLB 3D models and game asset packs, and submit new ones on a user's behalf. Remote server at https://3dassets.dev/mcp.

Documentation

MCP server

Streamable-HTTP MCP endpoint at /mcp. Search and fetch without auth; add a Bearer API key to submit on a user’s behalf.

Connect

One command per client. The API key is only needed to submit models; searching and fetching work without it.

claude mcp add --transport http 3dassets https://3dassets.dev/mcp
npx -y 3dassets-mcp

Claude Desktop or any stdio mcp.json

{
  "mcpServers": {
    "3dassets": { "command": "npx", "args": ["-y", "3dassets-mcp"] }
  }
}

Claude Code, with an API key

claude mcp add --transport http 3dassets https://3dassets.dev/mcp --header "Authorization: Bearer <apiKey>"
codex mcp add 3dassets --url https://3dassets.dev/mcp

Codex CLI, with an API key

THREEDASSETS_KEY=<apiKey> codex mcp add 3dassets --url https://3dassets.dev/mcp --bearer-token-env-var THREEJSASSETS_KEY
code --add-mcp '{"name":"3dassets","type":"http","url":"https://3dassets.dev/mcp"}'
{
  "mcpServers": {
    "3dassets": {
      "url": "https://3dassets.dev/mcp",
      "headers": { "Authorization": "Bearer <apiKey>" }
    }
  }
}

The npm package 3dassets-mcp is a thin stdio bridge to the same hosted server, for clients that only launch commands or want a pinned dependency; set THREEDASSETS_API_KEY in its environment to submit models. The server is also listed on the official MCP Registry as dev.3dassets/catalogue.

In ChatGPT itself, remote MCP tools arrive through plugins rather than a URL you paste; use the prompt route there. Any other client that reads a link and calls an API can use skill.md without MCP at all.

Tools

ToolAuthDoes
search_assetsnoneSearch by text, category, theme, style and tags
search_packs · get_packnoneFind cohesive game kits and fetch complete file manifests, budgets and starter scenes
list_demos · get_demononeWalkable demo scenes built from one pack each: the spawn, the bounds and every placement with its CDN URL, so an agent can rebuild the layout
get_assetnoneFull details incl. CDN URL, licence + attribution text, stats, snippets
get_asset_usagenoneLoader code or import steps for three.js, R3F, model-viewer, Blender, Godot and Unity
list_categories · list_tags · list_licensesnoneSlugs the other tools accept
list_ai_modelsnoneModel name suggestions for AI provenance, refreshed hourly; custom names are accepted
create_accountnoneCreate a contributor account; emails the user a 6-digit code
verify_accountnoneExchange the code for the user’s API key (shown once)
submit_asset_from_urlkeySubmit a.glb from a public https URL
get_upload_urlfinalize_uploadkeyDirect byte upload for clients that can PUT files
my_assets · update_assetkeyTrack and edit the user’s submissions
submit_pack · my_packskeyGroup the user’s uploads into a pack proposal and track it

Resource template asset://{slug} returns the Markdown rendition of an asset.

CC0 submissions

Uploads default to CC0 1.0 Universal. Omit license, or send cc0-1.0; other licences are rejected. Before setting attestation: true, the user must confirm their publishing rights and accept irrevocable CC0 dedication, allowing personal and commercial use without attribution. One confirmation can cover an identified batch. Do not ask the user to select a licence or tags.

list_licenses returns CC0 only. Licence and attribution fields remain in responses for compatibility and historical records.

Behaviour agents can rely on

  • Every result carries the licence. If attributionRequired is true, the exact attribution string is included. Put it in the user’s credits.
  • All files load with a plain GLTFLoader; there is never a need to configure Draco or KTX2.
  • Submissions are reviewed by a person, and so is any edit to an asset that is already published. Tell the user the outcome arrives by email and can be tracked with my_assets.
  • Rejections and failures come with a human-readable reason. Relay it verbatim.

Rate limits

Tool calls are counted the same way as REST calls, against your API key when the server is configured with one and against your IP address otherwise. Read tools share one bucket; submit_asset_from_url, get_upload_url, finalize_upload, update_asset and submit_pack count as submissions; create_account and verify_account count as account calls.

WhatAnonymous (per IP)With an API key
Search & read GET /api/v1/*, /assets/{slug}.md, MCP read tools120/min · 1,000/hour240/min · 3,000/hour
Downloads /download/{slug}60/min · 300/hour · 1,000/day120/min · 600/hour · 3,000/day
Submissions & edits POST /api/v1/assets, /assets/from-url, /uploads/presign, /packs/submissions, /reports, MCP write tools5/min · 30/hour · 100/day20/min · 150/hour · 400/day
Accounts POST /api/v1/accounts/verify, /accounts/session, key rotation10/hour · 30/day10/hour · 30/day
Account emails POST /api/v1/accounts, /accounts/login-code, /accounts/resend6/hour · 20/day6/hour · 20/day

Over the limit the call comes back as a JSON-RPC error (-32029) over HTTP 429 with a Retry-After header, and the message says how long to wait. Relay that to the user and pause: do not retry in a loop, and never split one job across several keys. Pulling a whole pack for a scene is expected and fits well inside the limits; re-fetching the catalogue is not.

AI model attribution

Set aiGenerated: true if AI helped create geometry, generating code or textures, and optionally include aiModel (up to 160 characters). Use GET /api/v1/ai-models?q=... or MCP list_ai_models for OpenRouter suggestions refreshed hourly. Custom model and 3D-tool names are accepted. Leave unknown models unspecified; never guess. Using an agent only to upload does not count as AI creation.

The asset info panel, JSON and Markdown show this as contributor-reported attribution. A model catalogue outage does not block uploading. Switching AI use off clears the model name.