Put 3D models in someone's real room: generate, arrange, and hand back one AR link.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
Drop a full augmented-reality studio into any web page.
Place as many 3D models as you like in your real room through the camera, describe a new one and watch it appear, arrange everything by hand, then share the whole scene as a link, a QR code, or a live room someone else can build in with you.
Live demo Β· npm Β· MCP server
That is a working AR studio. No build step, no API key, no account. It comes wired to a free library of a few hundred public-domain models and a free, keyless text-to-3D lane; point it at your own catalogue with one option when you are ready.
Every web-AR drop-in places exactly one model and then hands off to a native viewer, which ends the session. This one keeps the whole scene in your page:
XRAnchor per placed
model, real-world light estimation, and depth occlusion so models hide behind your furniture.USDZExporter, no server involved) and, because it is
exported from the copy already standing in your scene, it arrives at the size you pinched it
to and in the pose it was in. Android without WebXR gets Scene Viewer. Desktop gets a grid
preview and a QR hand-off to a phone.The rendering ladder, anchor lifecycle, retargeting pipeline, scene format and shared-room protocol are extracted from the AR surfaces running in production on three.ws, and generalized so they work on your site with your models.
three is a peer dependency, so you keep one copy of it and pick the version. The CDN bundle
(dist/ar-studio.min.js) has three.js inside it and needs nothing else.
The studio fills its host element absolutely, so give the host a height (any positioned box
with a real height works; a <div> with no height gets a sensible 70vh default rather than
rendering invisibly).
deploy prints every git and gh command before it runs it. It needs
git and the GitHub CLI; without them it tells
you the three manual steps instead of failing silently.
Templates: static (one HTML file, no build), vite, react.
Both 3d-ar-studio and ar-studio run the CLI. The MCP server is a separate
binary in its own package, so npx 3d-ar-studio-mcp resolves cleanly: see
MCP server.
The tray is filled from three.ws by default: a few hundred public-domain (CC0) props, free for
commercial use, served with open CORS. Swap in your own with the assets option.
A JSON file anywhere. Five common shapes are read without reshaping:
Per entry, the model URL is read from the first present of src, url, glb, glb_url,
glbUrl, file or model; the label from title, label, name or prompt; and the
thumbnail from poster, thumb, thumbnail, image or preview_image_url. Anything that
is not an https (or site-relative) URL is dropped rather than handed to the loader.
A list you hold in code:
Several tabs at once, in the order you want them:
Built-in keys: 'three.ws' (the default set), 'recent', 'objects', 'community', 'link'.
Anything else. A source is an object with a list():
Throwing from list() is fine: the tray renders a designed error state with a Retry button.
Your users can retarget it too, without touching your code: ?assets=https://β¦/manifest.json
on the page URL. Only https URLs are accepted, and every model source is re-validated before it
reaches the loader, so a hostile link can add a catalogue but can never smuggle a
javascript: or data: model into the scene. Set allowUrlOverride: false to switch that off.
Models are loaded by the browser, so the host serving your .glb files has to allow
cross-origin requests (access-control-allow-origin). If a model fails to load, that is
almost always why, and the studio says so in the status line rather than failing silently.
| Option | Default | What it does |
|---|---|---|
assets | 'three.ws' | Where models come from: a preset key, a manifest URL, a source object, or an array of them. |
generate | enabled | { enabled, endpoint, kind, tier, timeoutMs, pollMs }. endpoint is any MCP server exposing a compatible generate tool. |
rooms | enabled | { enabled, server }. Point server at your own Colyseus deployment to host shared rooms yourself. |
animations | three.ws idle clip | { enabled, manifestUrl, clip }. The clip retargeted onto humanoid models that ship no animation. |
lighting | 'studio' HDRI | { preset, urls }. preset: null uses procedural lighting only and downloads no HDRI. |
branding | : | { title, accent, backHref, backLabel }. |
shareBaseUrl | this page | Where share links and QR codes point. |
origin | https://three.ws | Origin for the hosted "View in your space" launcher and viewer links. |
persistKey | 'ar-studio:scene:v1' | localStorage key for the saved scene. Change it to run two studios on one origin. |
persist | true | Restore the last scene on load. |
maxPlacements | 20 | Cap on simultaneous models. Keeps low-end phones interactive. |
fullscreen | auto | Render as a fixed full-screen layer. Defaults to true only when mounted on document.body. |
allowUrlOverride | true | Honour ?assets=, ?src=, ?room= and ?forge= on the hosting page's URL. |
onEvent | null | Called with (event, detail) for every notable action. Wire it to your analytics. |
| Parameter | Effect |
|---|---|
?assets=<https url> | Swap the catalogue. |
?src=<glb>&title=<name> | Load models into the scene. Repeatable. |
#s=<payload> | Reopen a full arrangement, transforms included. Written by shareUrl(). |
?room=<code> | Join a shared room. |
?forge=<prompt> | Start a generation on load. |
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/3d-ar-studio)<a href="https://allmcps.com/mcp/3d-ar-studio"><img src="https://allmcps.com/api/badge/3d-ar-studio?style=directory" alt="3D AR Studio on AllMCPs" /></a>