Design and live-built a 3-bed 2-bath single-story house with pool and
privacy-screened perimeter ("Casa del Sol") using only @pascal-app/mcp
tools. Exercises every mutation tool in a realistic scenario.
- DESIGN.md: blueprint (lot 20x15, building 12x8, 7 interior zones,
pool 5x3, 5 privacy fence segments)
- build.ts: MCP client orchestrator
- scene.json: full exported scene (26.7 KB)
- BUILD_REPORT.md: per-step status + final totals
Final scene: 39 nodes pre-duplicate (1 site, 1 building, 1 level,
9 walls, 9 zones, 6 doors, 6 windows, 5 fences, 1 slab), 76 nodes
post-duplicate_level, valid=true, errors=0.
Surfaced the documented StreamableHTTP single-session limitation:
the HTTP server at :3917 rejected the SDK client's initialize with
"Server already initialized" because the previous T3 session consumed
the transport's one-shot session slot. Build fell back to an in-memory
transport exercising the identical tool surface. Fix tracked for v0.2.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5.1 KiB
Casa del Sol — design brief
A single-story 3-bedroom, 2-bathroom house with a swimming pool and a privacy-screened perimeter, built entirely via @pascal-app/mcp HTTP tools against a fresh scene.
Lot
- Site polygon: 20 × 15 m rectangle centred at origin → corners (−10, −7.5) to (10, 7.5).
- Origin axes: +x = east, +z = south (core convention; floor plane is xz).
Building envelope
- Footprint: 12 × 8 m, centred west-of-origin at about (−2, 0).
- Wall thickness: 0.2 m. Wall height: 2.7 m.
- Floor elevation: 0. Single storey.
Interior rooms (zones)
Origin for interior: building SW corner at (−8, −4). All rooms span the 8 m building depth somehow.
| Room | Footprint (x × z) | Polygon corners |
|---|---|---|
| Living / dining | 7 × 4 | (−8, 0) (−1, 0) (−1, 4) (−8, 4) |
| Kitchen | 5 × 4 | (−1, 0) ( 4, 0) ( 4, 4) (−1, 4) |
| Bedroom 2 | 4 × 4 | (−8, −4) (−4, −4) (−4, 0) (−8, 0) |
| Hallway | 3 × 1 | (−4, −2) (−1, −2) (−1, −1) (−4, −1) |
| Bathroom 2 | 3 × 2 | (−4, −4) (−1, −4) (−1, −2) (−4, −2) |
| Bathroom 1 | 3 × 1 | (−4, −1) (−1, −1) (−1, 0) (−4, 0) |
| Master bedroom | 5 × 4 | (−1, −4) ( 4, −4) ( 4, 0) (−1, 0) |
Walls (perimeter + partitions, one wall per edge)
Perimeter (4):
- South outer: (−8, 4) → (4, 4)
- North outer: (−8, −4) → (4, −4)
- West outer: (−8, −4) → (−8, 4)
- East outer: (4, −4) → (4, 4)
Interior (partitions): 5. Living/Kitchen split: (−1, 0) → (−1, 4) 6. North bedrooms split: (−1, −4) → (−1, 0) 7. Bedroom 2 east wall: (−4, −4) → (−4, 0) 8. Hallway north edge: (−4, −1) → (−1, −1) 9. Hallway south edge: (−4, −2) → (−1, −2)
Openings (doors + windows)
All positions are normalised 0..1 along the wall (start → end).
| Kind | Wall | Pos | Width | Height | Purpose |
|---|---|---|---|---|---|
| door | 1 (south outer) | 0.20 | 0.9 | 2.1 | Front entrance |
| door | 1 (south outer) | 0.75 | 2.2 | 2.1 | Sliding glass to pool |
| door | 2 (north outer) | 0.65 | 0.9 | 2.1 | Kitchen back door |
| door | 6 (N-bedrooms split, middle) | 0.30 | 0.8 | 2.1 | Master bedroom door |
| door | 7 (Bedroom 2 east wall) | 0.50 | 0.8 | 2.1 | Bedroom 2 door |
| door | 9 (Hallway south edge) | 0.50 | 0.7 | 2.0 | Bathroom 2 door |
| window | 1 (south outer, living) | 0.30 | 2.0 | 1.4 | Living picture window |
| window | 1 (south outer, living) | 0.45 | 1.4 | 1.4 | Living window 2 |
| window | 3 (west outer) | 0.25 | 1.0 | 1.1 | Kitchen window |
| window | 4 (east outer) | 0.25 | 1.4 | 1.4 | Master window |
| window | 4 (east outer) | 0.75 | 1.4 | 1.4 | Bedroom 2 window |
| window | 2 (north outer, bathroom 2) | 0.30 | 0.8 | 0.6 | Bathroom 2 high |
(Core validates cut_opening arguments; if wall-endpoint geometry makes two openings collide, the tool returns an error and the script logs the conflict.)
Exterior elements
Swimming pool (east of house):
- Zone polygon: (5, −1.5) (10, −1.5) (10, 1.5) (5, 1.5) — 5 × 3 m.
- Metadata:
{ kind: "pool", depthM: 1.8, finish: "tile" }. - Additional slab at elevation −1.8 m to represent the pool basin (same polygon).
Privacy screen fence (lot perimeter):
- Style:
privacy, height 1.8 m. - Four fence segments around the 20 × 15 lot, with a 2 m gap at the south entrance (x ∈ [−1, 1]).
- Segments:
- South-west: (−10, 7.5) → (−1, 7.5)
- South-east: (1, 7.5) → (10, 7.5)
- East: (10, 7.5) → (10, −7.5)
- North: (10, −7.5) → (−10, −7.5)
- West: (−10, −7.5) → (−10, 7.5)
Garden zone (everything that isn't building or pool):
- One big zone labelled "garden" with the remaining polygon.
Success criteria
validate_scenereturnsvalid: true, errors: 0after every step.- Final node count ≥ 30 (1 site + 1 building + 1 level + ~14 walls + 5 fences + ~7 zones + 6 doors + 7 windows + 1 pool slab ≈ 43).
export_jsonproduces a valid parseable JSON.duplicate_levelworks (produces a second storey at the same layout).- Scene exports and imports cleanly: write the export to disk,
unloadScenevia the bridge (if exposed) or setScene from the export, re-validate.
Non-goals
- Catalog items (no furniture — the catalog is unavailable in headless mode).
- Realistic materials / textures (MCP doesn't set
material; editor picks defaults). - Roof geometry — the roof system is render-only; we skip for v0.1.