io.github.nirholas/threews-3d-studio
Turn text or an image into an interactive, textured 3D model (GLB). By three.ws.
FREE — start here. Returns an overview of the three.ws 3D Studio MCP server: every tool and what it does, how to access it, and useful links. No payment or account required. Call this first to orient.
Turn a text description into a textured 3D model (GLB). Runs a fast text-to-image pass, then reconstructs a mesh from that image with the three.ws image engine. Returns a job_id (poll with generation_status) plus the intermediate preview image. Best results: a single, clearly described object — "a worn leather armchair", "a low-poly red fox", "a sci-fi helmet".
Reconstruct a textured 3D model (GLB) from a reference image using the three.ws image engine. Pass a single image_url, or image_urls (2–4 views of the SAME object from different angles — front/back/left/right) for multi-view reconstruction, which removes the back-of-object hallucination of single-image reconstruction. Returns a job_id to poll with generation_status, plus how many views were fused and which engine handled it. The cleaner the inputs — one subject, plain background, even lighting — the better the mesh.
Poll a text_to_3d or image_to_3d job by its job_id. While running it reports the status; when finished it returns the GLB download URL and an inline <model-viewer> artifact — display that text/html resource as an interactive 3D artifact.
Turn a video of a real space (a room, a street, an object walkaround) into an explorable 3D point cloud. A feed-forward streaming reconstructor (LingBot-Map) grounds coordinates, reads dense geometry, and corrects drift across the whole clip, then returns a coloured .ply point cloud. Pass a public https video URL (mp4/mov/webm). Returns a job_id — poll generation_status; when finished it returns the point-cloud URL and an inline viewer artifact. Best with steady, well-lit footage that orbits or walks through the space. This is geometry capture of a REAL scene — distinct from text_to_3d/image_to_3d, which synthesize a single object mesh.
Render any public GLB URL as an inline <model-viewer> HTML artifact — orbit controls, AR on mobile, auto-rotate. Display the returned text/html resource as an inline 3D artifact. Use it to view a generated model, or any GLB on the web.
Strip the background from a photo or illustration with the three.ws background-removal engine. Returns a PNG with a transparent background — useful for preparing clean inputs before image_to_3d reconstruction.
Process an existing GLB/OBJ/STL/PLY mesh: fix holes and degenerate geometry, reduce face count via quadric decimation, or convert to a different format (including FBX with skeleton for Unity/Unreal — a convert of a rigged GLB keeps its bones, skin weights, and blendshapes). Returns a clean GLB (or the requested format) job_id to poll with generation_status.
Transform any GLB/OBJ/STL/PLY mesh into a stylized variant with a single geometry pass — no model inference, fast and cheap. Styles: "voxel" (blocky cubes on a grid), "brick" (voxels + studs, LEGO-like), "voronoi" (open strut-and-node lattice shell), "lowpoly" (decimated + hard flat-shaded facets). Source color is preserved where the style allows. Returns a job_id to poll with generation_status; typically completes in 10–40 seconds.
Segment a GLB/OBJ/STL/PLY mesh into meaningful parts with clean boundaries — head/torso/limbs on a character, body/wheels on a vehicle. Splits at physically disconnected shells and at concave creases (the minima rule), then names each part by region and tints it a distinct colour. Returns a GLB whose nodes ARE the parts (so each can be hidden, recoloured, replaced, or exported on its own) plus a parts manifest. Poll with generation_status; the result lists every part with its id, name, face count, and colour. Pass only_part to export a single part on its own.
Generate a fresh texture for an untextured or poorly-textured GLB with the three.ws depth-guided multi-view texturing engine. Renders the mesh from 8 viewpoints, generates coherent texture views guided by your prompt, and back-projects them onto the UV atlas. Returns a job_id to poll with generation_status.
Surgically repaint ONLY a region of an existing texture from a prompt and/or colour, leaving the rest of the surface untouched and feathering the seam so the edit is invisible. Real UV-space texture inpainting — fix a seam, recolour one panel, add a logo to a chest plate. Supply mask_url: a UV-space mask PNG in the model's own UV layout where WHITE marks the area to repaint and black is preserved. Safe to run repeatedly — chain passes by feeding the previous result GLB back in as mesh_url. Returns a job_id to poll with generation_status.
Turn a static GLB mesh into an animation-ready character: adds a humanoid skeleton and per-vertex skin weights via the three.ws rig pipeline. Pairs with text_to_3d / image_to_3d — generate a mesh, then rig it, then drive it with apply_animation or pose_model. Returns a job_id; poll generation_status for the rigged GLB.
Map a natural-language pose description to a deterministic pose-studio seed and the full Euler joint-rotation map for the three.ws humanoid mannequin, picked from the in-repo preset library. Returns the preset id, the complete pose (radians per joint), a stable seed, and a previewUrl on three.ws/pose. Deterministic and free — the same prompt always yields the same pose. Pair with auto_rig_model to pose a rigged character.
Rewrite a rough idea into an optimized text_to_3d prompt using IBM Granite. Returns one clean single-subject description plus structured directives (subject, style, materials, colors, detail) that produce cleaner meshes. Run before text_to_3d when a prompt is vague, conflicting, or multi-subject. Requires IBM watsonx.ai credentials on the server.
Generate a physically-based (PBR) glTF 2.0 material from a text description using IBM Granite — base color, metallic, roughness, and emissive factors. Returns a pbrMetallicRoughness material object you can attach to a generated mesh. Requires IBM watsonx.ai credentials on the server.
Persist a generated GLB (e.g. the glb_url returned by generation_status) as a durable avatar in your three.ws library. The mesh is copied into our own storage so it survives the provider URL expiring, then registered as a named avatar you own. Returns avatar_id, slug, model_url, and a view_url. This is the bridge from the studio to the avatar system: after saving, get_avatar, render_avatar_image, embeds, and on-chain identity all work on the result. Requires you to be signed in.
Turn a generated GLB into a NAMED, persistent agent body — a "persona" the agent reuses across turns and across sessions. The mesh is copied into durable storage so the body survives the provider URL expiring, then registered under a stable persona_id. The returned text/html resource renders the LIVING body inline: it idles between turns, and persona_say makes it lip-sync and emote a reply. The persona_id is the capability — keep it and pass it to get_agent_persona or persona_say later to bring the exact same body back. No sign-in required.
Bring back a previously minted persona by its persona_id — the SAME body and identity, in a fresh session. Returns the persona name, its GLB, accumulated turn count, and the inline living-body artifact. Use this at the start of a conversation when the user returns to a named agent.
Make a persona PERFORM a reply: the body lip-syncs the text and shows the matching expression and body gesture. Pass the persona_id and the exact text the agent is saying this turn; the emotion is detected from the text automatically (or override it). The returned text/html resource animates the body for this turn — display it alongside the spoken reply. This is the turn-by-turn embodiment hook.
Check whether a structured-content payload conforms to the open Spatial MCP artifact shape — the standard for returning a live, interactive 3D scene as a first-class MCP tool result (scene GLB, camera, environment, animation, AR handoff, interaction affordances). Returns valid/invalid plus actionable errors and warnings (each naming the field and the fix), not just a boolean. Spec version 0.1. Use it to conform a third-party 3D tool result to the shape so any Spatial-MCP renderer can display it.
Turn a generated 3D model (GLB URL) into a one-tap "View in your space" AR experience. Returns a device-aware AR launch link (iOS Quick Look, Android Scene Viewer, desktop WebGL — branched on the viewer's device), the interactive viewer link, and a conformant Spatial MCP artifact with the AR handoff populated. Use it after generating a model so the user can place it on their desk through their phone. For a rigged avatar (an agent's body) pass kind:"avatar": the response then also carries irlUrl, a living-agent link that walks, animates, and talks with the user through their camera in their real room.
Verify whether a 3D model (GLB) carries a genuine three.ws content credential and was not tampered with. Recomputes the model’s content hash, checks the signed credential and its on-chain anchor, and returns verified, tampered, or unknown — with who created it, from what prompt, by which model, and when. Free and public: no account, no payment. Pass glb_url (an https .glb) or a known content hash.
Issue a signed content credential for a generated 3D model (GLB) and anchor its hash on Solana, so anyone can later verify authenticity and tampering for free with verify_provenance. Records creator, prompt, model/provider, lineage, timestamp, and the GLB content hash. Real signature, real on-chain anchor.
Read a persona's real on-chain identity: its deterministic Solana wallet address, live SOL/USDC balance, ERC-8004-style reputation (verified feedback + validation record), token holdings, and a resolved SNS nameplate if it holds a verified .sol name. Also returns the visual tiers (reputation tier, holdings tier, muted-balance flag, verified name) the embodiment viewer maps onto the body — aura, cosmetic, muted state, nameplate. Every persona has a wallet the moment it exists; a fresh persona legitimately reads as zero balance / unranked reputation until it is funded or interacted with. No sign-in required.
Send a small USDC tip FROM a persona's own wallet to a destination Solana address — e.g. tipping another agent for a good answer or hiring result. Real, irreversible on-chain settlement, hard-capped at $1/call and $5 cumulative per session. Amounts over $0.25 require confirm:true. Fails cleanly with the exact reason (insufficient balance, over cap, confirmation required) — never a silent no-op.
Send USDC FROM a persona's own wallet to a destination Solana address — the general-purpose value op behind persona-initiated payments (settling a hire, paying an invoice, funding another wallet). Real, irreversible on-chain settlement, hard-capped at $1/call and $5 cumulative per session. Amounts over $0.25 require confirm:true. USDC is the only settlement asset here — any other mint is out of scope for this tool.
Parse a remote GLB or glTF and return structural stats: scene/node/mesh counts, vertex and triangle totals, material and texture summaries, extensions used. Pure inspection — no optimization advice.
Inspect the model and return actionable suggestions for reducing size and draw-call overhead: triangle budget, Draco/Meshopt compression, oversized textures, KTX2 transcoding, non-indexed primitives, redundant materials, and more.
List the curated, retargetable animation presets in the three.ws library — name, label, category, and whether the clip loops. Use this to discover valid `animation` values for apply_animation.
Retarget a curated animation preset onto a caller-supplied rigged humanoid GLB. Returns the retargeted three.js AnimationClip JSON (keyed to the rig's actual bone names, hip translation rescaled to its proportions) plus a retarget report — load it alongside the model and play. Set format="glb" to also bake an animated GLB server-side (best-effort: textured rigs may exceed the headless bake budget and fall back to clip JSON — the /pose gallery is the guaranteed GLB export). SSRF-hardened: only public https model URLs are fetched.
Generate a brand-new motion from a natural-language prompt (e.g. "waving confidently", "a slow tai-chi sweep") with a motion-diffusion model, then retarget it onto a caller-supplied rigged humanoid GLB — the same retarget engine apply_animation uses. Returns the retargeted three.js AnimationClip JSON (or a baked animated GLB) plus a report. Unlike preset libraries, the motion does not pre-exist: it is synthesized for the prompt. Requires the text2motion worker configured on the deployment.
| Timestamp | Status | Latency | Conformance |
|---|---|---|---|
| Jul 17, 2026 | success | 72.2ms | Pass |
| Jul 14, 2026 | success | 47.6ms | Pass |
| Jul 12, 2026 | success | 197.8ms | Pass |
| Jul 8, 2026 | success | 72.2ms | Pass |
| Jul 8, 2026 | success | 843.5ms | Pass |
| Jul 3, 2026 | success | 146.3ms | Pass |
| Jun 30, 2026 | success | 127.7ms | Pass |
| Jun 27, 2026 | success | 177.7ms | Pass |
| Jun 25, 2026 | success | 212.3ms | Pass |
| Jun 24, 2026 | success | 453.3ms | Pass |