Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

3dCMS

REMOTE · 3DCMS.INFO

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

Available components

+4 this week 92 Trust /100

Last scanned (17 hours ago)

Scores higher than 99% of remote servers

Reachable. Last reached 16 Oct 2026.

Category Design and Media

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →

Endpoint Security94
Transport & Reachability100
Schema Quality & AI Usability72
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 14114 tokens (~1085/item across 13 items; 13 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
  • No destabilizing schema changes in the last 30 days.Pass
Tool Coverage98
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 95% of tool parameters carry a description.Partial
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 14 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 16 Oct 26 0
    • The server rewrote its instructions, which are the text every model session reads security
    • “apply_ops” reworded the description of “operations” cosmetic
  • 15 Oct 26 +2
    • The server rewrote its instructions, which are the text every model session reads security
    • Tool “apply_ops” rewrote its description, which is the text the model reads security
    • Tool “create_scene” rewrote its description, which is the text the model reads security
    • Tool “get_scene_screenshot” rewrote its description, which is the text the model reads security
    • Tool “list_scenes” rewrote its description, which is the text the model reads security
    • Tool “probe_framing” rewrote its description, which is the text the model reads security
    • Tool “publish_scene” rewrote its description, which is the text the model reads security
    • Tool “upload_asset” rewrote its description, which is the text the model reads security
    • Schema quality: unverified → 100 ▲ functional
    • The server now declares the “prompts” capability functional
    • New prompt “first_scene” functional
    • New prompt “open_editor” functional
    • New prompt “park_walk” functional
    • New prompt “walkthrough” functional
    • “probe_framing” added an optional parameter “subject” cosmetic
    • “apply_ops” reworded the description of “operations” cosmetic
    • “get_scene_screenshot” reworded the description of “maxDim” cosmetic
  • 10 Oct 26 +2
    • Stability: 0.97 → pass security
    • Destructive annotations: All 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation. functional
  • 3 Oct 26 +12
    • Judged manipulation: unverified → pass ▲ security
    • Schema quality: unverified → excellent ▲ functional
  • 2 Oct 26 −11
    • Judged manipulation: pass → unverified ▼ security
    • The server rewrote its instructions, which are the text every model session reads security
    • Tool “apply_ops” rewrote its description, which is the text the model reads security
    • Tool “list_assets” rewrote its description, which is the text the model reads security
    • Schema quality: excellent → unverified ▼ functional
    • “apply_ops” reworded the description of “operations” cosmetic
  • 1 Oct 26 +1
    • The server rewrote its instructions, which are the text every model session reads security
    • Tool “apply_ops” rewrote its description, which is the text the model reads security
    • Tool “get_scene” rewrote its description, which is the text the model reads security
    • Tool “probe_framing” rewrote its description, which is the text the model reads security
    • Tool “upload_asset” rewrote its description, which is the text the model reads security
    • Server version: 1.0.0 → 1.2.0 functional
    • “publish_scene” added an optional parameter “confirmReplace” cosmetic
    • “apply_ops” reworded the description of “operations” cosmetic
    • “get_scene” reworded the description of “limit” cosmetic
  • 29 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 77 to 80. That category is still filling its 30-day observation window: 23 days of observed history at the previous scan, 24 at this one. The score rises as the window fills, whether or not the server changes.

  • 28 Sept 26 0
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 16 Oct 2026 · Probed https://3dcms.info/mcp

TLS valid

Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .

Subject Issuer Valid from Valid until Key Signature Serial
CN=3dcms.info CN=WE1,O=Google Trust Services,C=US 28 Sept 2026 27 Dec 2026 ECDSA 256 ECDSA-SHA256 b16171f5c99720b11370fc6e08aa3306
SANs: 3dcms.info, *.3dcms.info
CN=WE1,O=Google Trust Services,C=US (CA) CN=GTS Root R4,O=Google Trust Services LLC,C=US 13 Dec 2023 20 Feb 2029 ECDSA 256 ECDSA-SHA384 7ff31977972c224a76155d13b6d685e3
CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE 15 Nov 2023 28 Jan 2028 ECDSA 384 SHA256-RSA 7fe530bf331343bedd821610493d8a1b

Background: What to check on a remote MCP endpoint →

DNSSEC insecure

Validation of 3dcms.info. — Not signed

Zone DS Keys Algorithms Outcome
. trust_anchor 20326, 38696 8, 8 Verified
info. present 5104, 9986 8, 8 Verified
3dcms.info. absent Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation
Authentication Enforced and verified

The endpoint asked for a token and published valid RFC 9728 metadata describing how to get one.

Result Enforced and verified
Enforced On tool calls
HTTP status 200

WWW-Authenticate challenge Bearer resource_metadata="https://3dcms.info/.well-known/oauth-protected-resource/mcp"

Bearer resource_metadata="https://3dcms.info/.well-known/oauth-protected-resource/mcp"
Header Value
strict-transport-security max-age=31536000; includeSubDomains
content-security-policy default-src 'self'; base-uri 'self'; object-src 'none'; frame-ancestors 'self'; form-action 'self'; script-src 'self' 'unsafe-eval' blob:; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob: https:; media-src 'self' blob: data: https:; font-src 'self' data: https:; connect-src 'self' https: blob:; worker-src 'self' blob:; child-src 'self' blob:; manifest-src 'self'; upgrade-insecure-requests; report-uri /api/csp-report; report-to csp-endpoint
x-content-type-options nosniff
x-frame-options SAMEORIGIN
referrer-policy strict-origin-when-cross-origin

Protected resource metadata

Document https://3dcms.info/.well-known/oauth-protected-resource/mcp
Retrieved Yes
Resource https://3dcms.info/mcp
Authorisation server https://3dcms.info

Background: How OAuth 2.1 works in the 2026 MCP spec →

Transports 2 probes
Transport URL Outcome Status Location
streamable-http https://3dcms.info/mcp Verified 200
http (plaintext) http://3dcms.info/mcp HTTPS enforced 301 https://3dcms.info/mcp
MCP tools · 13 exposed · ~10,377 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
apply_ops ~4,786

Use this to build or change a 3D scene: add rooms, text, pictures, links, models, lights, pages. Edit a scene by applying a batch of operations ATOMICALLY (all-or-nothing). 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. Each call is atomic and checkpointed: the owner can roll back in the editor (File > Version history). There is no undo over MCP; to reverse a call, apply the inverse ops. LARGE SCENES: ~40-50 objects per call; get_scene between batches. The result names what it CREATED (id, type, name) and may carry `warnings` (advisory lint and design fails): act on them next batch. READ FIRST: the `operations` field description opens with METHOD (ten steps every build follows, indoors and out: the person's own pictures first, library sets before flat colour, measure one then repeat, lay out by a rule, nothing floats, matte matted pictures, sunset light outdoors, frame the arrangement, look at the image, dark text on light walls), SURFACES AND TRIM, and BUILD RECIPES with measured numbers (yard gallery, park walk, walkthrough, room gallery), then the full op reference. Read it before your first build in a session.

NameTypeReqDescription
operationsarrayyesOrdered edit operations, applied atomically. REFERENCE: METHOD (every build, indoors or out: a room, a shop, a park, a product, a diagram. The recipes after it are worked examples with proven numbers…
sceneIdstringyesScene id from list_scenes.

No output schema declared.

No examples provided.

compose_surface ~616

Make a flat surface that looks PRINTED ON a real material: a quote on a stretched canvas, a poster, a shop sign, a label, a plaque, a book cover. Start from a `base`: a texture set from the library (`setId` from list_assets; tiled at `tileSize` meters, or `mode` "stretch" for a whole-sheet scan), explicit `maps` {baseColor, normal, ormh} urls, or a flat `color`; `tint` re-colours the base and keeps its detail. Then `layers`, painted in order: text {text (use \n or | for line breaks), font typewriter|sans|horror, weight, size (letter height in meters), color, align, x/y (the block centre, 0..1 from left/top), maxWidth (share of the width; the size shrinks to fit), tooth (0..1, how much ink skips the low spots of the weave), dry (patchy ribbon), jitter (typewriter wobble)}; image {src (an /assets url), x, y, width (share of the surface width), opacity, blend normal|multiply}; stains {amount, color, scale, seed}; spatter {x, y, size, drips, color (blood by default), seed}; grime {edge}; fill {color, opacity}. Ink and spatter sink into the base relief, emboss its normal and read glossier than the base, so light rakes across it like the real thing. `output` "panel" (default) saves a thin box MODEL of width x height x depth meters, its face looking down +X like the library picture frames, with a phone-sized copy made automatically, and a model waits for its room so a many-room site stays light on phones; place it with the `place` op the result gives. `output` "material" saves a baseColor/normal/ormh set and returns `materialMaps` for apply_ops (it stretches once across a face, repeat 1). To fill a picture frame, measure the frame first (measure gives its opening) and make the panel about 0.2 m larger than the opening both ways, placed just behind the frame's front. Returns a small preview image of the surface.

NameTypeReqDescription
baseobject–The material the surface is made of.
depthnumber–Panel thickness in meters (default 0.03).
heightnumberyesSurface height in meters.
keywordsarray––
labelstring––
layersarray–Painted on in order (max 24).
normalStrengthnumber–Relief strength, 0 to 4 (default 1).
outputstring––
resolutionnumber–Pixels on the long side, 256 to 2048 (default 2048).
widthnumberyesSurface width in meters.

No output schema declared.

No examples provided.

create_scene ~171

Use this when the user wants a 3D website, a walkable portfolio, a product showcase, a gallery, an exhibit, an event page or any interactive space they can share as a link. Creates the scene in their 3dCMS account and returns its id; then build it with apply_ops. With copyFrom it is a full COPY of one of their scenes (Save As), the way to try a big change on a new version while the original and its published site stay untouched. It opens in the 3dCMS editor; a copy is unpublished until publish_scene.

NameTypeReqDescription
copyFromstring–A scene id from list_scenes to copy every node, material and setting from. Omit for an empty scene.
namestringyesA name for the new scene.

No output schema declared.

No examples provided.

design_review ~321

A designer's critique of a scene (or one page with pageId) against its BRIEF: what it is for (settings.design, or, when none is declared, what it reads as and why), its palette (dominant, secondary, accent, harmony, temperature, key, and whether that serves the intent and the mood), text contrast, heading hierarchy, every arrival and entry shot judged by probe_framing, wayfinding, the light's key to fill at the subject, and motion. `top` is the five things that matter most FOR THIS INTENT (a page meant to convert ranks the action and its accent first; one meant to inform, hierarchy and contrast; a showcase, the hero's framing and light), each with the finding, why it matters, and `fixOps`: a ready apply_ops batch where one exists. Read-only and instant, no render. Call it when a build is done, before you report, and whenever the user asks how their scene could be better. Tell the user the top findings in plain words, with the why. Apply fixOps to a scene you are building when they serve the brief; for the user's own work, offer them and apply on a yes. A brief read rather than declared is a guess: confirm it with the user before writing it.

NameTypeReqDescription
pageIdstring–Review one page (a webpage node id): its brief, its content, its arrival shot. Omit for the whole scene.
sceneIdstringyesScene id from list_scenes.

No output schema declared.

No examples provided.

get_scene ~760

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 carries its bounds {min,max}, size [w,h,d] and assetFile, the tail of its list_assets url, so a frame can be sized to a picture without a screenshot; a camera says what it SEES, from the pose the published viewer builds: lookingAt (the point it pivots on), pitchDeg, heightM, fov and fitWidth when set, looksAtNothing when nothing is ahead of it, and frames: up to six things in its picture on a square screen, biggest first, each at x and y from -1 to 1 with its share of the frame height, the floor left out) plus the material library — including each solid material's color/roughness/metalness and `usedBy` (how many nodes wear it, the first three ids) or `unused:true`, and `settings`: the scene-level look the `settings` op writes (lighting: mode, sun, timeOfDay, env IBL intensity; viewport: post effects, tone mapping, LUT, draw distance, camera flight; environment: fog; audio), every field that exists, plus `settings.sky`, one sentence on what actually lights the scene. Read it FIRST when a surface looks lit for no reason: env.intensity is ambient light with no source and no falloff, and a scene with every lamp deleted stays lit by it. Sizes are in scene units (≈ meters), BEFORE each node's scale; transforms that are zero/default are omitted. ALWAYS returns `counts` (nodes by type) and `matched`, so on a big scene you orient first and then ask for the part you need: narrow with `type` / `name` / `nameContains` / `parentId`, page with `limit` + `offset` (the reply carries `nextOffset` and a `truncated` note when there is more). A scene of a few hundred nodes WILL be cut off if you ask for all of it at once.

NameTypeReqDescription
limitnumber–Max nodes to return, 1-300 (default 250).
materialsnumber–Pass 0 to omit the material library when paging a long node list you already have.
namestring–Only nodes whose name is exactly this.
nameContainsstring–Only nodes whose name contains this (case-sensitive). `scatter` names copies "<source> 1", "<source> 2", so this is how you find a scattered set.
offsetnumber–Skip this many matching nodes - page with the `nextOffset` the previous reply gave you.
parentIdstring–Only the direct children of this node.
sceneIdstringyesScene id from list_scenes (e.g. "src-1a2b3c4d").
settingsnumber–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 or paged call, 0 to omit it.
typestring–Only nodes of this type (geometry, webText, webLink, webpage, light, cable, particle, group, camera, ...). Pair with the `counts` a first call returns to see what is worth asking for.

No output schema declared.

No examples provided.

get_scene_screenshot ~682

Render the scene server-side (real WebGL, headless) and return screenshot image(s) — your EYES on the scene. Use it after apply_ops batches and after probe_framing, and judge each image as a photographer and a web designer would: one clear subject, on a third (for a page's own camera, the whole card at a readable angle); the horizon off the middle; the eye at a standing height; text legible and on even margins; a way out in view; the colours serving the brief (one accent, on the primary action); nothing floating, clipped or overlapping. Beside each image comes `composition`, read from its own pixels: tonalRange (p5 to p95 of lightness; under 0.35 is flat), clipping (share blown to white, crushed to black), key (low, mid, high), a 3x3 thirds grid of lightness and detail with the busiest and brightest cells, the hues on screen by share, and findings in sentences. Fix with apply_ops. At most 2 screenshot→fix rounds per request, then report. 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: ~10 s for a simple scene, 45 s per view by default (timeoutSeconds up to 180 for a big textured scene). The default is ONE view at 640 px; larger shots and several views are what timed out, so ask for one view at a time. A call answers within about 85 s either way: the image, or "still rendering, retry in N s"; then call again with the SAME arguments after N s and the image comes from the cache at no extra cost. A timeout comes back as an error naming it, never as an empty image; repeat shots of an unchanged scene at the same size are cached, instant and free; only a fresh render counts against the daily budget, and each reply says shotsLeft. If it returns a busy/unavailable error, keep building and retry once later — do not loop on it.

NameTypeReqDescription
atSecondsnumber–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 with a 4 s swing is verified mid-swing at 2…
maxDimnumber–Longest side of the image in pixels, 64-1920 (default 640; height is 0.625x). 640 reads captions and renders inside the time limit; larger often does not.
sceneIdstringyesScene id from list_scenes.
timeoutSecondsnumber–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.
viewsarray–Camera views to capture. Omit for the visitor's entry view.

No output schema declared.

No examples provided.

list_assets ~624

Search the images, models and sounds in the account AND the shared public library (frames, props, texture sets; `scope` mine|shared|all, default all). A row with shared:true is copied in first with upload_asset {assetId}: place the url that returns, never the shared one. 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` and the set's packed `ormh` (or `orm`), or separate `roughness` / `metalness` maps. PBR sets are stored as SEPARATE images that share a setId; the base color member is often unsuffixed (mapRole null) while its siblings end in the map name ("... Normal", "... Ormh"). Search the set name, then pick one url per slot by mapRole; a base colour alone already reads as a texture. ALWAYS search rather than listing: an account can hold thousands of images. `q` is a set of terms that must ALL appear in the label or keywords, so "weathered wood" narrows instead of returning everything wooden. Returns id, kind, label, url, sizeBytes, keywords, mapRole and setId. mapRole names the slot an image is (baseColor | normal | roughness | metalness | height | emissive | ao | orm | ormh, or null when the label does not say); setId is shared by every image of one PBR set, so bind a whole set by matching setId and placing each url by its mapRole. orm/ormh are channel-packed (R=AO, G=roughness, B=metalness, A=height): bind one on materialMaps.ormh (or .orm), never as roughness; the channels are split for you. An `emissive` member goes on materialMaps.emissive. `kind` is "image" for textures and "glb" for models (a glb url goes on a geometry node as data: {primitive:"imported", assetUrl}, never as the top-level primitive), "audio" for sounds (data.audioClip.src).

NameTypeReqDescription
kindstring–"image" for textures, "glb" for 3D models, "audio" for sounds. Omit for all.
limitnumber–Max results, 1-100 (default 40).
offsetnumber–Skip this many results - page with the `nextOffset` the previous reply gave you.
qstring–Search terms, all of which must appear in the label or keywords. Omit to list the newest.
scopestring–"mine" = this account only, "shared" = the public library only, "all" (default) = both, yours first.

No output schema declared.

No examples provided.

list_scenes ~204

Use this first when the user mentions their 3dCMS scenes, a site they built with 3dCMS, or wants to edit, publish or check something they made. Lists the 3D scenes saved in their 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` the previous reply gave you. Use a scene id with get_scene and apply_ops.

NameTypeReqDescription
limitnumber–Max results, 1-100 (default 40).
offsetnumber–Skip this many results - page with the `nextOffset` the previous reply gave you.
qstring–Search text matched against the scene name and its published slug. Omit to list.

No output schema declared.

No examples provided.

measure ~313

Measure nodes in a saved scene (analytic, instant, no render). For each node in nodeIds: its world centre, its size along its own axes after every scale above it, its world bounding box, and `clearance`: the nearest visible thing in each world direction (+x, -x, +y, -y, +z, -z) that overlaps it across that axis, with the gap in meters (how far a frame hangs off its wall, how much room a camera has before it meets a side wall). An IMPORTED MODEL also gets `opening`: the hole through it (a picture frame, a doorway, a window, an arch), measured from the model's own triangles: its size in meters along the node's x, y, z, the axis it goes through, and `backed` when a board or glass covers the centre. Size a panel a little larger than the opening so its edge tucks behind the lip; get_scene only reports a model's OUTSIDE. Two or more nodes also give `pairs`: centre distance, the gap between their boxes (0 when they overlap) and that gap per axis. A `point` [x,y,z] gives its clearance in all six directions.

NameTypeReqDescription
nodeIdsarray–Up to 24 node ids to measure (and to pair up).
pointarray–A world point [x,y,z] to measure the clearance around.
sceneIdstringyesScene id from list_scenes.

No output schema declared.

No examples provided.

probe_framing ~688

Read a saved camera (cameraId), or an exact pose, as a visitor sees it at the screen shapes they actually have (16:9 desktop and 9:16 phone by default), against the rules a photographer and a web designer use. A PAGE shot (a page's own camera, its arrivalCameraId or a camera inside the page, with the card in view) should hold the whole card on every screen, most of the width, within 60 degrees of square so its text still reads: centred is right for a page. A SCENE shot (a room, an object, a place, and the entry view even with a page in it: a 3D view need not be head-on) puts its subject on a third, the horizon on a third, the eye at a standing person's 1.5 to 1.7 m. The subject is the declared primary action (settings.design, or the page's data.primaryActionId), else the page's h1, else a SET of 3+ equal things in frame (framed as one arrangement), else the biggest thing; subject "set" forces the set. A suggested scene pose keeps the horizon in frame. Returns, per screen shape: where the subject lands (x and y from -1 to 1, its thirds cell, how far from a power point, its share of the frame, whether all of it is in frame or which edge cuts it, whether text is legible), the page card (whole, width share, degrees off square), text the frame cuts, a near object cut in the foreground, the horizon row, the eye height above the floor (a phone backs a fitWidth camera up along its tilt, so read it on every shape), anything in the lens or around it, and exits (signs and tap targets within 12 m). Then `findings` in plain sentences, worst first, and `suggest`: one pose that fixes the composition on every shape, with why, and `suggest.op`, a ready apply_ops update for it (null when it already stands at the best pose). Call it on every entry and arrival camera you place, before get_scene_screenshot. On a scene you are building, apply the suggestion yourself when it serves the brief; on the user's own existing work, tell them what it found and offer the fix.

NameTypeReqDescription
aspectsarray–Screen shapes to read, width over height, 1 to 4 of them from 0.3 to 3.5 (default [1.778, 0.5625]: a desktop and a phone held upright).
cameraIdstring–A camera node id. Its fitWidth, its page and its role (entry, arrival, via, sign target) are all read.
fovnumber–With position: vertical fov in degrees (default 42).
positionarray–Instead of cameraId: an eye position [x,y,z], world meters.
sceneIdstringyesScene id from list_scenes.
subjectstring–"set" frames the arrangement of equal things (a row or arc of pictures, signs) as the subject instead of one of them. Default auto.
targetarray–With position: the point the eye looks at.

No output schema declared.

No examples provided.

probe_lighting ~271

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.intensity NAMED as a term, sorted by contribution, plus a `why` on each light that does not reach (out of range, outside the cone, behind the panel). Pass `nodeId` for the surface's albedo: a pale albedo shows the ambient term 2-3x as strongly as a dark one. Use it BEFORE deleting lights to find a phantom glow: a surface no lamp reaches that still reads lit is lit by env.intensity (or the sky in time mode), and the answer is the settings op, not another lamp. Occlusion is not computed (a wall between does not reduce the number).

NameTypeReqDescription
nodeIdstring–The node whose surface this point is on, for its albedo and room binding.
positionarrayyesWorld point [x,y,z] in meters, e.g. the middle of the ceiling that looks lit.
sceneIdstringyesScene id from list_scenes.

No output schema declared.

No examples provided.

publish_scene ~427

Use this when the user wants their scene live as a public link to share, or to update one already live. 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 user first, then call with confirm:true — without it this tool publishes nothing and returns what WOULD happen. 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).

NameTypeReqDescription
confirmboolean–Must be exactly true to publish. Omit / false to get a needsConfirm summary for the user.
confirmReplaceboolean|string–Only after a reply with needsConfirm and willReplace, and the user's yes naming that site: pass willReplace.replaceToken exactly when it has one (siteSlug publishes), otherwise true.
listedboolean–false publishes UNLISTED: reachable by its link, but kept off Explore and your creator profile, marked noindex and not submitted to search engines. Omit for a normal listed publish.
sceneIdstringyesScene id from list_scenes.
shortLinkboolean–true also returns shortUrl, a short 3dcms.info/s/<code> link to the site (one stable code per site), for sharing and QR codes. Without confirm, a scene whose site is already live gets its shortUrl at…
siteSlugstring–Publish onto one of YOUR existing sites by its slug (the part after /sites/ in its URL) instead of this scene's own. When that site shows another scene, the first call answers willReplace: name the s…

No output schema declared.

No examples provided.

upload_asset ~514

Put a file into the account's asset library and get back its /assets url to use in apply_ops (a glb on a geometry node as data {primitive:"imported", assetUrl}, an image in materialMaps or a webImage src, an mp3 in an audioClip: data.audioClip = {src, volume 0-1, loop, mode, muted} on any node; get_scene reports it as `audio`). A `url` may be a picture (JPEG, PNG, WebP, GIF, AVIF, up to 12 MB), a binary glTF 2.0 model (.glb, up to 36 MB) or a sound (MP3, OGG, WAV, M4A, up to 12 MB); the type is read from the bytes. `assetId` instead copies a SHARED library asset (a list_assets row marked shared:true) into this account and returns the url to place; placing the copy keeps the page whole if the sharer removes theirs, and the same asset copied twice returns the first copy. Give ONE source: `url` (a public http(s) link, fetched by the server; use this for anything larger), `dataBase64` with `filename` (the file itself, up to about 3 MB on this hosted connector; bigger files go by `url` or the editor's upload), or (`path` is only available when the MCP runs on your own computer). An image answers its width, height and aspect in pixels: cut a picture plane to that aspect, never a guess. A model gets its phone-sized copy made automatically, the same as an editor upload. Label it and give keywords so list_assets finds it again.

NameTypeReqDescription
assetIdstring–Copy this shared library asset (a list_assets id with shared:true) into your library instead.
dataBase64string–The file, base64-encoded. Needs filename.
filenamestring–File name WITH extension (e.g. "sign.glb", "poster.png"); required with dataBase64, optional with path.
keywordsarray–Search keywords for list_assets.
labelstring–A human label for the library.
pathstring–A local file path (only when this MCP server runs on your own computer).
urlstring–A public http(s) URL to import: a picture, a .glb model or a sound.

No output schema declared.

No examples provided.

Install

How do I install the 3dCMS MCP server?

3dCMS is a hosted endpoint at https://3dcms.info/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

remote · 3dcms.info

# add to Claude Code
claude mcp add --transport http info-3dcms-mcp 'https://3dcms.info/mcp'
Common questions

What is the 3dCMS MCP server?

3dCMS is an MCP server listed in the public MCP registry as info.3dcms/mcp. Build a real 3D website by chatting: pages, models and text in space, published to a live URL. This page covers its hosted endpoint (https://3dcms.info/mcp).

Is the 3dCMS MCP server safe to use?

3dCMS scores 92 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the 3dCMS MCP server expose?

3dCMS exposes 13 tools: list_scenes, probe_lighting, probe_framing, design_review, upload_asset, and 8 more. Their descriptions and schemas cost roughly 10,377 tokens of context every time the server is loaded.

Does the 3dCMS MCP server require authentication?

Yes. 3dCMS asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.

Is the 3dCMS MCP server still maintained?

3dCMS is still listed as active in the MCP registry. We last reached this channel on 16 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.