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.

Pascal 3D Editor

NPM · @PASCAL-APP/MCP · 2 COMPONENTS

Create, inspect, validate, and save editable 3D building scenes with Pascal's MCP server.

79 Trust /100

Last scanned (10 hours ago)

Scores higher than 66% of npm servers

Category Design and Media

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security98
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • 28 of 84 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency100
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to pascalorg/editor). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 1 days ago).Pass
  • Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability70
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (good).Pass
  • Context-footprint check failed: tool/resource definitions use about 26200 tokens (~284/item across 92 items; 86 tools + 6 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 Management0
  • Stability not yet verified: not enough scan history yet (needs a 30-day window).Unverified
Tool Coverage92
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 73% of tool parameters carry a description.Partial
  • Structured output schemas are declared (72% of tools); any adoption earns full credit.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 6 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 88 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass

Unverified: 1 category

A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

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.

  • 24 Oct 26 +15
    • Malware scan: unverified → pass ▲ security
  • 23 Oct 26 64

    First indexed and scored.

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 24 Oct 2026 · Analysed npm/@pascal-app/mcp@1.0.6

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem npm
Reason Verified
Discovered via Registry attestation endpoint
Source repo pascalorg/editor
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/pascalorg/editor/.github/workflows/release.yml@refs/heads/main
Rekor log index 3406175165
Predicate type SLSA build provenance https://slsa.dev/provenance/v1
Subject digest sha512:1364724a402ff27e316852fa21cc714317343e0e3fdae23e7e01ac148ad3715f5a3eb113c47453f38dd8c0e7a3fff2219f89a80860681fb43946d30ed

Background: How many MCP packages publish verified provenance →

Dependencies 84 packages
Packages resolved 84
Stale 26
No linked repository 4
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 86 exposed · ~26,008 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
add_column ~715

Add a structural or decorative column at (x, z), or rebuild one by nodeId. Supports native fields or optional code using the same module and conventions as add_object, with floor mount and its bottom centre at the support point. Params named height, width and depth drive the native size controls. Only add columns when requested.

NameTypeReqDescription
categorystring–What this design is, in one or two words.
codestring–A module (three.js, or bpy with language) when the native fields cannot express the column. Same module and conventions as add_object; mount floor. Declare height, width and depth params for editable…
crossSectionstring–Plan shape: 'round' (default), 'square' (equal width/depth), 'rectangular' (independent width/depth), 'octagonal', 'sixteen-sided'.
depthnumber|string–Depth when crossSection is "square" / "rectangular" (default: 0.44). In metres, or text with a unit ("6 ft"). Must be greater than 0 m.
descriptionstring–A short description of this design, at most 200 characters.
heightnumber|string–Column height (default: 2.5). In metres, or text with a unit ("6 ft"). Must be greater than 0 m.
languagestring–The code's language: 'three' (default) for a three.js module, 'bpy' for a Blender module (see add_object). On an edit it defaults to the language the object was built in.
levelstring–Level id from list_levels; omitted uses the viewed or lowest level.
namestring–What the user would call this design.
nodeIdstring–Rebuild this column with code, params or native size fields; get_source provides current code when needed.
paramsobject–Values for the params the module declares; on an edit, each one you leave out keeps its current value (clamped to the param's range) and a param new to the code starts at its default.
radiusnumber|string–Radius when crossSection is "round" (default: 0.22). In metres, or text with a unit ("6 ft"). Must be greater than 0 m.
rotationnumber|string–Y-axis rotation (default: 0). In degrees, or text with a unit ("1.57rad").
stylestring–Visual style: 'plain' (default smooth pillar), 'faceted' (sharp prism faces), 'fluted' (vertical channels — classical), 'lathe-turned' (turned bands — porch / interior), 'dravidian-carved' (heavy car…
tagsarray–Up to five short lowercase search tags, at most 32 characters each.
widthnumber|string–Width when crossSection is "square" / "rectangular" (default: 0.44). In metres, or text with a unit ("6 ft"). Must be greater than 0 m.
xnumber–X position of the column center (meters)
ynumber–Support point height above the level, in metres (default 0).
znumber–Z position of the column center (meters)

No output schema declared.

No examples provided.

add_corner_window ~663

A window that wraps the corner where two walls meet: one window on each wall, both running to the corner and joined, the glass fused at the corner (post none, a fixed window's default) or meeting at a thin post (post post). Any angle the walls make, a bay's 135° as well as a square or an acute corner. The corner is the point the two walls end at ([x, z], as get_walls gives their ends); width is how far the glass runs along each wall from the corner, the same on both unless widths names a wall. Each side is placed by add_window's rules (height, sillHeight, windowType, style the same on both sides; with no sillHeight, centred on the lower of the two walls). The walls are the level's (levelId, default the floor the person is viewing): stacked storeys share their corners' points. Refused with a code: no_corner where no two walls of the level end at the point, corner_ambiguous where more than two do (name two with wallIds), corner_angle for a corner nearly folded back or nearly straight, corner_not_fused for post none on a window type other than fixed, width_exceeds_wall. Returns windowIds and wallIds; the editor's window panel shows the pair under Corner.

NameTypeReqDescription
cornerarrayyesThe point where the two walls meet, [x, z] in the level's plan (m).
heightnumber|string–Window height (default 1.5 m). In metres, or text with a unit ("6 ft"). Must be greater than 0 m.
levelstring–Same as levelId.
levelIdstring–The level, by an id list_levels returned; an id made up from a name ("level_1", "level_ground") does not exist. Default: the floor the person is viewing, else the lowest floor.
poststring–none: the glass fused at the corner (a fixed window's default); post: the glass meets at a thin post (the default, and the only choice, for the other window types, whose frames stay).
sillHeightnumber|string–Height from the floor to the bottom of the window (default: centred vertically on the lower of the two walls, the same on both sides). In metres, or text with a unit ("6 ft"). Minimum 0 m.
stylestring–The panes' look on each side (rows and columns), the window panel's Style row.
wallIdsarray–The two walls, when more than two end at the corner.
widthnumber|string–How far the glass runs along each wall from the corner (default 1.2 m). In metres, or text with a unit ("6 ft"). Must be greater than 0 m.
widthsobject–A width for a wall by its id, over width (e.g. { "wall_a": 1.6 }).
windowTypestring–How it opens (default fixed), the window panel's Type row; the fused corner is a fixed window's.

No output schema declared.

No examples provided.

add_door ~891

Add a door to an existing straight wall at t (0..1 along it), or a passage with no leaf (openingKind opening: a cased opening, an arch). The door slides to stay on the wall and reports clamped. Refused with a code, as in the editor: curved walls, walls shorter than the door, and overlapping another door, window or wall item unless force is set. Match the reference with the outline (rectangle, rounded, arch), doorType and style; what they cannot express (glass strips, a pattern of lites, carved panels) is written as a script in code, never left as not possible.

NameTypeReqDescription
archHeightnumber|string–Rise of the arch above its straight sides, within height (arch only; default 0.45 m). In metres, or text with a unit ("6 ft"). Must be greater than 0 m.
categorystring–What this design is, in one or two words.
codestring–An optional module (three.js, or bpy with language) for a door (a fan grille, tracery, carved trim): the same module and conventions as add_object, with mount 'wall'. Its size is what it builds (name…
cornerRadiusnumber|string–Radius of the rounded top corners (rounded only; default 0.15 m). In metres, or text with a unit ("6 ft"). Must be greater than 0 m.
descriptionstring–A short description of this design, at most 200 characters.
doorTypestring–How it opens (default hinged); garage types for garage doors.
forceboolean–Place it even where it overlaps another door, window or wall item, like holding Alt in the editor. Only when the person asks for the overlap.
handleSidestring–Handle side (default: opposite the hinges).
heightnumber|string–Door height (default 2.1 m). In metres, or text with a unit ("6 ft"). Must be greater than 0 m.
hingesSidestring–Hinge side (default left).
languagestring–The code's language: 'three' (default) for a three.js module, 'bpy' for a Blender module (see add_object). On an edit it defaults to the language the object was built in.
namestring–What the user would call this design.
nodeIdstring–Rebuild this door instead of adding one: new code and/or params (get_source provides current code when needed). Its native fields change with update_node.
openingKindstring–door (default), or opening: a passage with no leaf, framed or arched by the outline, as the editor's door panel offers.
openingShapestring–Outline of the opening: rectangle (default), rounded top corners, or arch (round top).
paramsobject–Values for the params the module declares; on an edit, each one you leave out keeps its current value (clamped to the param's range) and a param new to the code starts at its default.
positionnumber–Same as t.
stylestring–Visual preset (panels only, never the size); same presets as create_room doors[].
swingDirectionstring–Which way the door opens (default inward).
tnumber–Position along the wall, 0..1: 0 = start, 0.5 = centre, 1 = end.
tagsarray–Up to five short lowercase search tags, at most 32 characters each.
wallIdstring–The wall to add the door to.
widthnumber|string–Door width (default 0.9 m). In metres, or text with a unit ("6 ft"). Must be greater than 0 m.
NameTypeReqDescription
achievedobjectyes–
clampedbooleanyes–
coordinateSystemstringyes–
doorIdstringyes–
localXnumberyes–
messagestringyes–
okbooleanyes–
persistenceobject––
projectstring|null––
tnumberyes–
unsavedstring––
wallIdstringyes–
wallLengthnumberyes–

No examples provided.

add_fence ~365

Add a fence along points on a level: one fence per side, a whole run or a lot's boundary (closed) in one call. Privacy (solid panels) by default; picket for a picket fence, slat for vertical slats, rail for open rails, horizontal for cladding boards, guard for a deck's barrier. Fences stand on the level, as the editor's fence tool puts them. Refused with a code: a side shorter than 10 cm (fence_too_short), a roof level (roof_level).

NameTypeReqDescription
baseStylestring–grounded (default: a kickboard on the ground), floating (the panel held off the ground on its posts) or raised (a bottom rail held above the ground, the posts to the ground: a deck guard).
closedboolean–Close the run back to the first point, as a lot's boundary.
heightnumber|string–Fence height (default 1.8 m). In metres, or text with a unit ("6 ft"). Must be greater than 0 m.
levelstring–Same as levelId.
levelIdstring–The level, by an id list_levels returned; an id made up from a name ("level_1", "level_ground") does not exist. Default: the floor the person is viewing, else the lowest floor.
materialPresetstring–A library material (library:<id>), found with search_materials.
pointsarrayyes[x, z] points in level coordinates (metres), the fence running through them in order.
stylestring–slat | rail | privacy | horizontal | guard | picket (default privacy).

No output schema declared.

No examples provided.

add_level ~357

Add an empty level to a building, as the editor does: above its top storey, under the building's roof level, which moves up one so the roof stays on top; or below its lowest level for a basement, which goes one storey under the lowest level and every existing level keeps its place, the ground floor included. On a scene with no building (a new or cleared scene), it starts the scene as the editor does: a site, a building and its ground level. A level that ends up below grade says in its result how a new wall on it is built (wallConstruction): a wall against the ground is a foundation wall, built of what the building's region says: 8 in CMU with 2x4 pressure-treated furring laid flat inside (0.241 m) in the United States and where the scene does not say where the building stands, 25 cm cast concrete insulated and waterproofed outside (0.354 m) in Europe; the result names the region it read, a partition is an ordinary wall. To copy a floor with its content, use duplicate_level.

NameTypeReqDescription
buildingIdstring–The building. Default: the building of the floor the person is viewing, else the scene's only building.
heightnumber|string–Floor-to-floor storey height (default 2.5 m). In metres, or text with a unit ("6 ft"). Must be greater than 0 m.
namestring–Name of the level, e.g. "Basement", "Attic".
positionstring–above (default): over the top storey, under the roof level; below: under the lowest, a basement.

No output schema declared.

No examples provided.

add_object ~1,883

Author parametric Three.js furniture, decor and custom objects of any shape, dimensions or style, whether or not the catalog holds something similar (the catalog is a limited set that varies by server). Examples include a low oak table, a slatted bench, a paper lantern, built-ins, custom columns and capitals, mouldings and trim, panels, exposed beams, ceiling bodies, canopies, a porch and railings. Pascal runs the module in a sandbox, stores the result and places it as one object the user can move, paint, and ask you to edit again. Module shape (import THREE from the three package as usual; the addons below too): // also available: three/addons/utils/BufferGeometryUtils.js, three/addons/geometries/{RoundedBoxGeometry,ConvexGeometry,LoftGeometry,ParametricGeometry}.js, three-bvh-csg (Brush, Evaluator, SUBTRACTION, ADDITION, INTERSECTION) export const params = { width: { default: 4.8, min: 3, max: 8, step: 0.1, unit: 'm', label: 'Width' } } export const mount = 'floor' // 'floor' | 'wall-side' (on a wall face) | 'wall' (through a wall, like a window) | 'ceiling' export default function build({ params, THREE }) { const group = new THREE.Group(); /* … */ return group } One object is one feature that changes together: a table, a bench, a porch, a railing run, a fireplace surround, a ceiling with its beams. Never a whole house, and never walls, rooms, floors, roofs, stairs, doors or windows: those have their own tools. A new object's reason records its design intent: what the authored shape, dimensions or style contributes to the request. The scene check lists every authored object with its reason; no catalog-exhaustion proof is required. On a floor, a plain box with a wall's size or a floor plate is refused with the tool to use (use_walls, use_slab); a detailed object with a wall's size (a bookcase, a screen), or one named after something Pascal builds, is built with a hint naming the tool. Conventions (they make the object work in Pascal; follow them): - M…

NameTypeReqDescription
categorystring–What it is, one word or two ("table", "bench", "porch", "lantern", "trim").
codestring–The module (see the tool description). Required to create; omit to rebuild an object with new params.
descriptionstring–A short description of this design, at most 200 characters.
languagestring–The code's language: 'three' (default) for a three.js module, 'bpy' for a Blender module (see add_object). On an edit it defaults to the language the object was built in.
namestring–What the user would call it ("Low oak table").
nodeIdstring–Edit this existing authored object instead of creating one.
paramsobject–Values for the params the module declares; on an edit, each one you leave out keeps its current value (clamped to the param's range) and a param new to the code starts at its default.
parentIdstring–Host for a new object: a level (default: the floor in view), a wall (wall / wall-side mounts), a ceiling, or an item it rests on.
positionarray–Placement of the mount origin in the host frame, metres. Floor: [x, y, z] locates the bottom-centre (y = 0 on the level floor). Ceiling: [x, y, z] locates the top-centre (y = 0 on the drawn ceiling a…
reasonstring–Design intent: why this authored shape, size or style suits the request ("low oak table for the Japandi seating area"). Required to create; an edit keeps it unless given. No catalog-exhaustion proof…
rotationnumber|string–Y-axis rotation in the host frame. New wall-side back mounts default to 180° so +Z faces away from the wall; other new objects default to 0°. An edit keeps its saved rotation unless given. In degrees…
sidestring–Which wall face a wall-side object sits on.
tagsarray–Up to five short lowercase search tags, at most 32 characters each.

No output schema declared.

No examples provided.

add_wall ~601

Add a single wall between two points on a level, straight or, with curveOffset, an arc. Refused with a code: a level that is not a storey (a declared roof level), and a wall shorter than 1 cm. On a level below grade, a wall against the ground (on the outline of the walls of the level) is a foundation wall, built of what the building's region says: 8 in CMU with 2x4 pressure-treated furring laid flat inside (0.241 m) in the United States and where the scene does not say where the building stands, 25 cm cast concrete insulated and waterproofed outside (0.354 m) in Europe; the result names the region it read; a partition inside the outline is an ordinary wall; the result says which.

NameTypeReqDescription
curveOffsetnumber|string–Bends the wall into an arc: the sagitta, from the middle of the straight line start→end to the middle of the arc. Positive bows the middle toward the back face (the −normal side, normal (−Δz, Δx) of…
endarrayyes[x, z] end point in level coordinates (metres).
heightnumber|string–Wall height (default: the storey's height). In metres, or text with a unit ("6 ft"). Must be greater than 0 m.
levelstring–Same as levelId.
levelIdstring–The level, by an id list_levels returned; an id made up from a name ("level_1", "level_ground") does not exist. Default: the floor the person is viewing, else the lowest floor.
startarrayyes[x, z] start point in level coordinates (metres).
thicknessnumber|string–Wall thickness (default 0.1 m; a wall against the ground on a level below grade, given none, is a foundation wall built of what the building's region says: 8 in CMU with 2x4 pressure-treated furring…

No output schema declared.

No examples provided.

add_window ~926

Add a window to an existing straight wall at t (0..1 along it), centred vertically on the wall, or on sillHeight above the floor when given. It slides to stay on the wall and under the wall's ceiling, and reports clamped. Refused with a code, as in the editor: curved walls, walls shorter than the window, overlapping another door, window or wall item unless force is set, and a style on a window that is not Fixed (style_needs_fixed_window). Match the reference with the outline (rectangle, rounded, arch), windowType and panes (columns × rows, or a style); what they cannot express (glass strips, leaded lites, a feature frame) is written as a script in code, never left as not possible.

NameTypeReqDescription
archHeightnumber|string–Rise of the arch above its straight sides, within height (arch only; default 0.35 m). In metres, or text with a unit ("6 ft"). Must be greater than 0 m.
categorystring–What this design is, in one or two words.
codestring–An optional module (three.js, or bpy with language) for a window (a fan grille, tracery, carved trim): the same module and conventions as add_object, with mount 'wall'. Its size is what it builds (na…
columnsinteger–Panes across, equal widths; overrides the style's panes.
cornerRadiusnumber|string–Radius of the rounded top corners (rounded only; default 0.15 m). In metres, or text with a unit ("6 ft"). Must be greater than 0 m.
descriptionstring–A short description of this design, at most 200 characters.
forceboolean–Place it even where it overlaps another door, window or wall item, like holding Alt in the editor. Only when the person asks for the overlap.
heightnumber|string–Window height (default 1.5 m). In metres, or text with a unit ("6 ft"). Must be greater than 0 m.
languagestring–The code's language: 'three' (default) for a three.js module, 'bpy' for a Blender module (see add_object). On an edit it defaults to the language the object was built in.
namestring–What the user would call this design.
nodeIdstring–Rebuild this window instead of adding one: new code and/or params (get_source provides current code when needed). Its native fields change with update_node.
openingShapestring–Outline of the opening: rectangle (default), rounded top corners, or arch (round top).
paramsobject–Values for the params the module declares; on an edit, each one you leave out keeps its current value (clamped to the param's range) and a param new to the code starts at its default.
positionnumber–Same as t.
rowsinteger–Panes up, equal heights; overrides the style's panes.
sillHeightnumber|string–Height from the floor to the bottom of the window (default: centred vertically on the wall). In metres, or text with a unit ("6 ft"). Minimum 0 m.
stylestring–Visual preset of a Fixed window's panes (never the size); same presets as create_room windows[]. Fixed windows only: an operable window draws its own sashes.
tnumber–Position along the wall, 0..1: 0 = start, 0.5 = centre, 1 = end.
tagsarray–Up to five short lowercase search tags, at most 32 characters each.
wallIdstring–The wall to add the window to.
widthnumber|string–Window width (default 1.5 m). In metres, or text with a unit ("6 ft"). Must be greater than 0 m.
windowTypestring–How it opens (default fixed).
NameTypeReqDescription
achievedobjectyes–
clampedbooleanyes–
coordinateSystemstringyes–
localXnumberyes–
messagestringyes–
okbooleanyes–
persistenceobject––
projectstring|null––
sillHeightnumber––
tnumberyes–
unsavedstring––
wallIdstringyes–
wallLengthnumberyes–
windowIdstringyes–

No examples provided.

analyze_floorplan_image ~89

Defer to the MCP host (via sampling) to extract walls, rooms, and approximate dimensions from a floor-plan image. Requires host support for sampling.

NameTypeReqDescription
imagestringyesBase64-encoded image or http(s) URL
scaleHintstring–Text hint about scale, e.g. '1 cm = 1 m' or 'approximately 80 m²'
NameTypeReqDescription
approximateDimensionsobjectyes–
confidencenumberyes–
roomsarrayyes–
wallsarrayyes–

No examples provided.

analyze_room_photo ~57

Defer to the MCP host (via sampling) to extract approximate dimensions, fixtures, and windows from a single-room photograph. Requires host support for sampling.

NameTypeReqDescription
imagestringyesBase64-encoded image or http(s) URL
NameTypeReqDescription
approximateDimensionsobjectyes–
identifiedFixturesarrayyes–
identifiedWindowsarrayyes–

No examples provided.

apply_patch ~341

Apply a batch of create/update/delete operations atomically. All patches are validated before any are applied; the entire batch forms a single undo step. Batch-first is the default: prefer one apply_patch call containing all create/update/delete ops for a build step, in stable order so later ops can reference ids created by earlier ops. A single call is atomic (all or nothing) and pays the snapshot and save cost once; do not loop one-op calls. A create whose id already exists fails the whole patch with node_exists; to replace a node, delete it earlier in the same patch. An update cannot change id or type (identity_change) or object or children (immutable_field); restating the current value is fine. A parentId change must name an existing node that holds children (invalid_parent). An update cannot add schema issues to a node (invalid_update). After a delete or a roof update that regenerates a roof's default gutters, those gutters and their downspouts are addressable only in a later call (regenerated_default). A roof created or moved onto the storey whose walls carry it goes to the level above them (the roof level over a top storey), said in notes; storey content (walls, zones, slabs, ceilings, items, stairs) on a roof level (roof_level), a walled level declared the roof level (roof_level_holds_storey) and floor indexes putting a roof level under a storey (roof_level_on_top) are refused. Refusals come back as a tool error whose text is JSON {code, patchIndex, id, message}.

NameTypeReqDescription
patchesarrayyes–
NameTypeReqDescription
appliedOpsnumberyes–
createdIdsarrayyes–
deletedIdsarrayyes–
notesarray––
persistenceobject––
projectstring|null––
unsavedstring––

No examples provided.

author_scene ~711

Turn a whole design you wrote as free three.js into an editable Pascal scene, in one call. You read your own module however you like (its source, running it and reading the objects, both) and hand over a conversion payload: levels, walls with their openings, rooms, slabs, columns, railings, every piece of furniture as an authored object with its own module, and lights. Pascal does the rest server-side: compiles and stores each item, places it, derives the rooms and their floors, paints, runs its checks, saves, and answers with a gate report you iterate against. Nothing you hand over is silently dropped: what cannot be placed comes back by name with a reason, and what Pascal corrected (a wall end snapped onto the centerline it meets) is listed. Coordinates: metres, plan x/z, Y up, each level's floor at y = 0 in its own frame. A wall is its centerline; walls meet where centerlines meet, so end a partition on the centerline of the wall it runs into. An opening's 'along' is measured from the wall's start to the opening's centre; give each opening its type (how it opens) and style (its look), or its own module for a shape they cannot express. An item's position is where its bottom centre stands; its module follows the add_object contract (metres, Y up, built in its installed orientation; at most 300k triangles and 32 materials per item; name materials slot_<finish>; drawers, doors and lids as animation clips; a THREE light named light:<id> where a bulb is). A hex colour is written as an exact material, one per distinct colour. Pascal builds a wall's cap, the floor plate and the ceiling itself: fold a module's caps, underlays and floor planks into the wall, the room's floor finish and the room (say so in notes), never into slabs or regions: baseboards are the wall's skirting, a plank or tile floor is the room's floorCode, tiles, panelling or boards on a wall are its faceLeft / faceRight (or the room's wallCode); a slab is a terrace, a platform, a balcony. Build the buil…

NameTypeReqDescription
adapterstring–The program that produced the payload from the module. Stored with the scene, so a regenerated design starts from it.
buildingIdstring–The building to convert into. Required when there are several and no active level selects one.
modulestring–The three.js module the payload was read from. Stored with the scene as its source.
payloadobjectyes–
replaceboolean–Apply a new design delta to the previous conversion, preserving manual edits (default false).
sceneIdstring–The scene to write; the active one when omitted.

No output schema declared.

No examples provided.

check_collisions ~144

Assess declared item footprints with a rotation-aware plan AABB test. Supports an explicit minimum clearance and reports units, source dimensions, skipped evidence, and unsupported checks. Optionally scope to one level or floor-standing items.

NameTypeReqDescription
candidateobject–Read-only prospective furniture item. It is checked against the target level but never added to the scene.
floorOnlyboolean–When true, wall-, wall-side-, and ceiling-attached items are excluded.
levelIdstring––
minimumClearancenumber|string–Minimum free plan-space required between item footprints. In metres, or text with a unit ("6 ft"). Minimum 0 m.
NameTypeReqDescription
assessmentGraphHashstringyes–
candidateItemIdstring|nullyes–
checkedItemsarrayyes–
collisionsarrayyes–
floorOnlybooleanyes–
methodstringyes–
minimumClearanceMetersnumberyes–
skippedItemsarrayyes–
statusstringyes–
unitsstringyes–
unsupportedChecksarrayyes–

No examples provided.

clear_scene ~104

Empty the project on purpose, back to the default scaffold: a site, a building and one level of the standard storey height. It is the only way to empty a project: a write that would empty it is refused (scene_wipe_blocked), since that is far more often an accident. Call it only when the person asked to start over, and say what they asked in reason.

NameTypeReqDescription
reasonstringyesWhat the person asked for, in their words.
NameTypeReqDescription
clearedobjectyes–
graphHashstring|nullyes–
persistenceobject––
projectstring|null––
unsavedstring––
versionnumber|nullyes–

No examples provided.

create_from_template ~117

Instantiate a seed Pascal scene template into the bridge. Regenerates all ids before applying. When `save: true` and a SceneStore is wired, also persists the new scene and returns the SceneMeta.

NameTypeReqDescription
idstringyesTemplate id (see `list_templates`). Currently one of: "empty-studio", "two-bedroom", "garden-house".
namestring–Optional display name for the saved scene. Defaults to the template name.
projectIdstring––
saveboolean––
NameTypeReqDescription
nodeCountnumberyes–
rootNodeIdsarrayyes–
saveSkippedboolean––
sceneobject––
templateIdstringyes–

No examples provided.

create_house_from_brief ~106

High-level hosted workflow for external agents: choose a starter house from a brief, create/save/publish it, and return the editor URL. Use semantic tools afterward for exact customization.

NameTypeReqDescription
bedroomCountinteger––
briefstringyes–
constraintsstring––
landscapingboolean––
projectIdstring––
projectNamestring––
roomsarray––
stylestring––
NameTypeReqDescription
defaultLevelIdstring|nullyes–
editorUrlstring|nullyes–
isDraftbooleanyes–
levelIdsarrayyes–
limitationsarrayyes–
nextStepstringyes–
nodeCountnumberyes–
projectIdstring|nullyes–
publishedbooleanyes–
roomCountnumberyes–
summarystringyes–
templateIdstringyes–
urlstring|nullyes–
validationobjectyes–
versionnumber|nullyes–

No examples provided.

create_mezzanine ~160

Add an open-below room inside a host reference polygon, with a separate thin plate and railings on open edges. Minimum area 1 m²; elevation defaults to half the storey snapped to 0.05 m, thickness to 0.2 m. Elevation must exceed thickness and stay at least 0.3 m below the resolved footprint plane; overlapping mezzanines are refused. The host floor and walls stay intact.

NameTypeReqDescription
elevationnumber|string–In metres, or text with a unit ("6 ft").
hostZoneIdstringyes–
polygonarrayyes–
thicknessnumber|string–In metres, or text with a unit ("6 ft"). Minimum 0.02 m.
NameTypeReqDescription
achievedobject––
changesnumberyes–
conflictsarray––
hintsarray––
idMapobject––
openingIdstring––
openingIdsarray––
payloadobject––
persistenceobject––
projectstring|null––
separatorIdstring––
separatorIdsarray––
unsavedstring––
zoneIdstring––
zoneIdsarray––

No examples provided.

create_project ~55

Create a browser-visible Pascal project for the authenticated user. Use this before save_scene when the user asks for a new project.

NameTypeReqDescription
idstring––
isPrivateboolean––
namestringyes–
NameTypeReqDescription
browserVisibleVersionnumber|nullyes–
createdAtstringyes–
defaultLevelIdstring|nullyes–
draftVersionnumber|nullyes–
editorUrlstringyes–
graphHashstring|nullyes–
idstringyes–
isEmptybooleanyes–
latestVersionnumber|nullyes–
levelIdsarrayyes–
namestringyes–
nextStepstringyes–
nodeCountnumberyes–
ownerIdstring|nullyes–
projectIdstringyes–
publishedVersionnumber|nullyes–
sizeBytesnumberyes–
thumbnailUrlstring|nullyes–
updatedAtstringyes–
urlstringyes–
versionnumberyes–

No examples provided.

create_roof ~884

Cap a storey with a roof over its footprint (its walls' outline, else its floor plates, else its rooms), swept in the building's own axes into rectangles, one roof segment each. Without a roofType: a gable for one rectangle, hips for a few wings, flat for a large block. The roof goes on the building's roof level above the top storey (the empty level directly above when it is the only one; made, named Roof, when there is none), and stands on the storey's wall tops, so exploded and solo level views lift it off the plan. Glazed construction supports gable, straight shed and barrel. Barrel depth is the span; barrelRise is at most half the span. glazing controls frame, glass, grids and panels. Paint glazing-frame, glazing-glass or glazing-solid. Call it once the storeys and their exterior walls stand. Refused with a code: storey_above (another storey stands above: a roof caps the top one; a lower wing's roof is drawn with the Roof tool), building_required (no level named on a site of several buildings: pass a level of the one to roof), roof_exists (the storey already has a roof: edit it, or delete_node it first when the person asked for a new one), no_rooms (no rooms or closed walls on any level of the building: pass width and depth to roof a rectangle of your own).

NameTypeReqDescription
barrelRisenumber|string–Barrel arch rise, at most half each segment span. In metres, or text with a unit ("6 ft"). Must be greater than 0 m.
barrelSegmentsinteger––
centerarray–The rectangle's centre [x, z] in metres (default [0, 0]).
depthnumber|string–The rectangle's depth, along z. In metres, or text with a unit ("6 ft"). Must be greater than 0 m.
fasciaHeightnumber|string–A fascia band of that height round the roof's eaves and rakes; on a flat roof it reaches the roof's top, a coping over its edge. Absent (and no fasciaMaterialPreset): no band. In metres, or text with…
fasciaMaterialPresetstring–The band's finish, a library material (a black fascia: library:preset-nearblack); the roof's wall finish when absent.
glazingobject––
levelstring–Same as levelId.
levelIdstring–The storey to cover, by an id list_levels returned. Default: the top storey with rooms. A level without rooms stands for the highest storey of its building that has some.
materialPresetstring–The roof finish, a library material.
namestring–What the user would call it (default "Roof").
overhangnumber|string–Eave overhang: how far the eaves reach past the walls in plan (a segment stores it along its slope). Read it from the photo: a deep modern overhang is 1–2 m. Default 0.3. In metres, or text with a un…
pitchnumber|string–Slope of the roof planes (default 40°). In degrees, or rise over run ("6:12"). Range 0–85 deg.
roofSystemstring––
roofTypestring–The shape of every segment. Default: chosen from the footprint.
wallHeightnumber|string–Knee walls under the eaves (default 0: the roof starts at the wall tops). In metres, or text with a unit ("6 ft"). Minimum 0 m.
wallThicknessnumber|string–Roof wall thickness. In metres, or text with a unit ("6 ft"). Must be greater than 0 m.
widthnumber|string–With depth: roof a rectangle of your own instead of the footprint (a wing, or walls drawn without rooms), along x. In metres, or text with a unit ("6 ft"). Must be greater than 0 m.

No output schema declared.

No examples provided.

create_room ~760

Create a room on a level from its polygon: a wall per edge, an edge a wall already runs along reusing that wall (rooms share their boundary with their neighbour), and the room zone that names it. The floor plate and the ceiling are derived from the room — never author a slab or a ceiling for it. Declare the room's doors and windows in the same call by polygon edge (wallIndex) and t along it, no wall ids needed; each is placed with add_door's and add_window's rules, and one that cannot be is skipped and listed in skippedOpenings with its code. Returns zoneId, slabId, ceilingId, wallIds in edge order (null where no wall), doorIds, windowIds. outdoor: true draws a terrace instead: separators where no wall runs, no walls of its own and no ceiling. Where the walls already enclose a room the reconciler numbered, the call names that room instead of adding a second one; where they enclose a room with a name of its own (not a number the editor gave it), it is refused (room_named_by_person) unless rename is true, which you pass only when the person asked for the rename, so a name is never changed silently.

NameTypeReqDescription
colorstring–Hex colour of the room zone, e.g. "#22c55e"; omit it and the room gets a palette colour picked from its id.
doorsarray–The entry door and the doors to the rooms next to it.
levelstring–Same as levelId.
levelIdstring–The level, by an id list_levels returned; an id made up from a name ("level_1", "level_ground") does not exist. Default: the floor the person is viewing, else the lowest floor.
namestringyesRoom name, e.g. "Bedroom", "Kitchen".
outdoorboolean–true for an outdoor room (a terrace): closed with separators (the editor's Separator: a room boundary with no wall) where no wall runs, no walls of its own and no ceiling.
polygonarrayyesThe corners in order, as [x, z] in metres.
renameboolean–Only where the walls already enclose a room with a name of its own (not a number the editor gave it): true names that room with `name` instead of the refusal room_named_by_person. Pass it only when t…
wallHeightnumber|string–Omit to follow the storey and covering-slab underside. Equal to the stored storey height also follows that plane; other values are body heights above the wall's support, including deliberately taller…
wallThicknessnumber|string–Thickness of the walls it builds. Omitted, a wall against the ground on a level below grade is a foundation wall built of what the building's region says: 8 in CMU with 2x4 pressure-treated furring l…
windowsarray–Windows, on exterior edges only: not on an edge shared with another room.
NameTypeReqDescription
achievedobject––
areaSqMetersnumberyes–
ceilingIdstring|nullyes–
doorIdsarrayyes–
messagestringyes–
okbooleanyes–
persistenceobject––
projectstring|null––
reusedWallsnumberyes–
skippedOpeningsarray––
slabIdstring|nullyes–
unsavedstring––
wallIdsarrayyes–
windowIdsarrayyes–
zoneIdstringyes–

No examples provided.

create_stair ~1,321

Create a staircase rising from a level, as the editor's stair tool builds one: straight, L (a flight, a landing as deep as the stair is wide, a flight turned 90°) or U (a flight, a landing across, a flight back beside the first). It rises to the level above and owns the floor opening it cuts in every floor it passes; when no level stands above, a blank one is made for it. toLevelId null makes a flight to no level (porch steps, a deck, a raised platform): it rises height, cuts nothing and makes no level. Refused with a code: a flight to or from a declared roof level, and a toLevelId that is not above the level it rises from. GEOMETRY (get this wrong and the stair pokes through a wall): - (x, z) is the middle of the bottom riser, where the flight starts. The first flight runs from there along the climb: at rotation 0 it covers x − width/2 .. x + width/2 and z .. z + its run. - rotation in degrees about Y: 0 climbs toward +Z, 90 → +X, 180 → −Z, 270 → −X. Point the climb into the room, away from the wall the bottom step sits against. - An L or U turns to the climber's left or right (turn). The result gives the whole footprint and the point the top step arrives at. - Keep 0.9 m clear at the foot and at the head of the flight, and the whole footprint inside one room on both levels (a hall is typical): read the room's outline first (get_zones). OPENINGS: by default the stair owns the opening over its flights and keeps it as the stair moves (openingOffset widens it). An opening of another size, centre or turn, through a slab or ceiling you name, or through one of the two only, is cut as an opening the stair owns, as given.

NameTypeReqDescription
createDestinationSlabOpeningboolean–Cut the floor it arrives through (default true).
createSourceCeilingOpeningboolean–Cut the ceiling of the floor it leaves (default true).
destinationSlabIdstring–The slab it arrives through. Default: the floor of the level it arrives on.
heightnumber|string–Vertical rise. Omit it unless asked for a specific rise: the flight then follows the storey's floor-to-floor height and keeps tracking it. In metres, or text with a unit ("6 ft"). Must be greater tha…
layoutstring–straight (default); l: a flight, a landing, a flight turned 90°; u: a flight, a landing across, a flight back beside the first.
lengthnumber|string–The flights' horizontal run along the climb, landings aside (default: from the stair's design targets, 0.28 m of going per riser, risers of at most 0.18 m). In metres, or text with a unit ("6 ft"). M…
levelstring–Same as levelId.
levelIdstring–The level, by an id list_levels returned; an id made up from a name ("level_1", "level_ground") does not exist. Default: the floor the person is viewing, else the lowest floor.
lowerStepsinteger–An L or U's risers in the first flight; the rest are in the last (default half).
materialPresetstring–A library material for the flight (library:<id>); an unknown one is refused.
namestring–Its name (default Staircase N).
openingCenterarray–The opening centre (x, z). Default: the middle of the stair's footprint.
openingLengthnumber|string–The opening along the climb (default the stair's footprint). In metres, or text with a unit ("6 ft"). Must be greater than 0 m.
openingOffsetnumber|string–A margin round the opening on every side (default 0.08 m). In metres, or text with a unit ("6 ft"). Minimum 0 m.
openingRotationnumber|string–The opening's turn (default the stair's). In degrees, or text with a unit ("1.57rad").
openingWidthnumber|string–The opening across the climb (default the stair's footprint). In metres, or text with a unit ("6 ft"). Must be greater than 0 m.
railingMaterialstring–A library material for the railings (library:<id>); an unknown one is refused.
railingModestring–Which sides have a railing, looking up the flight (default both).
railingStylestring–How the railings are built (default balusters): post-and-rail, cable (contemporary with a black railingMaterial), boards, glass or metal.
rotationnumber|string–The first flight's climb (default 0 = toward +Z; 90 = +X, 180 = −Z, 270 = −X). In degrees, or text with a unit ("1.57rad").
sourceCeilingIdstring–The ceiling it rises through. Default: the ceiling of the level it leaves.
stepsinteger–Number of risers in all. Omit it to derive ~18 cm risers from the rise; pass it when the run was planned from a step count.
toLevelId––The level the flight arrives on. Default: the next level above, created when there is none. null: a flight to no level, rising height (default the storey's floor-to-floor height).
turnstring–Which way an L or U turns, to the climber's left or right (default left).
widthnumber|string–Side-to-side width, across the climb (default 1.0 m). In metres, or text with a unit ("6 ft"). Must be greater than 0 m.
xnumberyesX of the middle of the bottom riser.
znumberyesZ of the middle of the bottom riser.

No output schema declared.

No examples provided.

create_story_shell ~327

Create one level-owned building shell from a footprint: the perimeter walls. The floor plate and the ceiling are DERIVED from the rooms the walls enclose — never author a slab or a ceiling here, and never pass boundary/autoFromWalls; createSlab / createCeiling / slabElevation are recorded as room intent instead. Use once per story; do not make first-floor walls span multiple stories.

NameTypeReqDescription
ceilingHeightnumber|string–Ceiling height. In metres, or text with a unit ("6 ft"). Must be greater than 0 m.
ceilingMaterialPresetstring––
createCeilingboolean–Ceiling intent for the rooms inside the shell. False records hasCeiling: false.
createSlabboolean–Floor intent for the rooms inside the shell. False records hasFloor: false.
footprintarrayyes–
levelIdstringyes–
namePrefixstring––
slabElevationnumber|string–Walking surface of the derived plate, stored as the room's floor elevation. In metres, or text with a unit ("6 ft").
slabMaterialPresetstring––
wallHeightnumber|string–Explicit wall height override. Omit for level-plane-bound walls. In metres, or text with a unit ("6 ft"). Must be greater than 0 m.
wallMaterialPresetstring––
wallThicknessnumber|string–Wall thickness. In metres, or text with a unit ("6 ft"). Must be greater than 0 m.
NameTypeReqDescription
ceilingIdstring|nullyes–
createdIdsarrayyes–
levelIdstringyes–
persistenceobject––
projectstring|null––
slabIdstring|nullyes–
unsavedstring––
wallIdsarrayyes–
zoneIdsarrayyes–

No examples provided.

create_unit ~61

Create a named unit in a building, optionally referencing zones across its levels.

NameTypeReqDescription
buildingIdstringyes–
colorstring––
kindstring––
memberZoneIdsarray––
namestringyes–
NameTypeReqDescription
persistenceobject––
projectstring|null––
unitIdstringyes–
unsavedstring––

No examples provided.

cut_floor_opening ~141

Create a persistent opening on a room or level from a polygon or rectangle. A floor cut also opens the automatic ceiling directly below; a ceiling cut can also open the floor above. Use cutsAdjacent:false for a one-surface cut. A mezzanine room cuts only its own plate. levelIds repeats the opening as a shaft on several levels.

NameTypeReqDescription
cutsAdjacentboolean––
cutsPrimaryboolean––
drawnOnstring––
levelIdstring––
levelIdsarray––
polygonarray––
rectobject––
zoneIdstring––
NameTypeReqDescription
achievedobject––
changesnumberyes–
conflictsarray––
hintsarray––
idMapobject––
openingIdstring––
openingIdsarray––
payloadobject––
persistenceobject––
projectstring|null––
separatorIdstring––
separatorIdsarray––
unsavedstring––
zoneIdstring––
zoneIdsarray––

No examples provided.

delete_node ~59

Delete a node with everything under it, as the editor's Delete does: a wall goes with its doors and windows, a level with everything on it. The floors above a deleted level keep their index.

NameTypeReqDescription
idstringyesThe node id.
NameTypeReqDescription
achievedobject––
deletedIdsarrayyes–
persistenceobject––
projectstring|null––
unsavedstring––

No examples provided.

delete_scene ~109

Remove a stored scene by id. In Pascal this never deletes the project: it hides it from Pascal's public listings until it is next saved with content, and answers `deleted: false, hidden: true` with a message; its owner can delete it from the projects page. Only someone who can manage the project may hide it. A local scene store deletes the scene. Optionally pass `expectedVersion` for optimistic concurrency.

NameTypeReqDescription
expectedVersioninteger––
idstringyes–
NameTypeReqDescription
deletedbooleanyes–
hiddenbooleanyes–
messagestring––

No examples provided.

delete_zone ~147

Delete a room. A room Divide made, which shares a separator (the editor's Separator: a room boundary with no wall) with a room on its outline, merges back into that room: the separators go, walls and items stay (mode "merge"). A room whose every boundary is a wall shared with other rooms is refused with a "shared-walls" conflict and nothing changes (mode "blocked"); delete one of its walls instead. Otherwise the room goes with its unshared walls, separators and their openings (mode "delete"), and contents chooses whether its items are kept or deleted. Returns the disposition payload.

NameTypeReqDescription
contentsstringyes–
zoneIdstringyes–
NameTypeReqDescription
achievedobject––
changesnumberyes–
conflictsarray––
hintsarray––
idMapobject––
openingIdstring––
openingIdsarray––
payloadobject––
persistenceobject––
projectstring|null––
separatorIdstring––
separatorIdsarray––
unsavedstring––
zoneIdstring––
zoneIdsarray––

No examples provided.

design_brief ~1,266

The design brief of the request, written once for the whole request (piece by piece when the request invites it): the request read axis by axis (action, size, pieces, openings, style, materials, source, dressing), each axis bounded by the person's own words or open with a design statement, a vision, and where the objects come from. It is recorded as the design record of the turn and answers with what it unlocks. It changes nothing in the scene. Furnishings are placed or made after a brief: place_items, furnish_room, place_in_room (the catalog's) and add_object, place_design (the agent's own), also inside run_batch. Before one, search_assets and view_assets read the catalog and every other tool works as usual; rooms, walls, openings and finishes are not furnishings. Bounded and open, in four readings. "a 4 by 5 m bedroom with a double bed, two nightstands, a wardrobe, one window, one door": action, size, pieces (as a minimum: those pieces must be there, more may come) and openings bounded; style, materials, source and dressing open. "add a lamp next to the sofa": action and dressing bounded by "add a lamp" (one object in a room that exists); style open, its design statement saying how this lamp is designed. "a bedroom with only a bed and a lamp": pieces exact and dressing bounded by "only a bed and a lamp"; style and materials open, the bed and the lamp designed, not defaulted. "Build a house": the action bounded only by "a house"; every other axis open, the dressing included. source open: the pieces are made (add_object, place_design), view_assets shows the catalog's pieces for reference, and furnish_room, which places a whole stock set, stays closed. asIs keeps technical equipment only (sanitaryware, kitchen and laundry appliances, heating and similar services): each piece is named with a reason and was shown by view_assets earlier in the same turn (chat) or session (MCP); furniture is made, not kept as it is. source catalog, brand or existing: place_items, furnis…

NameTypeReqDescription
asIsarray–With source open: technical equipment placed unchanged (place_items, place_in_room), each piece shown by view_assets first, each with its reason. Sanitaryware, kitchen and laundry appliances, heating…
axesobject–The request read axis by axis: action, size, pieces, openings, style, materials, dressing, each bounded (the person's words as quote, the reading in a short line) or open (a design statement saying h…
beyondobjectyesThe dressing of the rooms beyond the pieces the request names, layer by layer. An open dressing is a call to dress the rooms fully; beyond is where that design is stated.
brandstring–The range the request names, when source is brand ("IKEA").
sourcestringyesThe source axis: where the objects come from. open: the request names no source. catalog: it asks for the catalog. brand: it names a range (give brand). existing: it names pieces that already exist.
sourceQuotestring–Required with source catalog, brand or existing: the person's own words that name it (a brand, the catalog, what is already there), copied from the request ("IKEA furniture only").
visionstringyesA few lines: the design intent for what is open (character, forms, materials, how the room is meant to feel).

No output schema declared.

No examples provided.

divide_zone ~137

Divide a room with an open path (endpoints snap to its boundary; the seed side keeps its id) or a closed island (outer room keeps its id). The two rooms are parted by a separator (the editor's Separator: a room boundary with no wall), not a wall. Supply path or the legacy two-point cut. Islands need 0.25 m² and 5 cm wall clearance.

NameTypeReqDescription
closedboolean––
cutarray––
endBoundaryIdstring––
patharray––
startBoundaryIdstring––
zoneIdstringyes–
NameTypeReqDescription
achievedobject––
changesnumberyes–
conflictsarray––
hintsarray––
idMapobject––
openingIdstring––
openingIdsarray––
payloadobject––
persistenceobject––
projectstring|null––
separatorIdstring––
separatorIdsarray––
unsavedstring––
zoneIdstring––
zoneIdsarray––

No examples provided.

duplicate_level ~203

Copy a level with everything on it, as the editor does: fresh ids, internal links kept, and units whose rooms are all on that level copied too; plan references, scans and spawn points stay behind. The copy goes above the original (or below it) and the floors past it move up one.

NameTypeReqDescription
levelIdstring–The level to copy, by an id list_levels returned. Default: the floor the person is viewing.
namestring–Name of the copy. Default: none, so it reads by its floor like a new level (Floor 1, Ground floor…).
positionstring–Where the copy goes: above the original (default) or below it.
presetstring–What to copy, as in the editor: everything (default); structure (walls, zones, slabs, ceilings, roofs, stairs, doors, windows) without materials; structure with its materials; or structure and furnit…
NameTypeReqDescription
achievedobject––
copiedobjectyes–
floorIndexnumberyes–
namestring––
newLevelIdstringyes–
newNodeIdsarrayyes–
newNodeIdsOmittednumber––
persistenceobject––
projectstring|null––
shiftedLevelIdsarrayyes–
skippedobjectyes–
unsavedstring––

No examples provided.

duplicate_zone ~100

Copy room intent and contents with fresh IDs; shared walls are copied without openings. Rotation is radians about Y before translation. Collinear destination walls are merged, preserving their IDs and hosted children. Crossings split walls and rooms re-derive; overlap is allowed. Force can reposition obstructing openings only when they fit.

NameTypeReqDescription
forceboolean––
rotateobject––
translatearrayyes–
zoneIdstringyes–
NameTypeReqDescription
achievedobject––
changesnumberyes–
conflictsarray––
hintsarray––
idMapobject––
openingIdstring––
openingIdsarray––
payloadobject––
persistenceobject––
projectstring|null––
separatorIdstring––
separatorIdsarray––
unsavedstring––
zoneIdstring––
zoneIdsarray––

No examples provided.

Install

How do I install the Pascal 3D Editor MCP server?

Pascal 3D Editor runs locally as an npm package, launched with npx -y @pascal-app/mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

npm · @pascal-app/mcp

# add to Claude Code
claude mcp add app-pascal-editor -- npx -y @pascal-app/mcp
Common questions

What is the Pascal 3D Editor MCP server?

Pascal 3D Editor is an MCP server listed in the public MCP registry as app.pascal/editor. Create, inspect, validate, and save editable 3D building scenes with Pascal's MCP server. This page covers its npm package (@pascal-app/mcp).

Is the Pascal 3D Editor MCP server safe to use?

Pascal 3D Editor scores 79 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 24 October 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. 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 Pascal 3D Editor MCP server expose?

Pascal 3D Editor exposes 86 tools: get_scene, validate_design, place_design, measure_stair, fit_stair, and 81 more. Their descriptions and schemas cost roughly 26,008 tokens of context every time the server is loaded.

Is the Pascal 3D Editor MCP server still maintained?

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

What licence is the Pascal 3D Editor MCP server under?

Pascal 3D Editor declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.