
Hooks into running Three.js scenes via a Chrome DevTools bridge and exposes 59 tools for live inspection and modification. Works with vanilla Three.js, React Three Fiber, or any framework without code changes. Starts a browser at localhost:9222 with an injected WebSocket bridge that lets you query the scene graph, edit materials and shaders, toggle lights, monitor performance and memory, preview objects in 3D, and generate React components from GLB files. Includes an in-browser overlay with live stats and an interactive scene editor. Useful when debugging rendering issues, tweaking materials without restarting, or hunting down performance bottlenecks in existing projects. Keep the browser tab open while using it or the WebSocket drops.
MCP server for inspecting Three.js scenes in real time, trying changes live in the browser, and turning them into code. 69 tools cover objects, materials, shaders, textures, animation, performance and memory, plus website audits, video frame capture and Playwright helpers.
Zero changes to your project. Works with vanilla Three.js and React Three Fiber, on WebGLRenderer and WebGPURenderer.

claude mcp add threejs-devtools-mcp -- npx threejs-devtools-mcp
Add to claude_desktop_config.json:
{
"mcpServers": {
"threejs-devtools-mcp": {
"command": "npx",
"args": ["-y", "threejs-devtools-mcp"]
}
}
}
Add to .cursor/mcp.json in your project:
{
"mcpServers": {
"threejs-devtools-mcp": {
"command": "npx",
"args": ["-y", "threejs-devtools-mcp"]
}
}
}
Or use the HTTP transport — see Cursor setup guide.
Add to ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"threejs-devtools-mcp": {
"command": "npx",
"args": ["-y", "threejs-devtools-mcp"]
}
}
}
Add to .vscode/mcp.json:
{
"servers": {
"threejs-devtools-mcp": {
"command": "npx",
"args": ["-y", "threejs-devtools-mcp"]
}
}
}
Add to opencode.json in your project:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"threejs-devtools-mcp": {
"type": "local",
"command": ["npx", "-y", "threejs-devtools-mcp"],
"enabled": true
}
}
}
Start your Three.js dev server as usual (npm run dev). The MCP server auto-detects the port from package.json and opens a browser at localhost:9222 with the devtools bridge injected.
Keep the browser tab open. The MCP server talks to your scene through a WebSocket bridge. Close the tab = tools stop working.
"show me the scene tree"
"why is my model invisible?"
"try the car in red" ← live preview, nothing saved
"keep it" ← written into your code
"audit this site for mobile"
"record a 5-second clip at 60 fps"
Every tool is labelled, so you and the AI always know what touches your files:
| Tools | Your code | |
|---|---|---|
| Inspect | scene_tree, material_details, web_audit, screenshots… | untouched |
| Live preview | set_material_property, set_light, set_camera… | untouched; lost on page reload |
| Debug visual | wireframe, bounding boxes, helpers, overlay | untouched; never needed in code |
| For code | pending_changes, gltf_to_r3f | the AI writes this into your source |
Every live-preview change is recorded. pending_changes returns each one as before → after with ready-to-paste code (vanilla Three.js and React Three Fiber) and where to find it in your project. revert_changes undoes them in the browser.
web_audit: checks for a blurry canvas (pixel ratio, missing resize), battery drain (rendering while idle or off-screen), heavy textures (oversized, not KTX2), expensive shadows, wrong color space and too many draw calls. Each finding comes with the fix.capture_frames: records a frame sequence for promo clips and reels. Time is virtualised, so the output is perfectly smooth at 30/60 fps even if your scene renders slowly. You get the ffmpeg command for MP4/WebM.Ready-made workflows show up as slash commands in Claude Code, Cursor and other clients: inspect-scene, try-look, apply-to-code, web-perf-audit, prepare-video, debug-invisible, playwright-setup.
Three ways to connect, same tools in all of them: your own browser (default), a Chrome launched by the server (HEADLESS / CDP_PORT, shareable with Playwright MCP), or your own tests:
import { attachDevtools, waitForScene, threeCall } from 'threejs-devtools-mcp/playwright';
await attachDevtools(context, { connect: false });
await page.goto('http://localhost:5173');
await waitForScene(page);
expect((await threeCall(page, 'object_details', { name: 'Car' })).visible).toBe(true);
See Browsers, Puppeteer & Playwright.
A built-in devtools panel with live performance stats, interactive scene graph, material editor, and 3D object preview. Activated automatically or via the toggle_overlay tool.

Unnamed objects show as (unnamed) in the scene tree. Named objects are easier to find and modify:
// Three.js
mesh.name = "player";
// React Three Fiber
<mesh name="player" geometry={geometry} material={material} />
MIT
DEV_PORTDev server port to proxy (auto-detected from package.json if not set)
BRIDGE_PORTBridge proxy port (default: 9222)
BROWSERSet to 'none' to disable auto-opening browser
HEADLESSSet to 'true' for headless browser mode (CI)
CHROME_PATHCustom Chrome/Edge executable path