MCP server to read, view and edit IFC models with IfcOpenShell and Bonsai (Blender)
Strong tool naming (verb_noun pattern, clear actions) and comprehensive descriptions (avg 180 chars, well above 10-char minimum). All 16 tools have explicit input schemas with typed parameters and descriptions. Error handling returns full tracebacks for debugging. However, output schemas are not formally documented in code, parameter constraints lack enums where appropriate (e.g., bl_set_view direction), and no tool annotations (readOnlyHint/destructiveHint) despite clear risk classifications. Pagination implemented well (limit/offset). Missing: per-parameter validation guidance, recovery hints in descriptions, and structured error categorization.
Select the element with this GlobalId, zoom the viewport to it, and return the image together with what was focused. Zooming to an element does not make it visible: anything inside the building — a wall under a roof, a beam inside a slab — ends up behind other geometry and the image shows the obstruction instead. Pass isolate=true to hide everything else, then bl_isolate(restore=true) to bring it all back.
Hide everything except the given GlobalIds and return the image. Pass restore=true to unhide everything again. Hiding is viewport-only; no IFC data is touched.
Rebuild the viewport geometry from the IFC data currently in memory. Not a reload from disk — that would discard unsaved edits. Pass guids to reload only those elements, or omit it for every IFC-backed object.
Render the current 3D viewport and return the image. This is an OpenGL viewport render, not a screen grab, so no panels or other windows appear in it. PNG. `width` bounds the image's longest side (clamped to 320..2048); the viewport's aspect ratio is preserved.
Point the viewport camera along one axis and return the image. direction: front, back, left, right, top, bottom, axo.
Output schemas not formally documented. Tool descriptions state what is returned (e.g., 'returns schema, exporting application, creation dates...') but no structured schema definition visible in code. LLMs cannot plan downstream calls without knowing response field types and names.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite explicit risk classifications in metadata. Tools marked WRITE (ifc_open, bl_focus_element, bl_isolate, bl_set_view, bl_reload) should declare destructiveHint=true to guide agent planning and prevent accidental misuse.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | <=2025-11-25 | v2 |
Whether Blender is reachable, which Bonsai and ifcopenshell it runs, and which IFC file it currently has open. Compares the ifcopenshell build behind Blender with the one this server uses and warns when they differ — Bonsai vendors its own copy, and a version gap produces errors that look like data problems. Calling this also syncs the session: once Blender has a project loaded it becomes the authority, every ifc_* read tool starts reading through it, and ifc_open refuses to open a different file.
Geometry of one element: representation type, items, profile parameters, the absolute 4x4 placement matrix, bounding box, volume and surface area. The placement is absolute — the whole nested IfcLocalPlacement chain has been multiplied through. Elements whose geometry comes from a shared IfcRepresentationMap are flagged, together with how many products share it.
Full detail for one element: attributes, property sets, quantities, material, type and spatial container. Identify it by GlobalId or STEP id.
List instances of an IFC class (subclasses included), paginated. Always reports the real total alongside the page actually returned.
Every property set and property name that actually exists in this file, with occurrence counts. Call this before writing any property query. Exporters routinely ignore the standard names — ArchiCAD writes ``BaseQuantities`` where the standard says ``Qto_WallBaseQuantities`` — and a query against a name that is not there returns an empty set with no error at all.
Model summary plus a per-class entity histogram and the list of storeys.
Open an IFC file and make it the active model. Returns the schema, exporting application, creation dates, units, total entity and element counts, and the ifcopenshell version in use. Refused when Blender already holds a model through Bonsai: opening it here would create a second, independent copy of the same file.
Whole-file geometry breakdown by RepresentationIdentifier/RepresentationType, by item class, and by parametric vs tessellated share. Also lists the representation maps shared by the most products.
Select elements with an ifcopenshell selector query. Examples: ``IfcWall``, ``IfcWall, IfcSlab``, ``IfcBeam, Name=/B-.*/``, ``IfcSpace, Pset_SpaceCommon.IsExternal=TRUE``.
Spatial hierarchy IfcProject -> Site -> Building -> Storey, with the number of elements contained in each node.
Run ifcopenshell.validate and return a condensed report: counts by level, the most frequent messages, and a page of individual issues.
bl_set_view direction parameter lacks enum constraint. Description lists valid values ('front, back, left, right, top, bottom, axo') as prose, not as a formal enum. LLMs may hallucinate invalid directions; enum forces valid selection.
Error handling returns full tracebacks but lacks recovery guidance. tool_handler wrapper returns error details (traceback, message, type) but descriptions do not suggest next steps (e.g., 'If file not found, check path with ifc_list_entities'). Agents cannot self-correct without hints.
Mutually exclusive parameters (guid vs step_id in ifc_get_element, ifc_geometry_info) not explicitly documented as such. Descriptions should state 'Provide either guid or step_id, not both' to prevent ambiguous calls.