Connect to Pascal and use its MCP tools to create, inspect, edit, validate, save, or hand off editable 3D building scenes...
Use Pascal as the scene authority. Prefer its semantic tools and validation results over hand-written scene JSON or visual guesses.
pascal://agent-guide and inspect the available tools and their input schemas before changing anything. Installed and hosted releases can differ from this skill's source-review snapshot. When both the pascal and pascal-hosted servers are connected, use pascal-hosted for projects that live in the person's Pascal account, including Capture scans, and pascal for local work; never call both for the same task.If the task is a furniture or clearance assessment and the furniture-fit skill is installed, use that focused workflow after connection. Do not assume another skill is present.
editorUrl from create_project, save_scene, or get_project_status.list_scenes when available, select by exact ID or unambiguous name, then call load_scene.list_captures, then get_capture, then open_capture_as_project for a processed scan you have edit access to on the scan's own project; these tools do not exist on the local CLI, so never call them there.create_project before modeling.get_project_status and get_scene before editing.Record the active project ID, scene ID or version, and graph hash when returned. Re-read after a version conflict rather than overwriting newer work.
For construction, prefer tools such as create_story_shell, create_room, add_door, add_window, create_roof, furnish_room, and place_items. Use apply_patch only when no semantic tool expresses the requested edit and you have inspected the relevant node schema or an existing node of the same type.
To give a surface a finish, call paint as the editor's Paint does: the targets, a role when it is not the default surface (a wall's exterior or interior face, a slot, a roof's top, edge or wall), and one finish: a library material whose library:<id> you found with search_materials, a color (painted with the nearest library colour), or a native material for an exact finish, kept as a scene material and reused when an equal one exists. An unknown target, role or material refuses the whole call and nothing is painted.
A roof lives on the level directly above the storey whose walls carry it; over the top storey that is the building's roof level, which create_roof makes (named Roof) or reuses, so exploded and solo level views lift the roof off the plan. Call create_roof once the storeys and their exterior walls stand; it refuses a second roof over a storey (roof_exists) and a storey with another above it (storey_above). add_level puts a new storey under the roof level. Never write a roof onto a storey's own level with apply_patch: verify_scene reports it (roof_mixed_in_storey), and a roof level below a storey (roof_level_not_on_top).
A window style (double-hung, grid, transomβ¦) shapes a Fixed window's panes. For a casement, sliding, hung, awning, louvered, bay or bow window, pass its windowType without a style: those types draw their own sashes, and a style there is refused (style_needs_fixed_window). picture is an alias of single (one pane): both are accepted and draw the same. Where a photo's glass meets at a corner, with no wall between the panes, build one corner window with add_corner_window (both sides, the glass fused or at a post) instead of two windows near the corner; merge_windows joins two windows that already exist, and the window panel's Corner section wraps and unwraps one by hand.
To add a stair, call create_stair on the floor it rises from: (x, z) is the back-centre of the bottom step and rotation the climb direction. It sizes the flight as the editor's stair tool does (about 18 cm risers, the run from the design targets) unless you give length or steps, creates the level above when there is none, and cuts the floor it arrives through and the ceiling it leaves. It refuses a flight to or from a roof level (roof_level), a toLevelId that is not above (not_above), and a given slab or ceiling that is not on the floor it arrives on or leaves (slab_not_on_level, ceiling_not_on_level).
For stairs, call measure_stair before changing proportions: it reports actual risers, walking-line going, arrival, uniformity, headroom and layout alternatives without editing the scene. Use fit_stair only for an explicit sizing or layout change; it applies uniform risers in one reversible edit. fitRun: true also fits flight runs or arc sweep. A straight, l or u layout replaces the flight chain; turningStrategy: "winder" uses quarter-turn winders with configurable walking-line offset and division. Measure again after fitting.
Stair targets are design preferences in meters (maxRiserHeight, minimumGoing, targetGoing, minimumHeadroom), not a building-code certification. Defaults are 0.18, 0.25, 0.28 and 2 respectively. Headroom checks cover modeled floors, ceilings and stair bodies; missing or unsupported obstacles can still require inspection. Inspect the connected server's contracts before calling these tools.
When those tools and the catalog cannot reproduce something faithfully (custom columns, a porch, lanterns, a garage door, a vaulted or tray ceiling), build it with add_object: a plain three.js module, or with language: 'bpy' a Blender module when the shape needs Blender's modelling (bevels, smooth organic forms, booleans, curves), with the naming conventions its description lists for paint slots, parts, lights, cutouts and clips. Edit it by passing its nodeId. A new object needs a reason (why no Pascal tool or catalog item builds it); verify_scene lists every authored object with its reason. 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) is built with a hint naming add_wall. Servers without a script host answer scripts_unavailable. The hosted server builds three.js scripts in the user's open Pascal editor tab (Blender modules run in its Blender service and need no tab); when no tab has the project open it answers editor_tab_required with an editorUrl: give the user that link, wait until they say it is open, then repeat the same call. editor_tab_busy means a tab is open but busy or still loading: wait a few seconds and repeat the same call; the user need not be asked. Whether you may open the link yourself is the person's setting ("Agents may open the editor for me"; Ask first: ask the user to open the link (or bring the tab forward), or ask their permission before opening it yourself; Allow: you may open the link yourself, in a tab in front; Never: ask the user, and do not open or switch windows yourself); the refusal's words say which, so follow them. It applies to editor_tab_required and editor_tab_hidden; editor_tab_busy carries no link, and an autonomous agent account, which has no editor login, is refused with editor_host_identity_required whatever the setting says. To count or locate things by what they are, including typed parts inside authored objects, use find_by_type. To group elements of any kind into a named set the editor lists (all the lights, the windows, the kitchen cabinetry), use edit_collection, starting from a template when one fits; list_collections reads them back.
Pascal uses meters. X and Z are floor-plan axes; Y is vertical. Tool fields that accept measurements may also accept strings such as "6 ft" or "180cm", but report final spatial values in meters and retain the user's original units when useful.
To compare what you built with a reference, call view_scene: the building from a side, a street-height eye (eyeHeight: 1.7), a photo's own camera, square-on (projection: "orthographic") or from above, and, with a photo region, the photo's crop beside the view; pass the photo as a data:image/...;base64 URL. To see the rooms of one floor, pass interior: { levelId }: the other floors, its roof and its 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. It returns a picture, not measures: take sizes and counts from the tools. On the hosted server the user's open Pascal editor tab renders the picture: editor_tab_required means no tab has the project open (give the user editorUrl, wait until they say it is open, then repeat the call), editor_tab_hidden means the tab is in the background (ask them to bring it to the front, then repeat), and editor_tab_busy means the tab is open but busy or still loading (wait a few seconds and repeat; do not ask the user). A server with no renderer, such as the local CLI, answers view_unavailable.
Never empty a project by deleting everything. A write that would leave it empty (deleting its only room, a patch removing every node) is refused with scene_wipe_blocked and nothing changes, in the project or the session. When the person asks to start over, call clear_scene with their words in reason: it resets to a site, a building and one level, and keeps the project's installed plugins. To replace the only room, build what replaces it first, then remove it.
Preserve unrelated nodes. Before a bounded edit, identify the target IDs with find_nodes, get_node, get_level_summary, get_walls, or get_zones. After the edit, identify the actual changed IDs from tool output or a before/after read.
After a meaningful edit:
validate_scene for schema validity.verify_scene for practical scene issues.save_scene with saveMode: "draft" for working progress. Use saveMode: "checkpoint" only for a meaningful milestone or when the user requests a durable version.get_project_status after the save and use its returned editorUrl, version, node count, and graph hash as the handoff evidence.An HTTP success, a tool response with isError: false, or a non-empty scene ID does not by itself prove the requested result. For example, export_glb currently returns a structured not_implemented status in the open-source headless MCP server. Report that as unsupported; do not claim a file exists.
Give the user a compact result with:
editorUrl returned by Pascal;For tool selection and failure recovery, read references/tool-workflows.md. The examples are synthetic and contain no production credentials or private project data.