Three-Live
Compiles Three.js scenes to native Android rendering via Google Filament and Jetpack XR, including zero-copy GLB loading and spatial XR traits.
Compiles Three.js scenes to GLB (binary glTF) for native runtimes and zero-copy loading.
Compiles Three.js scenes to Apple RealityKit for native iOS rendering, including live KHR_interactivity, physics, and spatial traits.
Supports native macOS RealityKit rendering of compiled Three.js scenes, including live interactivity and physics.
Compiles, validates, renders, and simulates Three.js scenes, serving as the core input format for AI-generated 3D content.
Renders the same Three.js scenes in WebGL2/WebXR on the web, with 6DoF WebXR and mobile AR handoff.
Disclaimer: This is not an officially supported Google product.
Three-Live
AI-First Native 3D, CAD & Spatial Computing: On-device JIT compiler turning live, AI-generated Three.js into native Android (Google Filament & Jetpack XR), iOS & visionOS (Apple RealityKit), and WebXR.
⚡ Quickstarts (Android • iOS • CLI • Web) • 📦 Install (JitPack • SwiftPM • Cargo • npm) • ▶ Live 3D Studio • 🥽 Live Spatial XR Studio • 📚 Docs

LLMs and developers excel at writing concise Three.js code—not hundreds of lines of platform-specific native 3D, shader, and AR boilerplate. Three-Live compiles standard Three.js (THREE.Mesh, THREE.CSG, userData.xr, KHR_interactivity) on-device in a sandboxed Rust VM and renders natively in Google Filament and Jetpack XR SceneCore on Android, Apple RealityKit and Quick Look on iOS and visionOS, headless 4-up PNG contact sheets (three-live-cli) for AI coding agents, and WebGL2 / WebXR on the Web.
Quickstarts
1. Run Three.js natively on Android (Google Filament & Jetpack XR SceneCore)
Compile standard Three.js code over zero-copy JNI and drive native Google Filament rendering, 60 Hz physics, and Jetpack XR SceneCore spatial entities:
import com.google.threelive.FilamentHelper
import com.google.threelive.XRLiveRuntimeSession
import com.google.threelive.XRLiveSceneCoreHelper
val threeJsCode = """
const core = new THREE.Mesh(
new THREE.IcosahedronGeometry(0.55, 3),
new THREE.MeshStandardMaterial({ color: 0x38bdf8, metalness: 0.85, roughness: 0.15 })
);
core.userData.xr = { grab: '2-hand', orbit: { speed: -0.4 } };
scene.add(core);
""".trimIndent()
// Compile Three.js to a zero-copy GLB ByteBuffer and load directly into Google Filament
val holder = FilamentHelper.loadModelZeroCopy(threeJsCode) { buffer ->
assetLoader.createAssetFromBinary(buffer)
}
// Step live KHR_interactivity graphs, 60 Hz rigid-body physics, and spatial traits per frame
val runtime = XRLiveRuntimeSession.fromGlb(holder.byteBuffer)
runtime.step(dtSeconds = 1.0 / 60.0)
// Or attach interactive spatial traits (grab, scale, billboard, anchor) in Android XR SceneCore
XRLiveSceneCoreHelper.attachTraitsFromGlb(xrSession, entity, holder.byteBuffer)2. Run Three.js natively on iOS, macOS, and visionOS (Apple RealityKit)
Compile the exact same Three.js code into Apple RealityKit (ARView / RealityView) or .usdz:
import ThreeLiveCompiler
import RealityKit
@MainActor
func loadSpatialScene(from threeJsCode: String, into arView: ARView) async throws -> XRLiveRealityKitSession? {
let glb = try ThreeCompiler.compileToGLB(script: threeJsCode)
let entity = try await RealityKitHelper.loadEntity(fromGLB: glb)
XRLiveRealityKit.installTraits(on: entity, in: arView)
// Bind live KHR_interactivity, 60 Hz physics, and spatial traits to RealityKit SceneEvents.Update
let session = XRLiveRealityKitSession(glbData: glb, root: entity)
session?.installInputTargets()
session?.start()
return session
}3. Verify & compile Three.js headlessly for AI agents (three-live-cli & MCP server)
Render a 4-up orthographic/camera contact sheet (zero GPU required), run the spatial linter for JSON frustum/overlap telemetry, compile scene.js to .glb / .usdz, or attach three-live-cli mcp as a zero-dependency Model Context Protocol (MCP) stdio server (three_live_validate, three_live_render, three_live_convert, three_live_sim) in Claude Code, Cursor, Gemini CLI, or Windsurf:
$ npx three-live-cli render scene.js --view=quad --grid --annotations -o contact_sheet.png
$ npx three-live-cli validate scene.js --json
$ npx three-live-cli convert scene.js -o model.usdz
# Or register the built-in MCP server for closed-loop visual + spatial AI verification:
$ claude mcp add three-live -- npx -y -p three-live three-live-cli mcp4. Run on the Web (<three-live> and <xr-live>)
On the web, <three-live> (< 30 KB gz viewer, < 70 KB gz with the live Three.js compiler) and <xr-live> (< 82 KB gz) render the same Three.js scenes in WebGL2 and 6DoF WebXR with 1-tap mobile AR handoff:
// Standard Three.js scene (runs identically in Android, iOS, CLI, and Web)
const mesh = new THREE.Mesh(
new THREE.TorusKnotGeometry(0.4, 0.14, 64, 16),
new THREE.MeshStandardMaterial({ color: 0x38bdf8, metalness: 0.8, roughness: 0.15 })
);
mesh.userData.xr = { grab: '1-hand', billboard: 'capsule' };
scene.add(mesh);Related MCP server: threejs-devtools-mcp
Install packages and bundles
Package installation
1. Android (JitPack, GitHub Packages Maven, prebuilt release AAR, or source):
JitPack (
https://jitpack.io, no authentication required): Addmaven("https://jitpack.io")tosettings.gradle.kts, then add:dependencies { implementation("com.github.google.three-live:compiler:v1.3.1") // Optional adapters: :filament, :firebase-ai, :detect-mlkit, :hands-androidxr, :hands-mediapipe }GitHub Packages Maven (
https://maven.pkg.github.com/google/three-live): Configure the repository insettings.gradle.ktsand addimplementation("com.google.threelive:compiler:1.3.1")(plus optional:filament,:firebase-ai,:detect-mlkit,:hands-androidxr,:hands-mediapipe).Prebuilt AAR: Download
three-live-compiler-release.aar(includesarm64-v8a,armeabi-v7a, andx86_64JNI.solibraries) and optional adapter AARs (three-live-filament-release.aar, etc.) from GitHub Releases intoapp/libs/and addimplementation(files("libs/three-live-compiler-release.aar")).Maven Local (
com.google.threelive:compiler:1.3.1): Run./gradlew :mobile:android:publishReleasePublicationToMavenLocaland addimplementation("com.google.threelive:compiler:1.3.1").From source: Run
make android(orbash scripts/build_android_aar.sh).
2. iOS, macOS, and visionOS (Swift Package Manager):
.package(url: "https://github.com/google/three-live.git", from: "1.0.0")Swift Package Manager automatically resolves the prebuilt, checksum-pinned
ThreeLiveCompiler.xcframework.ziparchive from GitHub Releases—no local Rust or Node.js toolchain is required.3. Rust CLI (
three-live-cli) and library crate (Crates.io, prebuilt binaries, or source):Crates.io (library & CLI):
cargo add three-live-compiler # Or install the standalone CLI binary from Crates.io: cargo install three-live-compiler --bin three-live-cliPrebuilt binaries: Download standalone binaries for macOS (
arm64andx86_64), Linux (x86_64andaarch64), and Windows (x86_64.exe) from GitHub Releases.From source: Run
make rust(npm run build && cargo build --manifest-path compiler/Cargo.toml --release --bin three-live-cli).
4. Web (npm, CDN, prebuilt release, or source):
npm:
npm install three-live xr-liveHosted ES module (
jsDelivror GitHub Pages CDN): Loadhttps://cdn.jsdelivr.net/npm/three-live/dist/three-live.min.jsorhttps://google.github.io/three-live/dist/three-live.min.js.Prebuilt bundle archive: Download
three-live-web-dist.zipfrom GitHub Releases.From source: Run
git clone https://github.com/google/three-live.git && cd three-live && npm install && npm run build.
Why Three-Live and XR-Live
Native mobile and headset AR/XR from Three.js
In practice, browser WebXR (navigator.xr) only covers part of the device
landscape:
Android System
WebView, iOS Safari, and iOSWKWebViewdon't support WebXR. A WebXR-only app can't run inside an embeddedWebVieworWKWebViewin a native Android or iOS app, and can't enter AR in Safari on iPhone or iPad.Static OS handoffs (
Scene ViewerandAR Quick Look) strip interactivity. Exporting a static.glbor.usdzfile to the OS previewer works for viewing a model, but drops Three.jsanimate()loops, 60 Hz physics, custom state, and interactive plugins.Browser WebXR doesn't use native spatial compositors. On Android, browser WebXR renders WebGL2 in the browser process rather than using Google Filament or Jetpack XR SceneCore's
HomeSpaceshared space. On visionOS, browser WebXR runs in an isolated fullscreen VR session without camera passthrough or SwiftUI Shared Space integration.
Three-Live solves this by compiling the same Three.js code on-device and running it natively on each platform's own engine:
Target environment | What happens with browser WebXR or static AR handoff | What you can do with Three-Live and XR-Live |
Android phones and tablets (native Compose or View app) |
| Compile Three.js over JNI and render natively in Google Filament and ARCore ( |
Android XR and Apple Vision Pro headsets | Browser WebXR is isolated in a fullscreen WebGL session | Attach native Jetpack XR SceneCore ( |
iPhone and iPad (native SwiftUI app) |
| Run live Three.js scenes, |
Mobile and headset web browsers | Standard WebXR works on Android Chrome and headsets; iOS Safari has no WebXR | Run 6DoF WebXR where supported, with automatic Stereo SBS, gyroscope, and in-memory |
Compare <three-live> and <xr-live>
The following table compares the two runtime tiers across Android, iOS, and Web:
Capability |
|
|
Primary use case | 3D product viewers, parametric CAD/CSG, skeletal animation, and 1-tap AR handoff | Interactive 6DoF XR, native mobile AR/XR, spatial UI cards, depth physics, hand tracking, and 60 Hz simulations |
Three.js JIT compiler | Yes (sandboxed Rust | Yes (inherits |
Android & iOS runtime | Google Filament ( | Native Android ( |
Spatial interaction | Orbit controls, mesh picking, 3D surface hotspots, | Declarative |
Web bundle budget |
|
|
Modular plugins across Android, iOS, and Web
Every capability works on both prebuilt .glb, .usdz, and .spz assets and
live Three.js scenes:
Compact core (
< 30 KBto< 82 KB gzon Web): The 3D viewer (three-live-viewer.min.js) is< 30 KB gz(< 70 KB gzwith the live Three.js compiler inthree-live.min.js), and the WebXR viewer (xr-live-viewer.min.js) is< 53 KB gz(< 82 KB gzwith the live Three.js compiler inxr-live.min.js).Core 3D, CAD, and animation plugins (
three-live, 15 plugins): Optional domain bundles (three-live-studio.min.jsat< 29 KB gz,three-live-cad.min.jsat< 10 KB gz, andthree-live-animation.min.jsat< 11 KB gz, or< 111 KB gzcombined inthree-live-full.min.js) addKHR_interactivitybehavior graphs, PBR Next materials,KHR_materials_variants,EXT_meshopt_compression, HDRI and spherical-harmonics lighting, contact shadows, 3D hotspots, post-processing (bloomandoutline), automatic multi-tier Level-of-Detail (lod/THREE.LOD/MSFT_lod), 2DShape/ExtrudeGeometry, 3DCSGBooleans, 3D vectorTextGeometry, 64-joint GPU skeletal skinning, morph targets, keyframe cross-fading, and two-bone / FABRIK inverse kinematics (ik).Hardware XR sensors (
xr-live-sensors.min.js,< 10 KB gz): Adds hardware XR depth occlusion (XRDepthManager), analytical heightfield physics (XRHeightfieldPhysics), 25-joint hand gesture classification (XRHandGestureClassifier), the desktop 6DoF keyboard/mouse simulator (XRDesktopSimulator), HRTF spatial audio earcons, and WebMCP agent tools.Spatial computing plugins (
xr-live-spatial.min.js, 15 plugins,< 63 KB gz): Each advanced spatial capability inxr-live-spatial.min.jsis a standalone, zero-dependency plugin (~2 to 5 KB gzeach) with a matching native implementation in the Android and iOS SDKs.Simulation and scenario plugins (
xr-live-sim.min.js, 6 plugins,< 26 KB gz): Six plugins for games, training drills, and safety walkthroughs add a controllable character, autonomous steering agents, deterministic 60 Hz rigid-body physics (rigid-body), integrity and trigger zones, checklist objectives with scoring and timers, and procedural audio cues across Android, iOS, and Web.
Core 3D, CAD, and animation plugins (three-live)
The following table lists the fifteen modular 3D, CAD, and animation plugins:
Plugin | Attribute or Three.js API | What it adds |
|
| Compiles and executes glTF |
|
| PBR Next material properties ( |
|
|
|
|
| Zero-WASM decoder and encoder for |
|
| Procedural studio environment lighting, HDRI skyboxes, and 9-band spherical-harmonics diffuse irradiance. |
|
| Soft ground-plane contact shadows and dynamic shadow-map updates matching scene bounds. |
|
| 3D surface-anchored annotations with normal-facing visibility culling and SVG leader lines. |
|
| Zero-server runtime |
|
| Dual-Kawase mipmap bloom, selection/hover silhouette outlines, and |
|
| Distance-based multi-tier Level-of-Detail switching with hysteresis, far-distance culling, automatic vertex-clustering mesh decimation ( |
|
| 2D |
|
| 64-joint GPU vertex skinning and skeletal hierarchy evaluation. |
|
| GPU morph-target vertex displacement and weight blending. |
|
| Linear, step, and cubic-spline ( |
|
| Analytic two-bone (arm/leg with pole vector) and multi-joint FABRIK inverse kinematics chains. |
Spatial perception, splat, audio, and multimodal AI plugins (xr-live)
The following table lists the eight perception, rendering, audio, and AI plugins across Android Filament, iOS RealityKit, and WebXR:
Plugin | Attribute or | What it adds across Android Filament, iOS RealityKit, and WebXR |
|
| Lazy HUD head or hand follow with an angular deadzone and critically damped spring, plus 3D satellite orbits. |
|
| Four top-corner uniform scale handles and a bottom pedestal yaw-rotation bar that emit |
|
| Real-world plane and mesh tracking, surface-normal gaze reticle, |
|
| Real-time bidirectional WebSocket vision and 16/24 kHz PCM voice streaming, barge-in cancellation, live transcription, and press-and-hold mesh queries. |
|
| Pinch-to-paint 3D Catmull-Rom spline strokes extruded as twist-free parallel-transport tubes with |
|
| GPU-friendly |
|
| Streams |
|
| 3D positional and directional spatial audio emitters with 8 zero-asset ambient loop presets ( |
CAD review, spatial layout, locomotion, and co-presence plugins (xr-live)
The following table lists the seven CAD, layout, locomotion, and multi-user plugins across Android Filament, iOS RealityKit, and WebXR:
Plugin | Attribute or | What it adds across Android Filament, iOS RealityKit, and WebXR |
|
| Live |
|
| Magnetic socket snapping with |
|
| Hands-free eye and head gaze raycasting with EMA smoothing, |
|
| Multi-part CAD assembly explosion with staggered layers, dashed leader lines, two-hand spread gesture, and GPU cross-section slicer. |
|
| Three-tier pose persistence across reloads and sessions via shareable |
|
| Ballistic parabolic teleport arc with walkable and blocked surface validation, thumbstick snap-turn or smooth glide, and a |
|
| Zero-dependency multi-user co-presence ( |
Interactive simulation, agent, and scenario plugins (xr-live-sim)
The following table lists the six simulation plugins across Android Filament, iOS RealityKit, and Web:
Plugin | Attribute or | What it adds across Android Filament, iOS RealityKit, and Web |
|
| Capsule kinematics with floor and slope stepping, jump with coyote time, keyboard, gamepad, and touch-joystick input, and |
|
| Autonomous kinematic agents ( |
|
| Deterministic 60 Hz Sequential Impulse rigid-body solver ( |
|
| Part and target |
|
| Ordered or unordered checklist objectives ( |
|
| Zero-asset procedural audio synthesis ( |
JavaScript bundles and enforced size budgets (Web)
Every web bundle targets es2020, strips full license blocks
(--legal-comments=none), and emits a single four-line SPDX header:
Family | Bundle file | Enforced budget ( | Included capabilities |
|
|
| Lean |
|
| Standard | |
|
| Add-on plugin: PBR Next extensions, HDRI and SH irradiance, | |
|
| Add-on plugin: 2D | |
|
| Add-on plugin: 64-joint GPU skeletal skinning, morph targets, animation cross-fading, and two-bone / FABRIK inverse kinematics ( | |
|
| All-in-one 3D bundle ( | |
|
|
| Lean |
|
| Standard | |
|
| Add-on plugin: Hardware XR sensors ( | |
|
| Add-on plugin bundle registering all 15 spatial plugins ( | |
|
| Add-on simulation plugin bundle registering all six simulation plugins ( | |
|
| All-in-one 3D, XR, and simulation bundle ( |
Safe execution for live, AI-generated Three.js
Because LLMs already know Three.js, an agent or backend can generate a complete
interactive 3D or XR scene in 15 to 30 lines of JavaScript without external
binary assets. Three-Live executes Three.js scripts inside a sandboxed Rust
Boa/QuickJS VM on Android and iOS, and inside a dedicated Web Worker or
opaque-origin <iframe sandbox="allow-scripts"> (connect-src 'none') on the
web—with network and storage globals removed, Object.prototype frozen, CPU
instruction fuel limits, and scene geometry memory quotas.
Project status
Three-Live is in Beta. Its core 3D, mobile AR/XR, and spatial computing
runtime, versioned userData.xr trait schema (schemaVersion: 1), sandboxed
JIT compiler, and three-target parity across Android XR, Apple RealityKit, and
Web are feature-complete and ready for integration and evaluation.
Prebuilt distributions: The Android release AAR (
three-live-compiler-release.aar), the Apple XCFramework (ThreeLiveCompiler.xcframework.zip), nativethree-live-clibinaries for macOS, Linux, and Windows, and standalone web JavaScript bundles (three-live-web-dist.zip) are published on GitHub Releases.Package registries: Published on JitPack / GitHub Packages Maven, Swift Package Manager, Crates.io (
three-live-compiler), npm (three-live), npm (xr-live), GitHub Releases, and the jsDelivr / GitHub Pages CDNs (see Install packages and bundles).Release notes: See
CHANGELOG.mdfor release history and architectural notes.
Documentation guide
The following guides cover the native mobile SDKs, spatial plugins, web components, and LLM authoring workflows:
Guide | Audience | Contents |
Android, iOS, and XR developers | Complete spatial and native SDK guide: Android ( | |
Mobile and web developers | Complete 3D reference: Three.js authoring, | |
All developers | Copy-pasteable Three.js recipes for e-commerce configurators, precision manipulation handles, Gemini Live spatial assistants, 3D spatial paint, CAD exploded views and measurements, magnetic snapping and persistent anchors, multi-user co-presence, and interactive training and simulation drills ( | |
LLMs and agents | Copy-paste system prompt snippet, canonical | |
Coding agents | Repository rules, three-target cross-platform parity contract, build and test commands, bundle budgets, and security invariants. | |
Agent skills | Progressive-disclosure | |
LLM context feeds | Single-file concise index ( | |
All users | Release notes and architectural summary for Three-Live releases. |
Build and run demos
Run make (or make help) from the repository root to build packages, run tests, or open the interactive studio demos:
$ make doctor # Check installed toolchains (Android NDK, Xcode, Rust, Node)
$ make android-demo # Build JNI .so slices and debug Compose APK, and open Android Studio
$ make ios-demo # Build XCFramework, generate .xcodeproj, and open in Xcode (macOS)
$ make test # Run full Android, iOS, Rust compiler, and Web parity test suites
$ make web # Compile all <three-live> and <xr-live> JS bundles and embedded engine
$ make web-demo # Launch web playgrounds at http://localhost:8888/three/ and /xr/Security
Untrusted client Three.js script execution is disabled by default on the web (allow-client-scripts required) and always runs inside an isolated QuickJS/Boa VM on Android and iOS or a sandboxed Worker / opaque-origin <iframe> (connect-src 'none') on Web—with network and storage globals stripped, Object.prototype frozen, CPU instruction fuel limits, and geometry memory quotas.
To report a vulnerability, please follow the instructions in SECURITY.md.
Contributing
Contributions are welcome! Please read CONTRIBUTING.md and CODE_OF_CONDUCT.md before submitting a pull request.
License
Licensed under the Apache License, Version 2.0.
Available Tools
4 toolsthree_live_convertAIdempotent
Compile a Three.js script, HTML document, or .glb into a binary glTF 2.0 (.glb) or Apple 64-byte-aligned Universal Scene Description (.usdz) asset for Android (Filament / Jetpack XR SceneCore), iOS/visionOS (RealityKit / Quick Look), and Web.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Inline Three.js scene script or HTML document. Provide either `code` or `inputPath`. | |
| format | No | Target container format (`glb` or `usdz`). Inferred from `outputPath` extension when omitted (defaults to `glb`). | |
| inputPath | No | Path to an input .js, .html, or .glb file on disk. | |
| outputPath | No | Optional destination path to write the compiled .glb or .usdz binary on disk. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, closed-world, idempotent operation, so the safety profile is covered. The description adds useful spec detail (USDZ 64-byte alignment, per-platform target runtimes) but omits material behavior: whether compiling an inline script executes arbitrary JS, whether the binary is returned or only written when outputPath is given, and what happens on compile failure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that puts the inputs and outputs first, then the platform targets. The trailing platform enumeration is dense but informative rather than filler; minor cost is that the sentence is long enough to read as a run-on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter, all-optional tool with no output schema, the description covers inputs, output formats, and target runtimes well. The main residual gap is return behavior — whether the .glb/.usdz bytes come back in the response or only land at outputPath — which matters because there is no output schema to answer it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, including the enum for format and the code-vs-inputPath alternative, so the schema already carries parameter meaning. The description contributes nothing parameter-specific (no note on how format is inferred from outputPath, no precedence rules when both code and inputPath are supplied), leaving this at the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb (compile) and the exact resources involved: Three.js script, HTML document, or .glb input, producing .glb or .usdz output. The target runtimes (Filament/SceneCore, RealityKit/Quick Look, Web) make it unmistakable versus siblings three_live_validate, three_live_render, and three_live_sim, which imply checking, previewing, and simulating rather than converting.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the conversion framing; there is no explicit 'use this when you need a shipping asset, use validate to check first' routing. The description never names an alternative or a precondition (e.g., validate the scene before compiling), so the agent must infer when to pick this over three_live_validate or three_live_render.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
three_live_renderAIdempotent
Render a Three.js script, HTML document, or .glb headlessly (zero GPU required) into a 4-up orthographic/camera contact sheet PNG (CAMERA, FRONT +Z, TOP +Y FRUSTUM, ISO 45 deg), single viewport PNG, or temporal filmstrip / 360-degree turntable GIF. Returns the base64 image directly to vision-capable agents along with spatial diagnostics.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Inline Three.js scene script or HTML document. Provide either `code` or `inputPath`. | |
| grid | No | Draw 1.0m / 0.25m reference ground grid and X/Y/Z origin axes. | |
| view | No | Viewport mode: `quad` (default 4-up contact sheet) or single view (`camera`, `front`, `top`, `right`, `iso`). | quad |
| width | No | Output image width in pixels (defaults to 1024 for `quad`, 512 for single view). | |
| frames | No | Number of frames for temporal filmstrip or turntable capture. | |
| height | No | Output image height in pixels (defaults to 1024 for `quad`, 512 for single view). | |
| duration | No | Duration in seconds for multi-frame temporal capture. | |
| inputPath | No | Path to a .js, .html, or .glb file on disk when `code` is not provided. | |
| turntable | No | Render a 360-degree turntable orbit across multiple frames. | |
| outputPath | No | Optional file path (.png or .gif) to also save the rendered image on disk. | |
| annotations | No | Draw 3D AABB wireframes and 2D node name callouts. | |
| triggerSelect | No | Optional interactive node name to trigger `onSelect` at t = 0. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, idempotentHint=true and openWorldHint=false; the description adds real value by disclosing the zero-GPU headless execution model, the base64 return channel and the accompanying spatial diagnostics. However, with readOnlyHint=false it never clarifies when a write occurs (only via outputPath?) or what the diagnostics contain, leaving the mutation profile implied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and outputs in a single dense but readable sentence, followed by the return-value sentence. No filler, though the first sentence packs several output modes into one long clause chain that takes effort to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 12 optional parameters and no output schema, the description does the necessary work by explaining the return value (base64 image plus spatial diagnostics) and the available output artifacts. Minor gaps remain around file-writing behavior via outputPath and what the spatial diagnostics entail, but an agent can call this correctly from the description plus schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with per-parameter descriptions and enum values, so the schema already carries full parameter meaning. The description only hints at the output-mode mapping (view modes, frames for temporal capture) without adding syntax or defaults beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (render) and precise resource (Three.js script, HTML document, or .glb) plus the concrete output modalities (4-up contact sheet, single viewport, filmstrip, turntable GIF). This distinguishes it cleanly from the sibling tools three_live_validate, three_live_convert and three_live_sim, which do not produce rendered images.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the usage context (returns base64 directly to vision-capable agents, useful for visual inspection with spatial diagnostics) but never says when to choose this over three_live_validate or three_live_sim, nor any preconditions such as validating a script first. Usage is inferable, not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
three_live_simBIdempotent
Simulate interactive KHR_interactivity behavior graphs, orbit/explode traits, and 60 Hz xr-live-sim rigid-body physics, character controllers, steering agents, hit zones, and objectives deterministically at 60 Hz.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Inline Three.js scene script or HTML document. Provide either `code` or `inputPath`. | |
| actions | No | Optional timed interaction events (e.g. `[{"at": 0.2, "type": "select", "target": "crystal"}]`). | |
| duration | No | Simulation duration in seconds (default 2.0s, max 60.0s). | |
| inputPath | No | Path to a .js, .html, or .glb file on disk when `code` is not provided. | |
| snapshotFrames | No | Optional 60 Hz tick indices (e.g. [0, 30, 60, 120]) to render into a horizontal filmstrip. | |
| outputStripPath | No | Optional file path (.png or .gif) to write the rendered keyframe strip on disk. | |
| includeFilmstrip | No | When true, renders a keyframe filmstrip PNG and includes it as an image content block. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, and openWorldHint=false; the description adds that execution is deterministic and ticked at 60 Hz, which is genuinely useful behavioral context. It omits notable side effects the schema reveals, such as writing a filmstrip file to disk via outputStripPath, and says nothing about runtime cost or failure modes for a physics simulation. Given annotation coverage, this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single front-loaded sentence with no filler sentences, which is good. However, '60 Hz' appears twice in near-redundant form ('60 Hz xr-live-sim rigid-body physics ... deterministically at 60 Hz'), and the dense keyword pile of feature nouns is harder to parse than a structured list would be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter tool with no required inputs and no output schema, the description should clarify what the caller gets back (simulation results vs. filmstrip image blocks), what happens when neither code nor inputPath is supplied, and that file output is a side effect. None of that is covered, so the description is complete on 'what it simulates' but thin on operational behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented in the schema, including the action event types and the code/inputPath alternative. The description adds no parameter-level meaning beyond what the schema states, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description leads with a specific verb ('Simulate') and enumerates the concrete domains covered: KHR_interactivity graphs, orbit/explode traits, rigid-body physics, character controllers, steering agents, hit zones, and objectives. An agent knows what the tool produces (a deterministic 60 Hz simulation). It does not, however, distinguish this from siblings like three_live_render or three_live_validate, so the differentiation requirement for a 5 is unmet.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance, no statement of when NOT to use it, and no mention of the sibling tools (validate/render/convert) that an agent would need to choose between. Usage is only implied by the verb 'Simulate', leaving the selection decision to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
three_live_validateARead-onlyIdempotent
Validate a Three.js script (.js), HTML document (/), or .glb binary and run the 3D spatial, camera frustum, grounding, AABB collision, and lighting linter (TL100-TL402).
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Inline Three.js scene script (using pre-defined `THREE` and `scene` globals) or HTML document. Provide either `code` or `inputPath`. | |
| cameraFov | No | Optional vertical field of view in degrees (default 45). | |
| inputPath | No | Path to a .js, .html, or .glb file on disk when `code` is not provided. | |
| cameraTarget | No | Optional camera look-at target override [x, y, z] in meters. | |
| cameraPosition | No | Optional camera eye position override [x, y, z] in meters for frustum and visibility checks. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint=false, so safety is covered; the description adds real value by disclosing the five specific check categories and the TL100-TL402 rule range, telling the agent what class of problems will be detected. It stops short of describing what diagnostics are emitted (severity levels, error vs warning) or whether validation halts on the first failure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence: verb, then input formats, then the analysis performed. No filler, no restating of the name, and the most decision-relevant information (what it accepts) comes first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 5 optional parameters, no required fields, and no output schema, the description gives the agent enough to know what to supply and what kind of analysis runs. The remaining gap is return-value shape: since no output schema exists, mentioning that it returns coded diagnostics would make it fully self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters (code, inputPath, cameraFov, cameraPosition, cameraTarget) are documented in the schema. The description adds no meaning beyond that — it references camera frustum checking but never connects it to the camera override parameters, nor clarifies the code/inputPath precedence beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Uses a specific verb ("Validate") plus three enumerated input formats (.js script, HTML document with <three-live>/<xr-live>, .glb binary) and names the concrete analysis performed (spatial, camera frustum, grounding, AABB collision, lighting linter TL100-TL402). This is clearly distinguishable from the render/convert/sim siblings, which would not be described as running a linter with rule codes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies a pre-flight check workflow by framing the tool as a validator/linter, but never states when to call it versus three_live_render, three_live_convert, or three_live_sim. There are no explicit exclusions and no guidance on whether validation is a prerequisite before rendering.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v0.1.0- First observed
three_live_convert - First observed
three_live_render - First observed
three_live_sim - First observed
three_live_validate
TDQS
Scored across 4 tools
The four tools map to clearly distinct pipeline stages: validation/linting, visual rendering, format conversion, and deterministic simulation. Although validate and render both surface spatial diagnostics, their primary outputs are different enough that tool selection is unambiguous.
All tools follow the same predictable three_live_<verb> snake_case pattern: validate, render, convert, and sim. The abbreviation 'sim' is minor but remains consistent with the established naming convention.
Four tools for four major operations is tightly scoped and appropriate for the server's purpose. Each tool covers a substantive stage of the Three.js/XR asset workflow, with no redundant entries.
The surface covers the core lifecycle: validate source, render previews, convert to glTF/USDZ, and simulate interactive behavior. A dedicated inspection, optimization, or metadata-extraction operation is absent, but validation diagnostics partially fill that gap.
Maintenance
Related MCP Connectors
3D avatar/asset foundry: text/image -> rigged, validated, engine-ready GLB via x402.
Build 3D web apps: physics, audio, music, Blender import. Live edits, undo, versions, publishing.
Blender and GLB/FBX/USD/STL rendered on cloud GPUs for AI agents: product shots, turntables, MP4
3D avatars, embeds, glTF tools, agent memory, and on-chain agent identity from three.ws.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to inspect and modify live Three.js scenes in real time through 59 tools covering objects, materials, shaders, textures, animations, performance monitoring, memory diagnostics, and code generation. Works with vanilla Three.js, React Three Fiber, and any framework without changing your project, using an injected browser bridge and in-page devtools overlay.4,560 npmMIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to inspect a running Three.js scene in the browser and try out live edits to objects, materials, shaders, lights, camera and animation without touching project files. Every change is recorded and can be exported as ready-to-paste vanilla Three.js or React Three Fiber code, alongside performance audits and frame capture.4,560 npmMIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to inspect and live-edit 3D browser scenes — objects, materials, shaders, lights, textures, animation, performance and memory — and to turn previewed tweaks into ready-to-paste React Three Fiber or vanilla code. It also adds website audits, virtualized 60 fps frame capture for video, and Playwright/Puppeteer helpers, with no changes required to the user's project.4,560 npmMIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to inspect Three.js scenes in real time, experiment with live previews of changes to materials, shaders, lights and cameras, and convert those changes into ready-to-paste vanilla Three.js or React Three Fiber code. Also supports website performance audits, video frame capture, and Playwright helpers with zero project changes.4,560 npmMIT