Pascal 3D Editor
NPM · @PASCAL-APP/MCP · 2 COMPONENTS
Create, inspect, validate, and save editable 3D building scenes with Pascal's MCP server.
Available components
Last scanned (13 hours ago)
Scores higher than 67% of npm servers
Category Design and Media
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.
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.
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 →
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 →
search_assets Search assets ~173
Search the item library (furniture, fixtures, lights, plants, outdoor) by keyword, with one or several queries in a call. The catalog is a limited set that varies by server: what a search returns is what exists. Results provide valid asset ids and placement facts when these are not already known. A query matches the items whose name, id, category or tags hold every one of its words. Returns one group per query, each item with its id, name, category, dimensions [width, height, depth] in metres and attachTo (null on the floor, else 'wall', 'wall-side' or 'ceiling'). Related lookups (sofa, coffee table, tv stand) can share a call.
| Name | Type | Req | Description |
|---|---|---|---|
| queries | array | yes | One or more searches to run in a single call. |
No output schema declared.
No examples provided.
search_materials Search materials ~315
Search or browse the material library (the finishes paint gives), several queries in one call: find a library material's ref here rather than guessing it. The library is Pascal's materials and, in the editor, the ones it holds besides (the community's, yours, your workspace's). A query's words match the words of a material's id, name and kind, or a piece of its id (plank48, cco), building words as the library writes them (timber is wood, weatherboard is siding, render is stucco), colour words by its shade (dark, light, white, grey) and surface words (roof, wall, floor, ceiling) by what it suits; a word of one or two letters, or one as common as 'the', searches nothing. Without a query, a browse lists by name every material of its kind, or that suits its surface (flat colours suit every one), or the whole library. Returns one group per query: each material's ref (library:<id>), name, kind, the surfaces it suits and its colour, best first (a browse by name), 12 at a time for a search and 150 for a browse; the words no material answers (missing), so a finish the library lacks is said, not guessed; and on a long list how many more there are (more) and the offset that lists them (next).
| Name | Type | Req | Description |
|---|---|---|---|
| queries | array | yes | One or more searches or browses to run in one call. |
No output schema declared.
No examples provided.
set_checkpoint Set a checkpoint ~171
A named moment in your work (a roof, a floor, a batch of walls) that verify_scene({ since: name }) can compare against: it lists what was created, changed and deleted since, grouped by level and kind with a view each, and what you made that is gone. "start", the beginning of your work, is always one; a name used again replaces the first; a session keeps at most 8. A checkpoint is kept with your session, not in the project: it changes nothing in the scene, enters no undo, and does not restore anything. Refused: too_many_checkpoints (naming them), scene_too_large, name_required.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | A short name for this moment, e.g. "walls done" or "before roof". |
No output schema declared.
No examples provided.
set_floor_foundation Set floor and foundation ~243
Supply slabId or slabIds; grouped plates receive the same floor-top displacement, while edge slots apply only to the first plate. A ground-contact floor has two inputs: thickness (slab, min 0.01 m, grows upward from the foundation) and foundationHeight (0 = on the ground, no foundation; > 0 = raised on a solid foundation; foundation.type "solid" alone raises it 0.3 m, "none" puts it on the ground). The floor top is derived and never floats: grade + foundationHeight + thickness; everything the floor carries (walls, openings, items, rooms, storeys above) moves with the top. Legacy floorHeight (a target top) maps to foundationHeight = top - grade - thickness, never below 0; null = on the ground. On upper plates the underside stays on the walls below: thickness (or floorHeight as a target top) changes the top; only ground-contact plates accept a foundation. Explicit room floors translate with the floor to preserve steps.
| Name | Type | Req | Description |
|---|---|---|---|
| patch | object | yes | – |
| slabId | string | – | – |
| slabIds | array | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| achieved | object | – | – |
| changes | number | yes | – |
| conflicts | array | – | – |
| hints | array | – | – |
| idMap | object | – | – |
| openingId | string | – | – |
| openingIds | array | – | – |
| payload | object | – | – |
| persistence | object | – | – |
| project | string|null | – | – |
| separatorId | string | – | – |
| separatorIds | array | – | – |
| unsaved | string | – | – |
| zoneId | string | – | – |
| zoneIds | array | – | – |
No examples provided.
set_ground_level Set ground level ~392
Make a level the building's ground floor: the one standing at grade, its floor 8 in over the ground (about 6 in on cast concrete foundations, 12 in on stone: the building's foundation construction seats it; the result names it). A building's levels stack on a ground line; the levels with a lower floor index are below grade (basements), the ones at or over it are not, and list_levels reads it as groundLevels (levelId, floorElevation, floorOverGrade, seated) and each level's gradeStanding (at-grade, partly-below-grade, below-grade) and isGroundLevel. This names the level on the building, seats the building so that level's floor datum, the top of the foundation where the wood framing starts, stands 0.203 m (8 in) over grade on a block foundation, 0.15 m on cast concrete (Europe), 0.3 m on stone (a historic style) (flat site: world Y 0.203; sculpted terrain: 0.203 m over the mean ground height under its floor), moving the building in height only — the plan stays where it is and every level keeps its place relative to the others — and renumbers the floor indices so it is 0 and the ones under it are -1, -2…. A level added below (add_level position below) stacks under the lowest level without moving the ground floor. A roof level or a support level cannot be the ground floor (not_a_storey). One undo step. Refusals: level_not_found, not_a_level, no_building, not_a_storey. Answering unchanged: true when the level is already the named ground floor, at that seat, at index 0.
| Name | Type | Req | Description |
|---|---|---|---|
| levelId | string | yes | The level to stand at grade, by an id list_levels returned. |
| Name | Type | Req | Description |
|---|---|---|---|
| achieved | object | – | – |
| buildingId | string | yes | – |
| floorElevation | number | yes | – |
| gradeElevation | number | – | – |
| levelId | string | yes | – |
| message | string | yes | – |
| movedBuildingBy | number | – | – |
| ok | boolean | yes | – |
| persistence | object | – | – |
| project | string|null | – | – |
| renumbered | boolean | – | – |
| unchanged | boolean | – | – |
| unsaved | string | – | – |
No examples provided.
set_room_floor_construction Set room floor construction ~157
Edit the single floor volume associated with a room, with the same patch as set_floor_foundation. On a ground-contact floor: thickness (slab on the foundation, grows upward, min 0.01 m) and foundationHeight (0 = on the ground; > 0 = raised on a solid foundation); the top is derived as grade + foundationHeight + thickness and carries everything on the floor. A drawn slab takes thickness, finishes and a numeric floorHeight (its top) only. Supply slabId when the room spans multiple construction domains; an absorbed legacy slab is edited through its derived base plate.
| Name | Type | Req | Description |
|---|---|---|---|
| patch | object | yes | – |
| slabId | string | – | – |
| zoneId | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| achieved | object | – | – |
| changes | number | yes | – |
| conflicts | array | – | – |
| hints | array | – | – |
| idMap | object | – | – |
| openingId | string | – | – |
| openingIds | array | – | – |
| payload | object | – | – |
| persistence | object | – | – |
| project | string|null | – | – |
| separatorId | string | – | – |
| separatorIds | array | – | – |
| unsaved | string | – | – |
| zoneId | string | – | – |
| zoneIds | array | – | – |
No examples provided.
set_unit_members Set unit members ~46
Replace the zones referenced by a unit. Every zone must belong to a level in the same building.
| Name | Type | Req | Description |
|---|---|---|---|
| memberZoneIds | array | yes | – |
| unitId | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| memberCount | number | yes | – |
| persistence | object | – | – |
| project | string|null | – | – |
| unitId | string | yes | – |
| unsaved | string | – | – |
No examples provided.
set_zone Set zone ~119
Create a polygonal zone on the given level. label is stored as the zone name and properties are merged into metadata. A polygon along walls that already enclose a room is that room, never a second zone: a room still named "Room N", or already named label, takes the label and properties; a room a person named otherwise is refused (rename it with update_node only when the person asked).
| Name | Type | Req | Description |
|---|---|---|---|
| label | string | yes | – |
| levelId | string | yes | – |
| polygon | array | yes | – |
| properties | object | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| persistence | object | – | – |
| project | string|null | – | – |
| unsaved | string | – | – |
| zoneId | string | yes | – |
No examples provided.
set_zone_intent Set room intent ~355
Update room name, floor finish/elevation/regions, floor.footprint ("new" mints a unique floor key tied to this creator room, an existing key joins that floor on this level, null returns to the shared floor). Touching rooms with the same key share a base plate; disconnected pieces share construction settings. Conversion preserves world geometry in one edit and refuses when infeasible. get_zones exposes floor_choices. A keyed floor uses "<creator room name> floor" while the creator remains on that key; otherwise it uses the largest named room. Existing keys such as "own" without a creator use that fallback. A user-given plate name wins; the shared floor stays "Shared floor". Keyed rooms can have raised or sunken floor.elevation, stored as a level-local walking top. Slab thickness, foundation height and edge finish use set_room_floor_construction, updating every piece of the key. Update ceiling paint regions (ceiling.regions: [x, z] polygons with a finish, later wins), step finishes (floorStepFinish for every step of the room; floorStepOverrides: [{ key, step?, finish }] per doorway, key = the door id the step sits under or the lower room id), wall material and construction opt-outs. daylight { artificialLight, mechanicalVentilation } declares a habitable room lit and aired by artificial means (the IRC R303.1 exceptions to daylight; both true), stored in the room's metadata; a bedroom, living room or kitchen needs a window to outside or this declaration, above and below grade alike. Absent fields are unchanged; null clears.
| Name | Type | Req | Description |
|---|---|---|---|
| patch | object | yes | – |
| zoneId | string | yes | – |
| Name | Type | Req | Description |
|---|---|---|---|
| achieved | object | – | – |
| changes | number | yes | – |
| conflicts | array | – | – |
| hints | array | – | – |
| idMap | object | – | – |
| openingId | string | – | – |
| openingIds | array | – | – |
| payload | object | – | – |
| persistence | object | – | – |
| project | string|null | – | – |
| separatorId | string | – | – |
| separatorIds | array | – | – |
| unsaved | string | – | – |
| zoneId | string | – | – |
| zoneIds | array | – | – |
No examples provided.
undo Undo ~37
Undo the most recent N steps in the scene history (default 1). Returns the number of steps actually undone.
| Name | Type | Req | Description |
|---|---|---|---|
| steps | integer | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| persistence | object | – | – |
| project | string|null | – | – |
| undone | number | yes | – |
| unsaved | string | – | – |
No examples provided.
validate_design Validate design ~203
Check a design (procedural item recipe) without changing the scene. Returns `valid`, coded `diagnostics` with paths (errors block placement, warnings flag floating or unbalanced parts), the parameter `sweep`, and `measurements` at the given parameters: bounds, per-part bounds and instances, true triangle counts, draw groups per slot, datum contact and connected components. It is the authority: some rules are not expressible in pascal://schema/design. Repair and re-validate until `valid` is true. Version 2 designs validate fully but carry a design_version_not_enabled warning: placement accepts version 1 only until the next release.
| Name | Type | Req | Description |
|---|---|---|---|
| design | – | yes | The 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. |
| parameters | object | – | Parameter values to measure at, by parameter id. Defaults otherwise. |
| Name | Type | Req | Description |
|---|---|---|---|
| design | – | yes | – |
| diagnostics | array | yes | – |
| measurements | – | yes | – |
| sweep | – | yes | – |
| valid | boolean | yes | – |
No examples provided.
verify_scene Verify scene ~425
Optional whole-scene evidence: per-level content, roles (storey, roof-only, support) and the spaces its walls enclose, then every problem found, each with a type: empty levels, walls with no room or door, a space the walls enclose with no room over it (space_no_room) or with several and no wall between them (space_many_rooms), a room the walls do not close (room_not_enclosed) or with no name (room_unnamed), rooms with no floor or ceiling, storeys with no stair, roof levels misused, walls intersecting a covering slab or ending coplanar with its walking surface (wall_covering_slab_contact, with wallId and slabId), openings off their wall, stairs off their slab or blocked, furniture blocking a door or overlapping, a house past its lot line or in its required yards, every node field its schema rejects (schema_invalid, with its nodeId and path; valid is then false, and the level holding the node lists it as unread and is measured once it is fixed), a node kind no schema here knows, once per kind (schema_unknown_kind, info: a plugin kind), a hidden site (site_hidden). Static authored ceiling objects report transformed bounds extending above their ceiling attachment and bounds overlapping solid covering slab bands, with node IDs and measured metres; stored and derived slab holes are subtracted. Wall-mounted objects report a front oriented toward their host; static authored wall bounds report wall-body overlap and extension through the opposite face. With settled editor meshes, catalog wall bounds and large competing coplanar faces against the host or another item on the same wall are also measured within 1 mm. Hidden back-to-wall contact is not competing face evidence. These are observations, not instructions to change the scene or proof of exact mesh intersection. Bounds are measured in the owning building frame, including stacked level elevations. Unknown catalog raw bounds without meshes, animated models, unsupported attachment frames, unresolved scripted wall cuts, ro…
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| activeLevelId | string|null | yes | – |
| activeSceneId | string|null | yes | – |
| authoredObjects | array | – | – |
| checkpoints | array | – | – |
| emptyLevelIds | array | yes | – |
| hasIssues | boolean | yes | – |
| issues | array | yes | – |
| levelCount | number | yes | – |
| levels | array | yes | – |
| occupiedStoryCount | number | yes | – |
| ok | boolean | yes | – |
| roofLevelIds | array | yes | – |
| since | object | – | – |
| supportLevelCount | number | yes | – |
| valid | boolean | yes | – |
No examples provided.
view_assets View catalog items ~56
Pictures of catalog items by id, each with its size and the names of its paintable surfaces (paint takes one as role).
| Name | Type | Req | Description |
|---|---|---|---|
| ids | array | yes | One to six catalog item ids, as search_assets or furnish_room returned them. |
No output schema declared.
No examples provided.
view_scene Look at the scene ~1,373
Look at the building in 3D from a viewpoint you pick and get the picture back: the finished house, every storey and the roof by default, or an explicit Solo/Exploded level presentation, whatever view mode the person has on. Use it to compare what you built with a reference and say what differs before you fix it: the facade from the photo's own camera (camera: its position, aim, field of view and aspect), rendered at the photo's aspect to lay beside it; or from the photo's side at street height (from 'street', 'street-left', …, eyeHeight 1.7), in its light (lighting); one face square on (projection orthographic); the massing from above, or an aerial view (elevation 40). The view frames the target (a building, a level, a wall or a zone; the whole building, its roof included, by default) from outside, unless you place the eye yourself with position or camera. To stand inside a room and see its furniture and finishes at a person's height, give interior {zoneId} (a room: an id from get_zones or create_room): the eye stands in the room a step in from a corner, looking across it, with the cut below; from picks the side of the room it stands on, target something in the room to look at it. To see inside a floor, give interior {levelId}: the other floors and that floor's roofs and ceilings are left out of the picture, and everything on it, walls, openings and furniture alike, is cut at 0.65 of the storey's height (about two thirds), so a tall wardrobe or a door head is cut, not short; a roof level has no inside; with no eye given it looks down into the floor, or into the room or zone you target. A level below grade, targeted alone, is looked into the same way (from outside the ground would cover it), the ground over it drawn as a faint veil. The live view is not changed. A door, a window or an item on a floor frames at detail scale, an opening seen from its outside face: a close-up to lay beside the photo's crop of the same element, to see what differs. Over the MCP the user…
| Name | Type | Req | Description |
|---|---|---|---|
| camera | – | – | A photo's camera (position, target, fov, aspect): the render takes its eye, aim and field of view at the photo's aspect. Or 'current': the person's own view, as their editor shows it now (the MCP has… |
| elevation | number|string | – | Degrees above the horizon the eye looks down from: 35 to 60 for an aerial view. Default 12. In degrees, or text with a unit ("1.57rad"). Range -10–89 deg. |
| eyeHeight | number|string | – | Metres above the ground for a street view (1.7), instead of elevation. In metres, or text with a unit ("6 ft"). Minimum 0 m. |
| fov | number|string | – | Vertical field of view in degrees for a perspective view. Default 45. In degrees, or text with a unit ("1.57rad"). Range 10–100 deg. |
| from | string | – | The side the eye stands on: a compass side (north is the plan's top edge, z grows south, x east), above, or a side as a front photo names it, standing in the street facing the house ('street-left' is… |
| interior | object | – | Look inside, with one of: levelId (a floor): the other floors and its roofs and ceilings are left out of the picture, everything on it (walls, openings, furniture) cut at 0.65 of the storey height. D… |
| lighting | string | – | The light the picture is rendered in: the scene's own (current, the default), or day, overcast, sunset, dusk (twilight, the lights on) or night, as a reference photo was taken in. |
| maxPx | integer | – | The picture's longest side in pixels, for a smaller one. Default 1920 by 1200, and never longer than 1920. |
| photo | object | – | The photo's crop of the element the view frames, returned beside it in the same call: a door's glass, a lamp's shape, a window's panes, at detail scale, to say what differs. |
| position | array | – | The eye exactly, [x, height, z] in metres; it looks at the target. |
| presentation | – | – | Verify the actual level presentation: stacked (default), exploded, or solo with a levelId. Solo keeps full-height geometry, including ceilings and any roofs incorrectly owned by that floor; it is not… |
| projection | string | – | orthographic for a square-on elevation of a face, no perspective. |
| target | string | – | A building, level, wall, zone, door, window or floor item id to frame. Default: every storey in the scene, walls and roofs. |
No output schema declared.
No examples provided.
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
claude mcp add app-pascal-editor -- npx -y @pascal-app/mcp
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.