Why a confident answer about your IFC is the wrong one, and what it takes to fix.
Ask a chatbot how far a wall sits from the building grid. Paste in the IFC and it answers to two decimal places. It is wrong, because the wall's position is not stored in the wall.
It is nested. The wall is placed relative to its storey, the storey to the building, the building to the site. Each level adds a transform, and the coordinate you asked for is the product of all of them, in order. Miss one and the answer is off by a few metres and still looks correct. This is why you can't put an agent's geometry answers into a product: they're right most of the time, wrong unpredictably, and you can't tell which from the output.
STEP nests placements the same way. DWG carries a user coordinate system set to whatever the drafter left. Every team feeding this geometry to an agent writes the arithmetic themselves, and most get it wrong on the file that turns up once in twenty.
ODA MCP Servers are MCP servers for DWG, STEP and IFC, built on the SDKs inside commercial CAD products. They walk the transform stack in compiled code and return world coordinates — the same vectorizer those products ship, with a JSON writer on the end. The answer is right on the twentieth file too, so you can build on it instead of spot-checking it.
You also stop writing two things yourself. Geometry comes back in one shape whatever the format: a vertex list, then a face list of integer indices — the same across formats and across SDK versions, so a prompt you wrote last quarter still parses this quarter. And where boundary representation exists, one call returns the topology: faces, edges, loops, vertices, a few hundred lines of parsing your agent no longer regenerates every session, on your token budget.
Before you build on it, check two things on the build in your hands. The helpers for volume, area and centre of mass are not registered yet, so query tools/list rather than trusting any list, ours included. And the tessellation is fixed: there is no detail setting to turn down or up, so on a shell with a very high face count you get the mesh the server produces — treat face and edge counts on those shells as approximate rather than as a figure to quote.