Skip to main content
Glama

IFC MCP Server

An MCP (Model Context Protocol) server that enables AI agents to understand and query IFC (Industry Foundation Classes) building model files. This server exposes a rich set of tools for loading IFC files, traversing spatial hierarchies, inspecting elements and properties, querying materials and quantities, and retrieving geometry bounding boxes — allowing AI assistants like Claude to reason about building information models without requiring the user to manually extract data.


Installation

pip install ifc-mcp
# or with uv:
uv tool install ifc-mcp

Claude Desktop config (no path needed):

{
  "mcpServers": {
    "ifc": {
      "command": "uvx",
      "args": ["ifc-mcp"]
    }
  }
}

To update

uv tool upgrade ifc-mcp

Or pin to a specific version:

"args": ["ifc-mcp==0.2.0"]

Skip permission prompts (Claude Code)

Add the tools to your ~/.claude/settings.json so Claude Code never asks for confirmation:

{
  "permissions": {
    "allow": [
      "mcp__ifc__load_ifc_file",
      "mcp__ifc__list_loaded_models",
      "mcp__ifc__unload_ifc_file",
      "mcp__ifc__get_spatial_structure",
      "mcp__ifc__get_element_containment",
      "mcp__ifc__get_elements_by_type",
      "mcp__ifc__get_element_by_id",
      "mcp__ifc__search_elements",
      "mcp__ifc__get_property_sets",
      "mcp__ifc__get_quantities",
      "mcp__ifc__get_material",
      "mcp__ifc__get_model_statistics",
      "mcp__ifc__get_bounding_box",
      "mcp__ifc__get_element_placement",
      "mcp__ifc__get_element_local_bbox",
      "mcp__ifc__get_element_body_mapping",
      "mcp__ifc__get_property_sets_detail",
      "mcp__ifc__get_element_by_label",
      "mcp__ifc__get_representation",
      "mcp__ifc__get_elements_batch"
    ]
  }
}

Related MCP server: IFCX MCP

Development Setup

Prerequisites: Python 3.11+, uv

git clone <repo>
cd IfcMcp
uv sync
uv run pytest                            # verify all tests pass

Claude Desktop config for local dev:

{
  "mcpServers": {
    "ifc": {
      "command": "uv",
      "args": ["run", "python", "server.py"],
      "cwd": "/absolute/path/to/IfcMcp"
    }
  }
}

On Windows, use double backslashes: "cwd": "C:\\Users\\...\\IfcMcp"


Tools Reference

Every tool (except list_loaded_models) requires a model_id — the value returned by load_ifc_file.

Tool

Parameters

Description

load_ifc_file

path

Load an IFC file; returns model_id

list_loaded_models

—

List all models in memory

unload_ifc_file

model_id

Free a loaded model

get_spatial_structure

model_id

Full spatial hierarchy (Project→Site→Building→Storey→Space)

get_element_containment

model_id, global_id

Full containment chain up to Site

get_elements_by_type

model_id, ifc_type, limit, offset

Paginated list by IFC type

get_element_by_id

model_id, global_id

Full element details (includes entity_label, type_global_id)

get_element_by_label

model_id, entity_label

Look up element by integer STEP label (#NNN)

get_elements_batch

model_id, global_ids, include

Batch query; include: entity_label, placement, property_sets, local_bbox

search_elements

model_id, filters..., limit, offset

Filter elements by type/name/pset/property

get_property_sets

model_id, global_id

All Psets for an element

get_property_sets_detail

model_id, global_id

Psets split by instance-level vs type-level

get_quantities

model_id, global_id

All quantity sets for an element

get_material

model_id, global_id

Material info (name, layers, category)

get_model_statistics

model_id

Element counts by type, storey names, schema

get_bounding_box

model_id, global_id

Min/max XYZ bounding box in world coordinates

get_element_placement

model_id, global_id

object_placement + world_transform + determinant + body mapping flag

get_element_local_bbox

model_id, global_id

Bounding box in element's local coordinate frame

get_element_body_mapping

model_id, global_id

Body mapping matrix, world transform, mirroring detection

get_representation

model_id, global_id

Representation structure without tessellating geometry


MCP Resource

Each loaded model exposes a pre-computed summary resource:

ifc://model/{model_id}/summary

This resource is computed at load time and contains the project name, IFC schema version, element counts by type, and storey names. It gives AI agents a fast overview of a model without issuing individual tool calls.


Error Responses

All tools return structured error objects. Common codes:

{"error": "element_not_found", "details": "..."}
{"error": "model_not_loaded", "details": "..."}
{"error": "geometry_unavailable", "details": "..."}
{"error": "file_not_found", "details": "..."}
{"error": "load_failed", "details": "..."}
{"error": "query_failed", "details": "..."}

Available Tools

20 tools
get_bounding_boxA

Get the bounding box (min/max XYZ and dimensions) of an element in project coordinates.

Inputs: model_id (required), global_id (required).

get_element_body_mappingA

Get the body mapping matrix for an element with IfcMappedItem geometry. Returns: has_mapped_item, body_mapping_matrix (4x4), world_transform (OPM × body mapping), world_transform_determinant, is_mirrored (det<0 means Y-negation needed). Essential for detecting baked rotations in luminaire imports.

Inputs: model_id (required), global_id (required).

get_element_by_idB

Get full details for a single element by its GlobalId.

Inputs: model_id (required), global_id (required).

get_element_by_labelA

Look up an element by its integer IFC entity label (#NNN from the STEP file). Returns the same response as get_element_by_id. Use to cross-reference import log output like '[OK] #16535 LightGraphix...' directly against MCP queries.

Inputs: model_id (required), entity_label (required).

get_element_containmentA

Get the spatial containment chain for an element (Space > Storey > Building > Site).

Inputs: model_id (required), global_id (required).

get_element_local_bboxA

Get the local-space bounding box of an element (no world transform applied). Returns min/max XYZ and dimensions in the element's own coordinate system. Use for mounting axis prediction and recessed fixture detection.

Inputs: model_id (required), global_id (required).

get_element_placementA

Get the world-space placement of an element: insertion point (XYZ) and orientation axes (X/Y/Z unit vectors). Useful for position, rotation, and aim direction of elements like luminaires.

Inputs: model_id (required), global_id (required).

get_elements_batchA

Batch query for multiple elements by GlobalId. include options: 'entity_label', 'placement', 'property_sets', 'local_bbox'. Default: ['entity_label', 'placement']. Avoids individual round-trips for files with 200+ fixtures.

Inputs: model_id (required), global_ids (required), include.

get_elements_by_typeA

Get elements of a given IFC type (e.g. IfcWall, IfcDoor). Supports pagination via limit/offset.

Inputs: ifc_type (required), model_id (required), limit, offset.

get_materialA

Get material information for an element. Returns {name, layers, category} — layers is a list of {name, thickness} for layered assemblies, or None for simple materials.

Inputs: model_id (required), global_id (required).

get_model_statisticsA

Get element counts by IFC type, storey names, schema version, and total count.

Inputs: model_id (required).

get_property_setsB

Get all property sets (Psets) for an element as {pset_name: {prop_name: value}}.

Inputs: model_id (required), global_id (required).

get_property_sets_detailA

Get property sets split by source: instance-level psets vs type-level psets. Use to determine whether a property was overridden at instance level or inherited from the type.

Inputs: model_id (required), global_id (required).

get_quantitiesB

Get all quantity sets for an element as {qset_name: {quantity_name: value}}.

Inputs: model_id (required), global_id (required).

get_representationA

Get the representation structure of an element without tessellating geometry. Returns representation type, identifier, and items with IfcMappedItem details (mapping_target_is_identity, mapping_target_matrix). Use to detect baked rotations before geometry extraction.

Inputs: model_id (required), global_id (required).

get_spatial_structureA

Get the full spatial hierarchy: Project > Site > Building > Storey > Space.

Inputs: model_id (required).

list_loaded_modelsA

List all IFC models currently loaded in memory.

Inputs: no named parameters.

load_ifc_fileA

Load an IFC file from the given path. Returns model_id for subsequent queries.

Inputs: path (required).

search_elementsB

Search elements with optional filters: IFC type, name substring, pset_name (must own this pset), property_name/property_value (property within that pset or any pset). Supports pagination via limit/offset.

Inputs: model_id (required), limit, offset, ifc_type, +4 more.

unload_ifc_fileC

Unload an IFC model from memory to free resources.

Inputs: model_id (required).

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.6/5.0

    Scored across 20 tools

    Disambiguation4/5

    Most tools have clearly distinct purposes (loading, spatial structure, element queries, properties, geometry). The only potential confusion is between get_element_by_id and get_element_by_label (both return element details) and get_property_sets vs get_property_sets_detail, but the descriptions explicitly differentiate them by input and level of detail.

    Naming Consistency5/5

    All 20 tool names follow a consistent snake_case verb_noun pattern (load_ifc_file, list_loaded_models, get_element_placement, search_elements). The verbs are uniform: load/list/unload for lifecycle, get for queries, search for search, with no mixed conventions or vague action words.

    Tool Count4/5

    With 20 tools, the server is slightly over the ideal 3-15 range but still well-scoped for the complex domain of IFC model analysis. Each tool addresses a specific aspect of querying building data, and the count is justified by the breadth of information exposed.

    Completeness4/5

    The toolset covers the full read-only lifecycle: loading/unloading models, querying spatial hierarchy, elements, properties, quantities, materials, geometry context, and batch operations. Minor gaps exist, such as no direct query of elements by spatial level or retrieval of raw geometry tessellation, but the core analytical workflows are well supported.

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables AI assistants to interact with OpenStudio building energy models through natural language, allowing users to load, inspect, and manipulate OSM files including building geometry, HVAC systems, materials, schedules, and internal loads.
      11
      MIT
    • A
      license
      C
      quality
      D
      maintenance
      Enables AI assistants to create, edit, and export IFC5/IFCX building information models through natural language, handling spatial structure, elements, geometry, metadata, validation, and export.
      73
      9 npm
      26
      Apache 2.0
    • A
      license
      A
      quality
      D
      maintenance
      An MCP server that lets users query, validate, convert, and compare IFC/BIM files using natural language. Runs fully locally and integrates with AI agents like Claude.
      8
      MIT