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 (12 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
edit_collection ~209

Create, rename, recolour or delete a collection, or add and remove its elements. A collection is a named set of any scene elements (lights, windows, doors, columns, objects built with add_object…), listed in the editor's Collections; being in one changes nothing about the elements. Without collectionId the call works on the scene's collection with that template, or else that name, and creates it when there is none.

NameTypeReqDescription
addarray–Ids of the elements to add.
collectionIdstring–The collection to change.
colorstring–Colour, e.g. #f5b83d.
deleteboolean–Delete the collection; its elements stay in the scene.
namestring–Name of the collection, or its new name.
removearray–Ids of the elements to take out.
templatestring–Start from a template, which gives the name and colour unless you pass them.

No output schema declared.

No examples provided.

export_glb ~43

GLB export is not available in headless mode — it requires the Three.js renderer, which is browser-only. Returns a structured `not_implemented` tool error.

Input schema present but exposes no named parameters.

NameTypeReqDescription
reasonstringyes–
statusstringyes–

No examples provided.

export_json ~37

Return the scene as a serialized JSON string. Pass `pretty: true` to indent with 2 spaces.

NameTypeReqDescription
prettyboolean––
NameTypeReqDescription
jsonstringyes–

No examples provided.

find_by_type ~522

Find everything of one type in the scene, wherever it lives: nodes of that kind (column, door, window, wall, stair, imported-mesh, a plugin's kind…), items of that category, lights (any item that emits light), and typed parts inside scripted objects, windows and doors (a porch's columns, a window's grille). Narrow it to a level, a parent, a zone or an importer's source ids; without a type, every node the other filters match. A word that names nothing (no node kind, nor an item category or part type in this scene) is refused with the kinds the scene holds. Each result gives the node's id, name, kind, level and parent, with its metadata and provenance when it has them (one over 1 KB is named in omitted instead); get_node reads a node whole. Parts are read-only: they come back with their object's id, the part id and, for objects directly on a level, its bounds in level coordinates; edit them through their object. count says how many match; past limit (200 unless asked) the rest are left out of results, with truncated: narrow the call or raise limit.

NameTypeReqDescription
levelIdstring–Only this level. Default: every level.
limitinteger–How many results to list at most. Default 200; count still says how many match.
parentIdstring–Only the nodes directly under this one: a wall's doors and windows, a roof's segments, a level's walls.
sourceIdstring–Only the nodes an importer recorded under this source id (provenance.refs[].id, or legacy metadata.sourceIds), exactly. Characters outside printable ASCII also match their percent-encoded form.
sourceIdPrefixstring–Only the nodes with a source id starting with this.
typestring–What to find, one word: a node kind (wall, slab, imported-mesh, fixture:bench), an item category, light, or a part type (column, beam, panel, railing, trim…). Omit it to find every node the other fil…
zoneIdstring–Only what stands in this zone: on the zone's level, its plan point inside the zone's outline and outside its holes (a wall's midpoint, a polygon's centroid, a door or window where its wall puts it, a…

No output schema declared.

No examples provided.

fit_stair ~239

Explicitly replace stair riser proportions with uniform risers from design targets. Optionally fit going by changing flight runs or arc sweep; preserves landing elevations. Optional straight, L or U layout replaces the flight chain with width-sized turning landings or quarter-turn winders. Winder going is measured along the selected walking line. One atomic edit.

NameTypeReqDescription
divisionstring––
fitRunboolean––
innerGapnumber|string–In metres, or text with a unit ("6 ft"). Minimum 0 m.
landingDepthnumber|string–In metres, or text with a unit ("6 ft"). Must be greater than 0 m.
layoutstring––
stairIdstringyes–
targetsobject––
turnstring––
turningStrategystring––
walkingLineOffsetnumber|string–In metres, or text with a unit ("6 ft"). Must be greater than 0 m.
widthnumber|string–In metres, or text with a unit ("6 ft"). Must be greater than 0 m.
NameTypeReqDescription
measurements–yes–
persistenceobject––
projectstring|null––
stairIdstringyes–
unsavedstring––

No examples provided.

furnish_room ~522

Place the catalog's fixed furniture set for a room type: one set per type, not matched to a style. The bed, sofa, counters or toilet go against the wall facing the door, the rest along a side wall, each set off its wall by its own depth. Name the room by zoneId (its level and outline come with it), or give its polygon and level. The door wall is the edge a door of the room stands on, else doorWallIndex, else edge 0. Nothing lands in a door's clear zone or on another item: a piece that does not fit is nudged, else skipped, and skipped says why. Items stand on the room's level. The set per room type: bedroom: double-bed (a side of 3.2 m or more) or single-bed, two bedside-table, dresser (10 m² or more), closet (13 m² or more); kitchen: kitchen (back wall of 2.6 m or more) or kitchen-counter, stove (back wall of 3.5 m or more), fridge; bathroom: toilet, bathroom-sink, bathtub (6.5 m² or more) or shower-square; living: sofa, coffee-table, livingroom-chair, tv-stand; dining: dining-table, two dining-chair (four when both sides are 3 m or more); laundry: washing-machine, drying-rack; entry and hallway: coat-rack (both sides 1.4 m or more); storage: closet. The result lists each piece placed with its size and id, and each piece skipped with its reason. view_scene with interior { zoneId } shows the room from inside, at a person's height.

NameTypeReqDescription
doorWallIndexinteger–The polygon edge (i → i + 1) to treat as the door wall: for a room with no door yet, or to override the one found.
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.
polygonarray–The room's corners as [x, z] in metres, when there is no zoneId.
roomTypestringyesWhat the room is for.
zoneIdstring–The room: zoneId from create_room, or an id from get_zones.
NameTypeReqDescription
achievedobject––
doorWallIndexnumberyes–
doorsDetectednumberyes–
itemIdsarrayyes–
messagestringyes–
okbooleanyes–
persistenceobject––
placednumberyes–
projectstring|null––
skippedarrayyes–
unsavedstring––

No examples provided.

generate_variants ~133

Generate N variations of a base scene by forking and applying seeded mutations. Example: "give me 5 variations of this kitchen". If `save=true`, each variant is persisted via scene operations and returned with an id + URL; otherwise the graph is returned inline.

NameTypeReqDescription
baseSceneIdstring–If set, fork from this saved scene; else fork from current bridge state.
countinteger––
saveboolean–If true, also save each variant via SceneStore and return ids.
seedinteger–Deterministic RNG seed.
varyarray––
NameTypeReqDescription
variantsarrayyes–

No examples provided.

get_level_summary ~151

Summarise one level so nothing on it goes unseen: its role and counts, then walls (length, heights, doors and windows), zones (name, area, size, floor_choices), slabs, ceilings, items (floor, wall and ceiling), floor openings, stairs, roofs, and anything else by type. Zone polygons: get_zones; a node's full data: get_node.

NameTypeReqDescription
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.
NameTypeReqDescription
ceilingsarrayyes–
countsobjectyes–
floorIndexnumberyes–
isOccupiedStorybooleanyes–
isSupportLevelbooleanyes–
itemsarrayyes–
levelIdstringyes–
levelNamestring––
metadataRolestring|nullyes–
openingsarrayyes–
otherarrayyes–
referenceLevelIdstring|nullyes–
rolestringyes–
roofsarrayyes–
slabsarrayyes–
stairsarrayyes–
wallsarrayyes–
zonesarrayyes–

No examples provided.

get_node ~183

Get the full data of any node by its id: its fields as stored, with what the scene decides for it beside them (a wall's or a ceiling's resolvedHeight, and heightIsExplicit, false when it follows its storey; a wall's resolvedThickness; a door's or window's resolvedOpening, its floor and what it hangs from; the displayName a level or a floor plate is shown by); its ancestorIds, its parent first (a door's wall, then the level, the building, the site); and the scene materials (scene:<id>) its finishes use. A container's node lists its children as stored; any that name no node are listed again in missingChildIds. A node its schema rejects comes back as stored, with nothing derived (verify_scene says what is wrong).

NameTypeReqDescription
idstringyesThe node id.
NameTypeReqDescription
ancestorIdsarrayyes–
materialsobject––
missingChildIdsarray––
nodeobjectyes–

No examples provided.

get_project_status ~47

Authoritative status/debug call for a Pascal project: editor URL, browser-visible version, latest saved version, published version, node count, and graph hash.

NameTypeReqDescription
idstringyes–
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.

get_scene ~32

Returns the full scene graph: flat node dictionary, root node IDs, collections, and explicit installed plugin IDs when present.

Input schema present but exposes no named parameters.

NameTypeReqDescription
collectionsobject––
installedPluginsarray––
nodesobjectyes–
rootNodeIdsarrayyes–

No examples provided.

get_site ~235

Read the site a building stands on, in its level coordinates: the lot and its area, with the footprint a house usually covers on it (30 to 45%); the buildable area inside the setbacks with its centre, its area, each edge's frontage and depth, and its front edge (behind the street; while no street is recorded, behind the edge facing north, which the setbacks take as the front); the street side with the lot's frontage and depth on it; north; the ground (sloped with its fall, read flat, or not read); the address, parcel and zoning when known; whether the lot is only the new-project placeholder; and where the footprint sits now with its yards.

NameTypeReqDescription
buildingstring–The building, by its id (list_levels' parentId). Default: the building of the floor the person is viewing, else the scene's only building.
sitestring–The site, by its id (get_site's siteId), when the scene has several: a lot no building stands on yet reads in site coordinates. Default: the building's site.

No output schema declared.

No examples provided.

get_source ~187

The module (three.js or Blender bpy, named by language) an object (or a window, door or column built from code) runs, with its params and their current values; a room's id reads its floor script, the module that builds its floor finish; a wall's id with face reads that face's script (face may be left out when only one face has one). Optional source evidence when the current module is needed. An edited module can be passed back with the same nodeId: to add_object for an object, to add_window / add_door / add_column for their respective kinds.

NameTypeReqDescription
facestring–A wall's face whose script to read; needed when both faces have one.
nodeIdstringyesAn object, window, door or column built from code, a room with a floor script, or a wall with a face script.

No output schema declared.

No examples provided.

get_walls ~190

Get the walls of a level: start and end in metres, length, stored and resolved height, thickness, and their doors and windows. wallFaceChains gives base-chain provenance for geometric faces a (left of start → end) and b (right): ref (authored face slot), legacy (inline spec), or default (declared fallback ref). These are not final rendered finishes: room intent, face paint regions, exterior assembly cladding and reference availability can change appearance. A chosen white or default-matching ref is legitimate; fallback alone is not a defect or a requirement to paint.

NameTypeReqDescription
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.
NameTypeReqDescription
levelIdstringyes–
wallsarrayyes–

No examples provided.

get_zones ~217

Get the zones (rooms) of a level: name, colour, polygon and holes in metres, area in m² (holes taken out), bounding size, and floor_choices: the floor plates the room can take (key, plateId, name, current; drawn and mezzanine flags). A room shares its floor plate with the rooms next to it unless detached. Persisted authored wall intent is wallMaterial (string, or null when absent) and wallOverrides (records of wallId, geometric face a or b, and finish; [] when absent). This is not a final rendered finish or visual verification: local overrides and face paint can take precedence, and absent room intent is not a defect or a requirement to paint.

NameTypeReqDescription
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.
NameTypeReqDescription
levelIdstringyes–
zonesarrayyes–

No examples provided.

list_collections ~46

List the scene's collections with their elements (id, name, type, level), and the templates a collection can start from.

NameTypeReqDescription
collectionIdstring–Only this collection.

No output schema declared.

No examples provided.

list_levels ~128

List every level of every building in floor order: id, name, floorIndex, building (parentId), role (occupied storey, roof-only level or support level), child count, gradeStanding (at-grade, partly-below-grade or below-grade against the ground line and the terrain), isGroundLevel, and which one the person is viewing (isActive); groundLevels names, per building, the level at grade (levelId, whether the building names it, floorElevation, gradeElevation, floorOverGrade, seated). A roof-only level is the roof, not a storey.

Input schema present but exposes no named parameters.

NameTypeReqDescription
activeLevelIdstring|nullyes–
activeSceneIdstring|nullyes–
levelCountnumberyes–
levelsarrayyes–
occupiedStoryCountnumberyes–
roofLevelIdsarrayyes–
supportLevelCountnumberyes–

No examples provided.

list_scenes ~51

List scenes in the SceneStore. Optionally filter by `projectId` and cap results with `limit` (default 100).

NameTypeReqDescription
limitinteger––
projectIdstring––
NameTypeReqDescription
scenesarrayyes–

No examples provided.

list_templates ~37

List the seed Pascal scene templates available to `create_from_template`. Returns the id, display name, one-line description and node count for each.

Input schema present but exposes no named parameters.

NameTypeReqDescription
templatesarrayyes–

No examples provided.

list_units ~32

List units with their member zones and current area reports, optionally filtered by building.

NameTypeReqDescription
buildingIdstring––
NameTypeReqDescription
unitsarrayyes–

No examples provided.

load_scene ~44

Load a scene from the SceneStore into the bridge. Returns the scene metadata. Throws `scene_not_found` if the id does not exist.

NameTypeReqDescription
idstringyes–
NameTypeReqDescription
createdAtstringyes–
defaultLevelIdstring|nullyes–
editorUrlstringyes–
graphHashstring––
idstringyes–
isDraftbooleanyes–
levelIdsarrayyes–
namestringyes–
nodeCountnumberyes–
ownerIdstring|nullyes–
projectIdstring|nullyes–
publishedbooleanyes–
saveModestringyes–
sizeBytesnumberyes–
thumbnailUrlstring|nullyes–
updatedAtstringyes–
urlstringyes–
versionnumberyes–

No examples provided.

lock_outside_faces ~68

Keep the building's outer size: put exterior wall faces on their fixed reference lines, moving wall bodies inward so walls thicken inward and later thickness edits preserve outer dimensions. Supply either levelId or zoneIds.

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

No examples provided.

measure ~184

Measure the distance (in meters) between two nodes, or the net area of a polygon node when fromId === toId. Distance is between world-space reference points, returned as fromPoint/toPoint: a positioned node's origin in its host's frame (an item's base, a door's or window's centre in its wall), a wall's or fence's midpoint at its base, a slab's, ceiling's or zone's polygon centroid on its plane, a block's or imported mesh's vertex-bounds centre, a level's plan centre on its base plane, and another container's descendants' centre. `approximate` lists nodes whose renderer derives the pose from data not modelled here (a downspout at its gutter outlet, a gutter at the eave), with the reason.

NameTypeReqDescription
fromIdstringyes–
toIdstringyes–
NameTypeReqDescription
approximatearray––
areaSqMetersnumber––
areaUnitsstring––
distanceMetersnumberyes–
fromPointarray––
toPointarray––
unitsstringyes–

No examples provided.

measure_stair ~74

Inspect actual flight risers, walking-line going, slope, arrival, uniformity, headroom against floors, ceilings and stair bodies, and design-target diagnostics without changing measured geometry.

NameTypeReqDescription
availableobject–The space a new layout may take, to propose layouts that fit it.
stairIdstringyes–
NameTypeReqDescription
layouts–yes–
measurements–yes–

No examples provided.

merge_windows ~331

Make two windows that exist one window, as the editor's Merge windows does: nothing is recreated. On two walls that meet at a corner, each window within 0.30 m of that corner, they become one corner window (the add_corner_window result): each is slid to the corner keeping its width, the glass fused (post none), and both take the first window's height, sill and type, so name first the window whose look you want; the corner is refused over 170° or under 10° (walls_not_meeting, corner_angle, window_not_at_corner, height_exceeds_wall). On one wall, two windows with at most 0.30 m between them and nothing between become one window spanning both outer edges, from the lower sill to the higher head, with the first window's type and style (windows_not_adjacent, opening_between). Refused with a code and a sentence that says why: window_not_found, not_a_window, same_window, window_not_on_wall, window_already_joined (unwrap it first), windows_already_joined, opening_overlap (sliding to the corner would land on another opening). Returns kind (corner or same_wall), the windows that stay (windowIds) and the one that went (removedIds). Use it for two windows already built that open a corner or one wide opening; add_corner_window builds a new pair, and verify_scene's corner_unjoined names two windows this joins.

NameTypeReqDescription
windowIdsarrayyesThe two windows, the one whose height, sill and type the result keeps named first.

No output schema declared.

No examples provided.

merge_zones ~50

Merge two rooms by removing the separators they share (the editor's Separator: a room boundary with no wall). Walls are preserved; wall-only boundaries return a conflict.

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

No examples provided.

move_roofs_to_roof_level ~245

Move the roofs a storey holds on its own walls to the level the roof rule gives them, as a roof's panel does by hand (Move to the roof level): over the top storey, the building's roof level (made, named Roof, when there is none); under an upper storey, that storey. Each roof stands exactly where it stood, its segments, finishes and id kept: only the level holding it changes, so exploded and solo level views show the storey's plan with no roof over it. For a project built before roofs had their own level, when verify_scene reports roof_mixed_in_storey. Refused with a code: level_not_found, no_roof_on_walls (the storey holds no roof standing on its walls; a porch roof on its beam and a lower wing's roof on the storey above already sit where they belong). Returns the roofs moved (roofIds), the level they went to (roofLevelId) and the roof level made for them (createdRoofLevelId).

NameTypeReqDescription
levelIdstringyesThe storey whose roofs move, by an id list_levels returned.

No output schema declared.

No examples provided.

move_zone ~103

Move room intent and contents. Shared walls and openings stay with neighbours; the room takes plain copies. Rotation is radians about Y, before translation, about the room centroid unless a pivot is supplied. Crossings split walls and overlaps re-derive rooms. Force can reposition obstructing openings when they fit; otherwise the edit is refused.

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

No examples provided.

paint ~811

Give walls, slabs, ceilings, roofs, columns, fences, doors, windows, stairs, blocks, cabinets, shelves, items and the other built parts a finish in one call, as the editor's Paint does. Give one finish: color (#rrggbb, painted with the nearest of the library's flat colours, said with how near); material, a library:<id> (find it with search_materials) or scene:<id> ref, or a native material {properties: {color, roughness, metalness}} for an exact finish, kept as a scene material (materialName names a new one) and reused when the scene holds an equal one; or erase: true, back to the surface's default. role picks the surface: a wall's face a or b, or exterior and interior (the faces turned out of its rooms or into them, else by its stored sides; a partition is interior on both; a wall whose sides are unknown, or with rooms along only part of a face, is refused: name its face, a or b), its trims aSkirting, bSkirting, aCrown, bCrown, aChairRail, bChairRail (skirting, crown or chairRail: that trim on both faces), a curtain wall's curtain-frame, curtain-glass, curtain-solid; a slab's surface, side, edge, riser, underside or foundation; a ceiling's surface; a roof's top (the covering), edge (the gable ends and the trim band), wall (the soffit and the deck edge, and the fascia and rake boards unless they have their own) or fascia (the fascia and rake boards, a fascia band); a glazed roof's glazing-frame, glazing-glass or glazing-solid; a column's shaft, base, capital or frame; a fence's posts, infill, base or rail; a door's panel, frame, glass or hardware; a window's frame or glass; a stair's treads, body or railing; a block's body; a cabinet's front, carcass, countertop, plinth, hardware or glass; another part's own slots, which a refusal names; an item's surfaces by the names its model gives them (its painted ones are in get_node's slots), which paint cannot check. Without a role: both faces of a wall, a slab's or a ceiling's surface, a roof's top, a glazed roof's frame a…

NameTypeReqDescription
colorstring–A colour, #rrggbb: painted with the nearest library colour.
eraseboolean–Back to the surface's default.
material––A library:<id> or scene:<id> ref, or a native material (properties color, roughness, metalness, and an existing texture) kept as a scene material.
materialNamestring–The name of a new native material; an equal one already in the scene keeps its own.
rolestring–The surface: see the description.
targetsarrayyesThe nodes to paint.
NameTypeReqDescription
achievedobject––
createdMaterialobject––
finishstringyes–
materialobject––
materialIdstring––
notestring––
okbooleanyes–
paintedarrayyes–
persistenceobject––
projectstring|null––
unsavedstring––

No examples provided.

photo_to_scene ~185

Orchestrator: analyse a floor-plan photo via MCP sampling, translate the structured vision result into a Pascal SceneGraph (site → building → level with walls and zones), optionally save it, and swap the bridge to the new scene. Requires host support for sampling.

NameTypeReqDescription
defaultWallHeightnumber|string–Default wall height. In metres, or text with a unit ("6 ft"). Must be greater than 0 m.
defaultWallThicknessnumber|string–Default wall thickness. In metres, or text with a unit ("6 ft"). Must be greater than 0 m.
imagestringyesBase64 or https URL of the floor-plan photo
namestring––
saveboolean––
scaleHintstring–e.g. "1 cm = 1 m" or "approx 80 m²"
NameTypeReqDescription
confidencenumberyes–
graph–––
notesstring––
roomsnumberyes–
sceneIdstring––
urlstring––
wallsnumberyes–

No examples provided.

place_building ~328

Stand a building on its site before or after its walls go up. It moves only the building node, so walls, levels and roofs keep their coordinates and move with it. The footprint (outline, the plan you are about to draw, in the coordinates you will draw it; else the walls standing) lands centred in the buildable area, or at the yards a site plan or the person gives. A building with walls keeps its rotation unless rotationDeg is given (get_site's squareRotationDeg squares it to the street); one with none yet is turned square to the street. Fences, paths and plants on its levels move with it.

NameTypeReqDescription
buildingstring–The building, by its id (list_levels' parentId). Default: the building of the floor the person is viewing, else the scene's only building.
outlinearray–The footprint's corners in order, as [x, z] in metres, in the level coordinates the walls are (or will be) drawn in. Default: the walls standing.
rotationDegnumber|string–The building's rotation about the vertical. Default: the rotation it has, or square to the street while it has no walls. In degrees, or text with a unit ("1.57rad").
yardsobject–Where the house stands instead of centred: at most one of front and rear, and one of left and right, from a site plan or the person. An axis not given stays centred in the buildable area. Needs the s…
NameTypeReqDescription
achievedobject––
buildingIdstringyes–
fitstringyes–
messagestringyes–
movedbooleanyes–
persistenceobject––
projectstring|null––
unsavedstring––

No examples provided.

place_design ~498

Create one instance of a design (procedural item recipe, object or JSON string) in the scene. The design must pass validate_design. Its mounting picks the host: floor designs go on a level (or a slab or zone of it) or on a named surface of a placed design; wall-side designs on a straight wall face; ceiling designs under a ceiling. Only creates: refusals carry a code (invalid_design with diagnostics, design_version_not_enabled for version 2 designs until the next release, design_too_large above 24 KiB, invalid_placement, node_exists, host_not_found, wrong_host, unknown_surface, does_not_fit) and change nothing.

NameTypeReqDescription
design–yesThe design (procedural recipe, version 1 or 2) as an object, or as a JSON string for clients that cannot send recursive objects. Schema: pascal://schema/design.
hostIdstringyesFloor designs: a level, or a slab or zone on it, or a placed design with surfaceId. Wall-side designs: a straight wall. Ceiling designs: a ceiling.
idstring–Optional new id ("procedural-item_…"). Refused if it exists: this tool only creates.
namestring––
parametersobject–Parameter values to measure at, by parameter id. Defaults otherwise.
positionarrayyesMetres. Floor: level-local [x, y, z], y above the floor. Wall-side: [along, height, offset] of the mounting reference from the wall start. Ceiling: plan [x, 0, z] of the reference. Surface: [x, 0, z]…
rotationnumber|string–Yaw. Not for wall-side designs; use side to face the other way. In radians, or text with a unit ("90°").
sidestring–Wall face for wall-side designs: front is the +normal side, normal (−Δz, Δx) of start→end. The wall's frontSide and backSide say which face is exterior (a facade light goes on that one).
slotsobject–Slot id to "#rrggbb" or a scene:/library: material reference.
surfaceIdstring–Named surface of the host design to rest on (see validate_design measurements.surfaces).
NameTypeReqDescription
designIdstringyes–
parentIdstringyes–
persistenceobject––
projectstring|null––
surfaceIdstring|nullyes–
unsavedstring––

No examples provided.

place_in_room ~662

Put one floor-standing catalog item in a room where it fits, without working out a position. Wall/ceiling-attached assets need a host: place_items accepts targetNodeId and, for a wall, y for the bottom height. A wall-bound floor piece (fridge, counter, stove, sink, TV stand, dresser, wardrobe, sofa, bed, bedside table, toilet, bath, shower, bookcase, cabinet) stands against a wall, centred in the widest free stretch of that wall (clear of every door and every other item), its front toward the room; it is never put in the middle, and when no wall has room the answer says how wide the widest free stretch is. A free-standing piece (dining table, rug, coffee table, plant, armchair) takes the middle of the room, or goes with what it belongs with: a coffee table and an armchair face the sofa. A chair goes around its table, one call per chair, facing the table, and is refused when the room has no table. Explicit edge, align, offset or inset instead requests a wall free run for any floor piece. Name the room by its zoneId (create_room, get_zones), or by its polygon and level. The item is a catalog id from search_assets. To furnish a whole room by its type in one call, use furnish_room.

NameTypeReqDescription
alignstring–Desired wall alignment, clamped into a valid free run. Defaults to the widest run’s center.
allowDuplicateboolean–Place it even though the room already has this item. Off by default (a second toilet or stove is a mistake); chairs are always allowed.
assetIdstringyesA known catalog id; search_assets can find it.
clearanceAreasarray–Existing clearance rectangles, in world metres, to keep free before placing.
edgeinteger–Stand it against this polygon edge (i → i + 1) instead of the best one.
facingstring–In by default. Out adds 180 degrees after any explicit rotationDeg.
insetnumber|string–Normal gap in metres between the rotated footprint and the wall centerline; defaults to 0.1 m. In metres, or text with a unit ("6 ft").
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.
offsetnumber|string–Signed metres along the wall from the desired alignment; defaults to zero. In metres, or text with a unit ("6 ft").
polygonarray–The room's corners as [x, z] in metres, when there is no zoneId.
rotationDegnumber|string–World yaw in degrees, overriding the automatic inward, group or table-facing yaw. In degrees, or text with a unit ("1.57rad").
zoneIdstring–The room: zoneId from create_room, or an id from get_zones.
NameTypeReqDescription
achievedobject––
againstobject––
aroundstring––
facingstring––
itemIdstringyes–
kindstringyes–
messagestringyes–
okbooleanyes–
persistenceobject––
placedobjectyes–
projectstring|null––
unsavedstring––

No examples provided.

place_items ~397

Place one or more catalog items (furniture, fixtures, plants, art, lights) in one call. Each assetId is a known catalog id, available from search_assets results or existing scene item data, never guessed. Positions are level (x, z) metres. An item stands on the floor of the level, or on the host it names (targetNodeId): a wall (art, a sconce: y is the height of its bottom above the floor, required; it goes on the side of the wall the point is on), a ceiling (a pendant, a downlight: it hangs flush under it), or an item standing on the floor (a lamp on a nightstand: it rests on its top; on an object built with add_object it rests on the real surface under the point, such as a porch landing, or a ceiling item hangs from the underside above it, such as a sloped vault, and the result names it in restingOn). A room, a slab or a level as the target means its floor. Each item is placed or refused on its own (asset_not_found; outside_rooms: an indoor item on the floor outside every room of a level that has rooms — garden and outdoor items may stand outside; height_required, item_too_tall, unsupported_host, host_not_found, host_not_on_level; blocks_door: a floor item standing where a door needs space, with a spot in its room that clears every door; too_large_for_room: a floor item its room cannot hold in any turn).

NameTypeReqDescription
itemsarrayyesThe items to place.
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.

No output schema declared.

No examples provided.

rebase_floor_reference ~72

Change or clear one or more footprint reference datums in one atomic edit, compensating supported storey offsets so existing world geometry stays in place. Supply slabIds together for a shared storey.

NameTypeReqDescription
referenceFloorElevation–yes–
slabIdstring––
slabIdsarray––
NameTypeReqDescription
achievedobject––
changesnumberyes–
conflictsarray––
hintsarray––
idMapobject––
openingIdstring––
openingIdsarray––
payloadobject––
persistenceobject––
projectstring|null––
separatorIdstring––
separatorIdsarray––
unsavedstring––
zoneIdstring––
zoneIdsarray––

No examples provided.

redo ~37

Redo the next N previously-undone steps (default 1). Returns the number of steps actually redone.

NameTypeReqDescription
stepsinteger––
NameTypeReqDescription
persistenceobject––
projectstring|null––
redonenumberyes–
unsavedstring––

No examples provided.

remove_floor_opening ~32

Remove an authored floor or ceiling opening and restore the derived surfaces it cut.

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

No examples provided.

rename_scene ~56

Rename a scene in the SceneStore. Returns the updated SceneMeta. Optionally pass `expectedVersion` for optimistic concurrency.

NameTypeReqDescription
expectedVersioninteger––
idstringyes–
newNamestringyes–
NameTypeReqDescription
createdAtstringyes–
idstringyes–
namestringyes–
nodeCountnumberyes–
ownerIdstring|nullyes–
projectIdstring|nullyes–
sizeBytesnumberyes–
thumbnailUrlstring|nullyes–
updatedAtstringyes–
versionnumberyes–

No examples provided.

rotate_zone ~117

Rotate a room by quarterTurns 1 or -1 about its centroid, then align its first reference vertex to gridStep (default 0.5 m). Crossings split walls and collinear overlaps merge. Force can reposition obstructing openings only when they fit.

NameTypeReqDescription
forceboolean––
gridStepnumber|string–In metres, or text with a unit ("6 ft"). Must be greater than 0 m.
quarterTurnsintegeryes1 or -1.
zoneIdstringyes–
NameTypeReqDescription
achievedobject––
changesnumberyes–
conflictsarray––
hintsarray––
idMapobject––
openingIdstring––
openingIdsarray––
payloadobject––
persistenceobject––
projectstring|null––
separatorIdstring––
separatorIdsarray––
unsavedstring––
zoneIdstring––
zoneIdsarray––

No examples provided.

run_batch ~267

Optionally run several scene tools in one call: in order, each on the scene the calls before it left, applied as one undo step, with a report per call. Supports repeated or known-in-advance work; individual calls remain available. A call cannot use an id another call of the same batch creates; created ids are available in the report for subsequent calls. onRefusal stop (default): a refused call stops the batch and nothing is applied; skip: the others are applied and each refusal is reported; add_object calls are independent of each other under both: one that fails is reported with its own error and the others are applied, each with the receipt a single add_object gives. Tools: paint, search_materials, list_levels, get_node, get_level_summary, get_walls, get_zones, duplicate_level, verify_scene, delete_node, measure_stair, fit_stair, find_by_type, create_roof, add_wall, add_fence, add_level, create_stair, add_corner_window, merge_windows, add_column, add_object, place_design, place_in_room.

NameTypeReqDescription
callsarrayyes–
onRefusalstring–stop (default): nothing is applied if a call is refused. skip: apply the rest.

No output schema declared.

No examples provided.

save_scene ~341

Save the current scene (or a provided graph) to the SceneStore. Without id or projectId it saves to the project this session is bound to (create_project or load_scene). Defaults to a browser-visible draft save so agents can iterate without creating many project versions. Use saveMode: "checkpoint" for meaningful version history.

NameTypeReqDescription
expectedVersioninteger––
graphobject–Full SceneGraph { nodes, rootNodeIds, collections? } to save instead of the bridge state. Judged against the scene it is saved over (the session's scene when the save goes to it, else the stored scen…
idstring––
includeCurrentSceneboolean–If true, save the bridge current scene. If false, use the graph arg.
namestringyes–
projectIdstring––
publishboolean–Hosted Pascal: also publish this checkpoint, making it the version the project's viewers see. Only when the user asks to publish.
replaceboolean–Write this session's scene over a project or scene it was not loaded from, replacing what that one holds.
saveModestring–`draft` updates the browser-visible working model without polluting version history. `checkpoint` creates a meaningful saved version; it does not publish.
thumbnailstring––
NameTypeReqDescription
createdAtstringyes–
defaultLevelIdstring|nullyes–
editorUrlstringyes–
graphHashstring––
idstringyes–
isDraftbooleanyes–
levelIdsarrayyes–
namestringyes–
nodeCountnumberyes–
notesarray––
ownerIdstring|nullyes–
projectIdstring|nullyes–
publishedbooleanyes–
saveModestringyes–
sizeBytesnumberyes–
thumbnailUrlstring|nullyes–
updatedAtstringyes–
urlstringyes–
versionnumberyes–

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.