Build a real 3D website by chatting: pages, models and text in space, published to a live URL.
Inferred from the transports this listing declares (streamable-http). A client not listed here hasn’t been ruled out — it just isn’t something Forge can confirm.
Verification confirms publisher identity (repo ownership), not code safety. The security scan covers known CVEs and suspicious install scripts.
Read from a real MCP initialize → tools/list handshake against the declared endpoint. No tool was ever invoked — tools/list is the read-only introspection call the protocol defines for this. It reflects what the server advertised at that moment; a hosted endpoint is not pinned to any version and can change without notice.
https://3dcms.info/mcp8 tools · 141mslist_scenesList the 3D scenes saved in your 3dCMS account (editable "sources"), newest first, 40 at a time. Returns each scene's id, name, page count, last-updated time and (when published) its site slug. Pass `q` to search by name or slug instead of paging through a big account; page with the `nextOffset` th…List the 3D scenes saved in your 3dCMS account (editable "sources"), newest first, 40 at a time. Returns each scene's id, name, page count, last-updated time and (when published) its site slug. Pass `q` to search by name or slug instead of paging through a big account; page with the `nextOffset` th…
| Parameter | Type | Description |
|---|---|---|
| q | string | Search text matched against the scene name and its published slug. Omit to list. |
| limit | number | Max results, 1-100 (default 40). |
| offset | number | Skip this many results - page with the `nextOffset` the previous reply gave you. |
probe_lightingFor one world point, the contribution of EVERY light in the scene, computed from the saved scene (no render, instant): each light node in reach with its value (three's falloff and spot cone, from the node's WORLD position and aim), the studio sun or the live sky, and `ambient` = lighting.env.intens…For one world point, the contribution of EVERY light in the scene, computed from the saved scene (no render, instant): each light node in reach with its value (three's falloff and spot cone, from the node's WORLD position and aim), the studio sun or the live sky, and `ambient` = lighting.env.intens…
| Parameter | Type | Description |
|---|---|---|
| sceneId* | string | Scene id from list_scenes. |
| position* | array | World point [x,y,z] in meters, e.g. the middle of the ceiling that looks lit. |
| nodeId | string | The node whose surface this point is on, for its albedo and room binding. |
get_sceneinjection riskRead a compact, high-signal summary of one scene: its nodes (id, type, name, parent, position, rotation [euler radians], scale, primitive, real `size` under the keys `data` takes (width/height/depth, radius, height, tube: write it back as patch.data as-is), assigned material; an imported model also…Read a compact, high-signal summary of one scene: its nodes (id, type, name, parent, position, rotation [euler radians], scale, primitive, real `size` under the keys `data` takes (width/height/depth, radius, height, tube: write it back as patch.data as-is), assigned material; an imported model also…
env IBL intensity; viewport: post effects, tone mapping, LUT, draw distance, camera flight; environment: fog; audio), e…| Parameter | Type | Description |
|---|---|---|
| sceneId* | string | Scene id from list_scenes (e.g. "src-1a2b3c4d"). |
| type | string | Only nodes of this type (geometry, webText, webLink, webpage, light, cable, particle, group, camera, ...). Pair with the `counts` a first call returns to see w… |
| name | string | Only nodes whose name is exactly this. |
| nameContains | string | Only nodes whose name contains this (case-sensitive). `scatter` names copies "<source> 1", "<source> 2", so this is how you find a scattered set. |
| parentId | string | Only the direct children of this node. |
| limit | number | Max nodes to return, 1-500 (default 250). |
| offset | number | Skip this many matching nodes - page with the `nextOffset` the previous reply gave you. |
| materials | number | Pass 0 to omit the material library when paging a long node list you already have. |
| settings | number | The scene-level settings block (lighting, viewport, environment, audio, sky) rides on an unfiltered first-page call by default. Pass 1 to get it on a filtered… |
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.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.
| Parameter | Type | Description |
|---|---|---|
| name* | string | A name for the new scene. |
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…Edit 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…
| Parameter | Type | Description |
|---|---|---|
| sceneId* | string | Scene id from list_scenes. |
| operations* | array | Ordered edit operations, applied atomically. |
list_assetsSearch the images and 3D models already in the account. This is how you TEXTURE something with what the user already owns: search for the look you want, take the `url` of the result, and bind it on an apply_ops add or assignMaterial as `materialMaps: { baseColor: "<url>" }` — plus `normal` / `rough…Search the images and 3D models already in the account. This is how you TEXTURE something with what the user already owns: search for the look you want, take the `url` of the result, and bind it on an apply_ops add or assignMaterial as `materialMaps: { baseColor: "<url>" }` — plus `normal` / `rough…
| Parameter | Type | Description |
|---|---|---|
| q | string | Search terms, all of which must appear in the label or keywords. Omit to list the newest. |
| kind | string | "image" for textures, "glb" for 3D models. Omit for both. |
| limit | number | Max results, 1-100 (default 40). |
| offset | number | Skip this many results - page with the `nextOffset` the previous reply gave you. |
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 screen…Render 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 screen…
| Parameter | Type | Description |
|---|---|---|
| sceneId* | string | Scene id from list_scenes. |
| views | array | Camera views to capture. Omit for the visitor's entry view. |
| maxDim | number | Longest side of the image in pixels, 64-1920 (default 400; height is 0.625x). Smaller renders faster and is enough to judge placement; go large only for a fina… |
| timeoutSeconds | number | Per-view render budget in seconds, clamped 10-180 (default 45). Raise it for a big or texture-heavy scene instead of retrying a timeout at the same budget. |
| atSeconds | number | Seconds into the scene's animation the shot is taken at (0-600, default 0 = frame one). Every track and motion-path rider is frozen at that time, so a door wit… |
publish_scenePublish a saved scene to a PUBLIC, shareable URL so anyone can view it in 3D in a browser — no login required. PUBLISHING IS PARTLY IRREVERSIBLE: the URL is submitted to search engines (IndexNow) the moment it goes live, so it may appear in results even after a takedown. ALWAYS confirm with the use…Publish a saved scene to a PUBLIC, shareable URL so anyone can view it in 3D in a browser — no login required. PUBLISHING IS PARTLY IRREVERSIBLE: the URL is submitted to search engines (IndexNow) the moment it goes live, so it may appear in results even after a takedown. ALWAYS confirm with the use…
| Parameter | Type | Description |
|---|---|---|
| sceneId* | string | Scene id from list_scenes. |
| confirm | boolean | Must be exactly true to publish. Omit / false to get a needsConfirm summary for the user. |
8 of 8 tools published a description.
Tool names and descriptions are written by the publisher and shown verbatim as inert text. They are the strings an MCP client passes to a model, so Forge scans them for prompt-injection patterns — any finding appears with the security scan above. “Privileged” is a keyword match on the tool name, not an audit of what the tool does: a benign-sounding name can still do anything.
Build a real 3D website by chatting: pages, models and text in space, published to a live URL.
Linked names open Forge’s index of every entry observed exposing that tool. Browse all indexed tools.
This entry publishes no npm package, so Forge has no dependency tree for it. That is a gap in coverage — not a statement that it has no dependencies.