Skip to content

Tools: Zone Properties

Zone properties tool — typed summary of zone geometry, surfaces, constructions, and HVAC.

get_zone_properties(zone_name=None)

Typed summary of zone geometry, surfaces, constructions, schedules, and HVAC.

Returns floor area, volume, ceiling height, surface counts by type (walls/floors/roofs/ windows/doors), unique construction names, schedule names referenced by zone loads, HVAC equipment connection names, and thermostat control object names.

Geometry values (area, volume, height) are calculated from BuildingSurface:Detailed vertices and returned as None when no surfaces exist for the zone.

Preconditions: model loaded. Side effects: none — read-only.

Source code in src/idfkit_mcp/tools/zone_properties.py
@tool(annotations=_READ_ONLY)
def get_zone_properties(
    zone_name: Annotated[str | None, Field(description="Zone name. Omit for all zones.")] = None,
) -> GetZonePropertiesResult:
    """Typed summary of zone geometry, surfaces, constructions, schedules, and HVAC.

    Returns floor area, volume, ceiling height, surface counts by type (walls/floors/roofs/
    windows/doors), unique construction names, schedule names referenced by zone loads,
    HVAC equipment connection names, and thermostat control object names.

    Geometry values (area, volume, height) are calculated from BuildingSurface:Detailed
    vertices and returned as None when no surfaces exist for the zone.

    Preconditions: model loaded.
    Side effects: none — read-only.
    """
    state = get_state()
    doc = state.require_model()

    if zone_name is not None:
        if "Zone" not in doc or doc.get_collection("Zone").get(zone_name) is None:
            from fastmcp.exceptions import ToolError

            raise ToolError(f"Zone '{zone_name}' not found in the model.")
        zones = [_build_zone_properties(doc, zone_name)]
    else:
        if "Zone" not in doc:
            return GetZonePropertiesResult(zone_count=0, zones=[])
        zones = [_build_zone_properties(doc, z.name) for z in doc.get_collection("Zone")]

    logger.debug("get_zone_properties: returned %d zone(s)", len(zones))
    return GetZonePropertiesResult(zone_count=len(zones), zones=zones)