# 3DGarden for AI assistants 860 models, 19 collections. MCP server: https://www.3dgarden.app/mcp (HTTP, Authorization: Bearer ). Setup: https://www.3dgarden.app/tools/mcp ## Overview 3DGarden is a library of handmade 3D models, optimised for the web: one light GLB per model, free for personal and commercial projects (https://www.3dgarden.app/licence). The usual path: search_models (or find_matching from a model you have) to shortlist, get_model to read a model and SEE its render, download_model for a link to its .glb, then fetch that link into the project yourself. Building a whole place: start from a collection (list_collections, get_collection). Its models share one texture atlas and one light rig and are made to sit together. Show the user instead of describing: preview_scene gives a page they can open and orbit. If the library has nothing suitable, say so and offer report_need. Never pass off an unrelated model as a match. ## Metadata get_model's `metrics` are measured from the file itself: - size_m: width (x), height (y), depth (z) in metres, the glTF unit, as the model stands with its node transforms. - origin.at: where the model's origin is ('on the base, centred' is the norm). origin.stand_on_ground says how to set position.y to stand it on a floor. - triangles, vertices, draw_calls: its cost in a frame. One draw call per primitive. - materials, textures (with pixel sizes), animations (name and length in seconds), skinned, morph_targets, extensions. Compare size_m before placing models together, and pick a model of the right size rather than rescaling one far from its size. ## Loading Every model is Draco compressed (draco: true): GLTFLoader needs a DRACOLoader. import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js'; import { DRACOLoader } from 'three/addons/loaders/DRACOLoader.js'; const loader = new GLTFLoader().setDRACOLoader(new DRACOLoader().setDecoderPath('https://www.gstatic.com/draco/versioned/decoders/1.5.7/')); const gltf = await loader.loadAsync('/models/.glb'); scene.add(gltf.scene); Self-host the decoder (three/examples/jsm/libs/draco/) for an offline or strict-CSP project. Any glTF 2.0 engine works the same way (Babylon.js, PlayCanvas, Godot, Unity with glTFast, Blender). ## Lighting The renders on the site use ACESFilmic tone mapping, a RoomEnvironment through PMREM, a shadow-casting key light, a weak fill and rim, a hemisphere and a little ambient. get_model's `lighting` gives the exact values for that model (its collection's rig) and `lighting.three_js` the lines that rebuild it. Set renderer.outputColorSpace to SRGBColorSpace (the default). Without an environment map, the materials read flat and dark. ## Collections A collection is a themed set (list_collections). Its models share ONE texture atlas, so a scene built from one collection uploads that image once, and they share one light rig. get_collection lists every part with its size, gives a layout to start from and, with download: true, a link for each. Mixing collections works, but light the scene with one rig. ## Colourways Some models come in colourways (get_model `colours`): the same model with another atlas. Ask download_model for one with `colour`: the file arrives with that colour baked in. A collection's models share its colourways. ## Animations Animated models list their clips in metrics.animations. In three.js: const mixer = new THREE.AnimationMixer(gltf.scene); mixer.clipAction(gltf.animations[0]).play(); // every frame: mixer.update(clock.getDelta()); search_models with animated: true finds them. ## Scenes To compose: pick an anchor model, call find_matching on it (same collection first, then shared style, material and colour, spread across categories), check sizes in metrics.size_m, then preview_scene with the slugs so the user can see the set before anything is downloaded. Stand every model on the ground with origin.stand_on_ground, and keep a triangle budget with max_triangles on search_models and find_matching. ## Downloads download_model answers with a link valid 15 minutes that needs no key: fetch it (curl -L -o public/models/.glb "") and save the file in the project. Never paste the link into code: it expires. The account behind the key must have confirmed its email. Calls are limited to 60 a minute per key (whoami shows it). Licence: use and modify in unlimited personal and commercial projects; selling the model files themselves, alone or in a pack, is not allowed. ## Tools - search_models: Search the 3D model library. Every filter is optional and they combine; tags are ANDed. Returns one page of records plus the total, and `coverage`: "good", "thin", "none" (we do not have it: say so and offer report_need rather than substituting something unrelated) or "filtered_out" (we have it, a filter removed it). `unmatched_terms` names the words nothing in the library mentions. Use compact: true when surveying rather than choosing. list_categories, list_collections and list_tags give valid slugs. - get_model: Everything about one model, plus its render as an image so you can check it is the right one. `metrics` are measured from the file: size_m (x, y, z in metres), origin (where it sits and how to stand the model on the ground), triangles, vertices, draw_calls, materials, textures with pixel sizes, animation clips, skinned, morph_targets. `lighting` is the rig the render was made under, with `three_js` lines that rebuild it. Also the description, category, collections, tags and colourways. - find_matching: Given one model, the models that BELONG IN A SCENE WITH IT: its own collection first (one texture atlas, one light rig), then shared style, material and colour, spread across categories so you get a tree, a bench and a lamp rather than eight trees. Each row says `why`. Returns a preview_url showing them all together. Use it to turn a single pick into a scene. - preview_scene: A page the user can OPEN and orbit, with up to 12 models standing side by side at their real sizes, lit like the site. Give the user the URL instead of a block of code they cannot run, before downloading anything. Needs no account to view. - download_model: A link to the model's .glb file, valid 15 minutes, that needs no key. Fetch it and save the file in the project, e.g. curl -L -o public/models/.glb "". Never paste the link into code: it expires. Optionally ask for one of the model's colourways (its "colours" in get_model): the file arrives with that colour baked in. - get_collection: Every model of one collection (a themed set made to sit together: one texture atlas, one light rig), each with its size and triangles, the rig as three.js, a `layout_code` that loads them all from one folder and stands them side by side on the ground, and a preview_url. With download: true, a link for every part too (valid 15 minutes), so a whole set is one call. - list_categories: The fixed categories every model is filed under, with how many models each holds. - list_collections: Themed sets of models that share a texture atlas and a lighting rig, made to be used together in one scene. get_collection gives one whole. - list_tags: Tags in use, most used first, with how many models carry each. Kinds: type, style, colour, material. - get_help: Guidance by topic: what the metrics mean, loading Draco files, lighting like the renders, collections, colourways, animations, composing scenes, downloads and the licence. Call it before a multi-step build, or when a tool did not behave as you expected, instead of guessing. - report_need: The only tool that writes. Four kinds: asset (we do not model what the user asked for: offer this whenever a search comes back "none" or "thin"), capability (you needed the server to do something it cannot), output (a tool answered, but not with what you needed), docs (a description did not tell you how to use a tool). Do not stay quiet about a rough edge to be polite: a report costs one call and is read by the people who make the models. - whoami: The account and API key this server is connected with, whether it can download yet, and the rate limit. Call it when a download fails, rather than guessing whether the key or the model is the problem.