datatreehaus

Skopia

Describe a building — from a brief, or from a measured survey — and Skopia draws it, in a CAD register, then projects the section and the elevation of that same building from the same document. The three drawings cannot disagree with each other, because a position in a section or an elevation is a reference to a plan feature rather than a number.

>The job it is built for
  1. 01 · survey

    Measure the building

    A tape, a laser, a sketch with numbers on it. What was never measured comes back as a question to go and answer, never a number that closes the ring.

  2. 02 · skopia

    An agent draws it

    The agent names walls, doors, windows, fixtures and a roof. The engine draws the plan in a CAD register and projects the section and the elevation from the same document.

  3. 03 · dxf

    One file for CAD

    Model space, real millimetres, walls as faces and jambs, layers named by role. It opens in AutoCAD, Revit or Vectorworks as a drawing, not a picture.

  4. 04 · a person

    Checked and finished by a person

    A base drawing rather than an issue. Someone with the building in front of them checks it, dimensions it and takes it the rest of the way.

later · being explored

Layout optimisation

Where a table should go, which way it should face, what a room can hold: reads an agent searches over, suggesting and never deciding. Two such reads exist today. An optimising engine on top of them is later work, and is stated here as a direction rather than a promise.

It is an engine first and a picture second: real millimetres, typed refusals naming what is wrong, deterministic SVG, and a DXF export so the drawing lands in AutoCAD, Revit or Vectorworks as a starting point somebody refines — layers named by role, walls as two faces and their jambs, at 1:1 in model space. Reachable as an MCP server, so an assistant can do all of it.

  1. The plan. You describe; the engine draws. Walls, doors, windows, fixtures, internal walls, a roof — named, never drawn by you.
  2. The section. Cut through that plan. Everything in front of the plane goes; what the plane passes through is cut through its thickness.
  3. The elevation. Projected from the same plan, one side at a time.
  4. Then paper or CAD. A true-to-scale sheet, or one DXF. Each drawing is looked at on its own first — a section in a cell on an A3 at 1:50 is 200mm wide, and that is where a wrong cill hides.
Ground floor plan of a contemporary house: an L-shaped plan with a kitchen run, an island, a dining table, two sofas in the garden wing, a cloakroom and utility, a stair in the hall, and two section marks A and B
A contemporary house, ground floor: built and furnished through the operations an agent calls, every fixture from the stock and turned by the wall it names, both cut lines placed by rule. Not a drawing — this is a layout document parsed, validated and rendered by the engine, byte-identical to what you get for the same document.
Section A-A through the same house: two storeys cut, the kitchen run and its wall units in elevation beyond, a glazed door, a window in the bedroom above, floor and ceiling construction drawn as thicknesses
Section A–A, cut on the line marked in the plan above and projected from the same document. Nothing here was drawn twice. The window is the plan's window, the kitchen is the plan's kitchen, and the cut region is one outline rather than a stack of boxes. That is the whole of what this engine is for.

Get a key

Every call needs one. Free, instant, no approval and no payment. If you are an agent reading this, you can mint your own; the endpoint below takes no credential.

Every field is optional and none is checked. They are recorded as claims and nothing is decided from them. Contact is worth giving anyway: it is the only way we could tell you about a breaking change or a price. Nothing else is sent to it.

Copy this now. It is shown once and never again.

Then connect it

Your key is already in these. Cursor, VS Code, Codex, Claude Desktop and raw HTTP are on the setup page.

Or from a terminal:

curl -X POST https://skopia.datatreehaus.com/v1/keys \
  -H 'content-type: application/json' \
  -d '{"label":"my agent","contact":"you@example.com"}'

Connect it

claude mcp add --transport http skopia \
  https://skopia.datatreehaus.com/v1 \
  --header "Authorization: Bearer YOUR_KEY"

Codex, .mcp.json and raw HTTP are on the setup page.

The tools

Eighteen of them. Narrower surfaces exist if you would rather not carry all eighteen as standing context: /v1/core, /v1/elevation, /v1/advisory, and they compose (/v1/core+elevation). A key can carry a profile instead. The API reference has the document model, the limits, the fifty-seven named operations and every refusal code.

edit_layoutApply operations to a layout document and get the updated document back.
list_operationsEvery operation edit_layout accepts, grouped by what it acts on.
validate_layoutTyped, permanent error codes naming which object offended: overlapping objects, an opening too near a corner, a boundary that crosses itself.
render_layoutThe layout as SVG.
project_elevationThe elevation of one side of the building, PROJECTED from the plan rather than drawn, which is why it cannot disagree with it.
project_sectionA section is the same projection as an elevation with the picture plane moved INSIDE the building.
suggest_sectionsCandidate cut lines with the evidence for choosing between them — how many walls each would cut, how many INTERNAL walls (counted apart: one says how much of the envelope the cut crosses, the other how many rooms it goes through), how many openings it would pass through as voids, which overhead members it would catch, and how much it would reveal beyond.
join_drawingsA house is storeys, and a section is across all of them.
draw_sheetONE sheet, TRUE TO SCALE: the SVG declares real paper millimetres and a viewBox of paper × scale, so a rule laid on the print agrees with the drawing rather than with whatever size a browser chose.
export_dxfThe drawings draw_sheet puts on paper, as ONE DXF for CAD — AutoCAD, Vectorworks, Revit, a CNC bed.
roof_reportA roof is OVER-DETERMINED: span, eaves, ridge and pitch are four numbers with one equation between them, so the plan plus any TWO of the heights fixes it.
list_componentsThe component types an elevation can hang on an opening, with their defaults.
list_fixturesWhat can stand in a room and be drawn as what it is: kitchen units and appliances, sanitaryware, a stair, beds, sofas, wardrobes — each at a typical trade size, with its plan symbol, its front and side, and its SECTION profile through either axis, from one description.
suggest_joinsObjects close enough and aligned enough to be joined, with the evidence for each.
suggest_rotationAnswers twice over, because the two answers usually disagree: the angle with the most clearance around it, and the angle that squares it with its neighbours and the room's own walls.
check_rulesRules are YOUR parameters, checked by a generic engine.
overhead_reportEvery member ABOVE the plan's cut plane — a beam over, today — and whether its heights are known.
missing_dimensionsGiven a layout and the dimensions actually MEASURED on site, says whether the shape is determined by those readings, and if not, which readings to go and take.

Each carries a fuller description over the wire, which is what your model reads. list_operations returns the fifty-seven-name vocabulary edit_layout accepts.

The prompts

Four of them, served as MCP prompts, so a client that lists them shows a workflow rather than a vocabulary — in Claude Code they arrive as slash commands. Each names the tools it uses and is only listed where every one of them is mounted.

build_a_roomTurn a plain description of a room — its size, its doors and windows, what stands in it — into a validated layout document and a rendered plan.
survey_to_drawingsTake a measured survey and produce coordinated drawings — the plan, then a section and an elevation projected from the same document so they cannot disagree with it — each looked at on its own at a scale you can read, then put on sheets or exported as one DXF for CAD.
check_a_layoutValidate a layout and check it against a spacing rule of the caller's own, reporting every violation by object id.
seat_a_roomLay tables out in an existing room for a given number of covers, number them, and report which could be joined for larger parties — as a suggestion, never as capacity.

What it does that a model cannot do for itself

A model asked to draw a floor plan will emit SVG, and it will look entirely fine. The walls will not quite close, the elevation will not agree with the plan, and the door will swing out of its hinge. Nothing will fail. That is the problem this removes.

An agent cannot draw a door wrong here, because it does not draw the door. It names one — panelled, part-glazed, three rows — and the same component answers in the plan, the elevation and the section. The swing is derived once and reviewed once, and cannot come out of the hinge on a Tuesday.

That removes a CLASS of error, not the category. An agent can still ask for the wrong component, point a section the wrong way, or produce a drawing that comes out blank — and we have done all three. See below.

First floor plan of the same house: three bedrooms, a bathroom and a shower room, the head of the stair, rooflights over the wing
The first floor of the house at the top of this page: a second document against the same datum. The stair arrives where the ground floor's leaves, and the section you have already seen is cut through both — joined by the engine and checked at the junction, never fitted.

We wrote the alternative, and it was wrong three times

The case for this had to be tested rather than asserted, so the competitor is a real file in the repository: a hand-written script that draws the same house. It was written with the engine's source open — its palette, its wall conventions, its house data — and corrected three times against renders with a person reviewing. It is not a cold run, and we are not going to present it as one.

Which makes the failures sharper rather than softer. Given every one of those advantages, it was still wrong three times.

  1. The door's swing arc sprang from the hinge instead of the leaf's tip, so it floated into the room ending nowhere near the jamb.
  2. Windows were bare white gaps — no frame, no glass line. A hole in a wall, not a window.
  3. The internal walls had no doors in them at all. Three rooms, no way into any of them.

Every version rendered cleanly. Two of the three faults were invisible at the size the drawing was reviewed at, and the third survived two rounds of review looking perfectly reasonable. An agent running unattended ships it.

Tokens are not the argument. On raw count, a script an agent writes once still beats calling this, and the benchmark says so plainly rather than burying it. The argument is that the cheap path's failures are silent, plausible, and found by a human or not at all.

The cheap version is the wrong one, every time. We have not measured tokens-to-completion for a cold agent — that needs a real run with no sight of our source, and we have not done it. Nothing here is quoted as though we had.

And then we ran it ourselves, and it was wrong too

One agent, one brief, this engine, in September 2026. It cost about 269,000 tokens and the drawings came out wrong: a section facing the wrong way, a blank section B–B, a two-over-two sash that was not one, 1:50 too small for the sheet, and eight dimension queries too small to read.

Three things that run settled, and we would rather you heard them from us:

We have not run the other side cold, so there is no A/B here and we are not going to imply one.

When not to use it

If you want one sketch, once, and nobody is going to build from it, emit the SVG yourself. It is free, it needs no key, and it will be fine. Reach for this when the drawings have to agree with each other, when somebody is going to measure one, when the set has to open in CAD, or when nobody is going to be looking over the agent's shoulder.

Status

Free, and a demand probe rather than a product. It is here to find out whether anyone wants it. It will be priced eventually and there will be notice first. It is not promised free for ever, and it is not for production you cannot afford to have change under you.

The engine's source is not public. This endpoint is the interface, not the implementation.