A native IFC parser with a Python API. It reads a model's data and geometry into pandas tables, triangle meshes, and point clouds — no geometry kernel on the hot path. Built for AI agents, analytics, and pipelines.
Open-source and under active development. It complements ifcopenshell rather than replacing it — different tradeoffs, different jobs.
ifcfast opens a model once and exposes it through ordinary Python objects — DataFrames, numpy arrays, JSON-friendly dicts. The pieces below are what it does today.
A Rust core reads the IFC STEP data section directly into typed tables. ifcopenshell stays an optional dev dependency used for cross-checking — never on the hot path.
Property sets, quantities, materials, and classifications come back as long-format DataFrames. Filter, join, pivot, dump to Excel — ordinary data work, no IFC-specific gymnastics.
Containment and aggregation as edge tables, plus traversal helpers. m.ancestors(guid) walks storey → building → site → project in one call.
Per-product triangle meshes, area-weighted point-cloud sampling with normals, and geometric quantities — handed back as numpy / pandas. Drops straight into trimesh, Open3D, or your own pipeline.
An optional GeoParquet export that pairs each product's geometry with its data, so a model becomes something DuckDB or pandas can query like any other table.
ifcfast-mcp speaks the Model Context Protocol, so Claude, Cursor, or any MCP client can open and question IFC files directly — point at the server, get tools and a guide resource.
A public-license IFC opened once with ifcfast.open(). Click anything in the data panel — the model dims, the graph highlights the path. Three lenses, one model, cross-filtered. A live look at what the parser produces, not a benchmark.
The goal is to make IFC files fast and pleasant to query — for agents, analytics, and anyone who wants to ask questions of a model without standing up a full geometry kernel.
ifcfast is early and not yet verified against established tools. Treat its output as provisional and cross-check it against ifcopenshell or your existing toolchain before you rely on it.
ifcfast-mcp exposes the parse, data, and geometry surface as Model Context Protocol tools. Add one line to your MCP client config and your agent can drive IFCs directly — without you writing any glue code.
ifcfast.system_prompt() into the system prompt for instant ramp-up.pip install 'ifcfast[mcp]'
~/Library/Application Support/Claude/claude_desktop_config.json (macOS) %APPDATA%/Claude/claude_desktop_config.json (Windows)
{ "mcpServers": { "ifcfast": { "command": "ifcfast-mcp" } } }
ifcfast appears as 18 tools + ifcfast://agents-guide resource. Your agent can now open IFCs, walk the spatial graph, run drift, and extract type catalogues — without any glue code.
Data layers are long-format DataFrames; geometry is numpy arrays; summaries are JSON-friendly dicts. No ifcopenshell.open() on the hot path — ifcopenshell is an optional dev dependency, used to cross-check output in tests.
import ifcfast m = ifcfast.open("model.ifc") # Long-format pandas tables, lazy. m.psets # property sets m.quantities # base quantities m.materials # IfcMaterial / layer / constituent / profile m.classifications # NS 3451 / Uniformat / OmniClass
# Spatial-relationship graph m.contained_in # product → storey edges m.aggregates # child → parent edges m.storey_building # storey → building edges # Traversal helpers m.parent(g); m.children(g) m.ancestors(g); m.descendants(g) m.storey_of(g); m.building_of(g) m.products_in(parent_g)
# Geometry — no CAD kernel on the hot path for mesh in m.meshes(): # per-product triangles verts, faces = mesh.vertices, mesh.faces # → trimesh.Trimesh(verts, faces), Open3D, ... # Area-weighted surface sampling (+ normals) pc = m.point_cloud(per_m2=1000) # x,y,z,nx,ny,nz,guid,entity # Geometric quantities m.mesh_qto() # volume, area, orientation