3dCMS

Build a real 3D website by chatting: pages, models and text in space, published to a live URL.

Community: Submitted by a user or imported; check the owner before granting accessOnlineNo sign-inGlobalFreeCan modify data

What it can do

  • List Scenes: List the 3D scenes saved in your 3dCMS account (editable "sources"). Returns each scene's id, name, page count and last-updated time. Use a scene id with get_scene and apply_ops.
  • Get Scene: Read a compact, high-signal summary of one scene: its nodes (id, type, name, parent, position, rotation [euler radians], scale, primitive, real size, assigned material) plus the material li
  • Create Scene: Create a new, empty scene in your 3dCMS account and return its id. Build it up with apply_ops. It appears in your account and opens in the 3dCMS editor.

What data it sees

Do you need an account

No: the server works without sign-in

Build a real 3D website by chatting: pages, models and text in space, published to a live URL.

Six tools drive scenes in your own 3dCMS account over OAuth 2.1: list_scenes, get_scene, create_scene, apply_ops, get_scene_screenshot and publish_scene. Ask for a room, a gallery wall or a product page and it is built as real geometry, not a picture of one.

Publishing gives the scene a public URL that is crawlable and shareable, and you can take it down again from your account in one click. Every result includes a link that opens the scene in the 3dCMS editor, so you can keep working on it by hand.

How to connect

How to connect 3dCMS to Claude

The server address to paste into Claude settings:

https://3dcms--buck-rackley.run.tools

  1. Open Claude (claude.ai or the desktop app).
  2. Go to Settings → Connectors.
  3. Click Add custom connector.
  4. Paste the server address copied below into Remote MCP server URL and click Add.
  5. In a chat, click + → Connectors and switch the new connector on.

Custom connectors are available on Free, Pro, Max, Team and Enterprise plans (Free is limited to one). On Team and Enterprise an organization Owner adds the connector first under Organization settings → Connectors.

Authorization

After you click Add, a sign-in window for the service opens. Sign in with your own account and approve access. Claude never sees your password.

How to connect 3dCMS to ChatGPT

The server address to paste into ChatGPT settings:

https://3dcms--buck-rackley.run.tools

  1. Open ChatGPT in a browser (chatgpt.com). A Plus, Pro, Business, Enterprise or Edu plan is required.
  2. Turn on developer mode once: Settings → Apps → Advanced settings → Developer mode.
  3. Open Settings → Connectors and click Create.
  4. Fill in the form: Name (anything), Description (one line about what the service does), MCP server URL (copy it below).
  5. Under Authentication choose OAuth if the service requires sign-in, otherwise None. Click Create.
  6. In a new chat open + → Apps/Connectors and enable the connector.

OpenAI has renamed this section before (Connectors → Apps/Plugins). If the label differs, search settings for "developer mode". On Business/Enterprise workspaces an admin must allow custom connectors first.

Authorization

On first use ChatGPT opens the service's sign-in window. Sign in and approve access.

How to connect 3dCMS to Cursor

The server address to paste into Cursor settings:

https://3dcms--buck-rackley.run.tools

Fastest: click Open in Cursor below and confirm the prompt.

Manually:

  1. In Cursor open Settings → Cursor Settings → MCP and click Add new global MCP server.
  2. Paste the JSON copied below into ~/.cursor/mcp.json (per project: .cursor/mcp.json in the repo root).
  3. Save the file. The server appears in the MCP list; authorize it there if asked.

Authorization

If the service needs sign-in, an authorize button appears next to the server in the MCP list.

Server tool list (6)

Raw names from tools/list. Only developers need these.

list_scenesList the 3D scenes saved in your 3dCMS account (editable "sources"). Returns each scene's id, name, page count and last-updated time. Use a scene id with get_scene and apply_ops.
get_sceneRead a compact, high-signal summary of one scene: its nodes (id, type, name, parent, position, rotation [euler radians], scale, primitive, real size, assigned material) plus the material library — including each solid material's color/roughness/metalness, so you can reason about how the scene LOOKS, not just its structure. This is the view to reason over before editing. Sizes are in scene units (≈ meters), BEFORE each node's scale; transforms that are zero/default are omitted.
create_sceneCreate a new, empty scene in your 3dCMS account and return its id. Build it up with apply_ops. It appears in your account and opens in the 3dCMS editor.
apply_opsEdit a scene by applying a batch of operations ATOMICALLY (all-or-nothing; one undo step in the editor). Call this for any add / move / edit / delete / duplicate / group / reparent / re-material. Reference existing nodes ONLY by the id shown in get_scene — never guess ids. To create a node and then modify or parent it in the same batch, put a `tempId` on the add op and use that same string as the id/parentId of later ops. Coordinates: Y up, units ≈ meters, ground at y≈0 — place objects so they rest sensibly. Geometry size lives in `data` (box {width,height,depth}; sphere/cylinder/torus {radius}; torus {tube}); the default box is 1.5×1.5×1.5. MATERIALS: to color an object pass `color` (#rrggbb) on add/assignMaterial; to apply a GENERATED material pass `materialMaps` (the map urls from get_generation) on add/assignMaterial — both mint-or-reuse a material and assign it, no pre-existing library entry needed. WEB BLOCKS (responsive site building-blocks): add webText (data.role h1|h2|h3|body|caption + data.text; glyph outline via data.outline true|false + data.outlineColor + data.outlineWidth), webImage (data.src + data.alt), webLink (data.label + data.href or data.linkedPageId), webVideo (data.src + data.poster); any web block also accepts data.anchor = world|billboard|hud. PAGES & NEIGHBORHOODS: add a `webpage` node per page (set data.pageTitle, data.slug); place pages tens of meters apart and parent each area's content under its page to build a multi-area site. Link areas with a webLink (data.linkedPageId = target page, or data.linkedCameraId = a saved viewpoint); a tempId minted in the SAME batch works as linkedPageId, so a "sign in the park linking to the mall" can be built in one call. TAP ACTIONS: object nodes (geometry, text3d, group, cable) take data.tap = {"action":"inspect"} (fullscreen orbit lightbox on tap — products/exhibits/hero models), {"action":"moveTo"} (camera flies to frame it — tap-to-travel on landmarks), or {"action":"link", href|linkedPageId|linkedCameraId} (navigate like a webLink). inspect/moveTo take an optional "distance" (meters) overriding the auto camera distance. Runs for visitors in the published scene. ANIMATION: object nodes (geometry, text3d, group, cable) take data.animation to move on a loop in the published scene: {"duration":4,"loop":"loop","easing":"easeInOut","tracks":{"position":[{"t":0,"v":[0,0,0]},{"t":0.5,"v":[0,0.6,0]},{"t":1,"v":[0,0,0]}]}} bobs the node half a meter. t is 0-1 across duration seconds; values are OFFSETS from the authored transform (position meters, rotation euler radians, scale a multiplier, 1 = authored size). tracks = position|rotation|scale; loop = loop|pingpong|once; optional delay seconds; max 16 keys per track. Animated nodes cost scene weight and cannot be GPU-instanced — animate a few focal objects, not everything. FAST PATH — make_page: for a page that is a heading + paragraph + some links, ONE `make_page` op builds the whole thing: pass name, data.pageTitle+data.slug, hero (h1 text), body (paragraph), and links [{label, to: a page id/tempId | href}], plus a tempId (which becomes the PAGE id so other signs can target it). Create link-target pages earlier in the batch so their tempIds resolve. It replaces ~6–12 primitive ops. SET-DRESSING: use the `scatter` op to make `count` jittered copies of a node across an {area:{x,z}} (random rotation + slight scale + optional per-copy `tint` for imported models) — efficient for many props, debris, foliage, a trashy parking lot. LARGE SCENES: build INCREMENTALLY across multiple apply_ops calls (~40–50 objects per batch) instead of one huge batch — each call is its own atomic Undo and stays well within limits; call get_scene between batches to stay aligned. Do not try to emit hundreds of operations in a single call. The result may carry `warnings` — advisory scene lint (floating content, orphan web blocks, unreadable text, crowded pages, scene WEIGHT over the perf red line). The ops APPLIED; act on warnings in your next batch unless they contradict what the user asked for. A weight warning names the heaviest categories — trim them (lower-poly models, fewer shadow lights/particles) or publish will warn and far heavier scenes are blocked.
get_scene_screenshotRender the scene server-side (real WebGL, headless) and return screenshot image(s) — your EYES on the scene. Use it after apply_ops batches: judge the image (floating objects, unreadable/overlapping text, empty horizon, bad spacing, wrong colors) and fix with apply_ops. Discipline: at most 2 screenshot→fix rounds per user request, then report what you built. views (max 4, default = the visitor's entry view): pass "page:<pageIdOrSlug>" to frame one page/neighborhood, or {position:[x,y,z], target:[x,y,z], fov?} for an exact camera. Rendering is real but slow — ~10s for simple scenes, up to ~2 minutes for asset-heavy ones (repeat shots of an unchanged scene are cached and instant). Rate-limited: prefer ONE well-chosen view; only multi-view when areas are far apart. If it returns a busy/unavailable error, keep building and retry once later — do not loop on it.
publish_scenePublish a saved scene to a PUBLIC, shareable URL so anyone can view it in 3D in a browser — no login required. Returns the public site URL plus a per-page URL list. Re-publishing the SAME scene updates its existing public site (the URL stays stable). Note: this makes the scene publicly viewable and crawlable by search engines, so only publish scenes the user wants public.