Skip to main content
Glama
Meteor-Simulation

BULC MCP

Official

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
BULC_MCP_HINTSNoIf set to '0', do not append rule id hints at the end of tool descriptions. Default is '1'.1
BULC_BRIDGE_URLNoBridge full address (highest priority), e.g., http://127.0.0.1:8790
BULC_BRIDGE_HOSTNoHost to use when discovery file is absent (default is 127.0.0.1)127.0.0.1
BULC_BRIDGE_PORTNoPort to use when discovery file is absent (default is 8787)8787
BULC_MCP_PROFILENoProfile for tool exposure. 'compact': expose only local tools plus bulc_find_tools and bulc_call (for clients with tool count limit). Default is 'full'.full
BULC_BRIDGE_TOKENNoBridge token (used when connecting to an app with BULC_BRIDGE_AUTH without discovery file)
BULC_MCP_TOOLSETSNoComma-separated app tool categories to expose in 'full' profile: project, arch, geometry, fire, ventilation, device, mesh, material, surface, output, query, evac, spr, hvac, draw, furniture, result, shape
BULC_MCP_WATCH_MSNoApp connection watch interval in milliseconds. If set to '0', watching is disabled. Default is 15000 (15 seconds).15000
BULC_MCP_HIDE_TOOLSNoComma-separated tools to hide, e.g., project_new,sim_stop
BULC_MCP_ALLOW_REMOTENoIf set to '1', allow non-loopback bridge addresses (not recommended). Default is '0'.0
BULC_MCP_ATTACH_IMAGESNoIf set to '0', do not attach capture_view and shape_screenshot images as image content. Default is '1'.1
BULC_MCP_CALL_TIMEOUT_MSNoApp tool call timeout in milliseconds. Default is 120000 (2 minutes). Some tools like drawing analysis may take longer.120000
BULC_MCP_MAX_DESCRIPTIONNoMaximum tool description length (characters). For clients with 1,024 character limit, set to '1024'.
BULC_BRIDGE_DISCOVERY_FILENoChange discovery file path. If set to '0', do not read the discovery file.

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": true
}
prompts
{}
resources
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
bulc_connection_statusA

Check whether the BULC desktop app is running and reachable through its local bridge, whether the program answering is really BULC, how many tools it exposes, whether its tool set matches the bundled snapshot, and whether this server is showing the live tool list or the bundled snapshot. Call this first, and again whenever an app tool fails. BULC 앱 연결 상태를 확인합니다.

bulc_knowledge_searchA

Search the bundled BULC knowledge pack — modelling rules (condition → check → fix), common LLM mistakes, ontology classes (units, coordinates, which tool creates what), playbook steps, glossary (Korean ↔ English ↔ FDS keyword ↔ tool), FDS 6.10.1 key reference and FDS input errors. Pass a rule id (e.g. FIRE-001), a class (Mesh), an FDS key (MESH.IJK), an error (ERROR 314) or free text in Korean or English. Works without the app. 지식 팩 검색(규칙 id·키워드).

bulc_get_rulesA

List modelling rules filtered by domain, severity, class (applies_to), confidence, or the tool they mention. Use before a phase of work (e.g. domain=sprinkler, min_severity=warning) and quote rule ids when explaining. Works without the app. 규칙을 영역·심각도·도구별로 가져옵니다.

bulc_plan_checkA

Review the sequence of tool calls you intend to make BEFORE calling them. Checks tool names and argument names against the live app (or the bundled snapshot), and the plan against the BULC rules: units and XB order, total HRR from HRRPUA × area, fires the user did not ask for, opening the floor boundary, single-mesh tools after multi-mesh, dump intervals ≥ T_END, re-running hydraulic/HVAC calculations before applying them to FDS, unique labels for sprinkler heads and HVAC terminals, dry runs before drawing imports, validate_project / sim_preflight before sim_start, user confirmation, evacuation run order, file tools of other servers, and more. Returns findings with rule ids and the playbook to follow. Works without the app. Steps are objects {tool, args} or strings like 'add_fire {"hrrpua": 500, "xb": [..]}'. 실행 전에 계획을 규칙으로 점검합니다.

bulc_drawing_intakeA

First step for any drawing the user gives (DWG, DXF, PDF, image, ZIP bundle, IFC, or an .fds deck). Pass the ABSOLUTE local path. Reads the file on this PC only — it never uploads anything — and classifies it (architectural plan, sprinkler plan, piping isometric, HVAC plan, FDS deck) from the extension, file name, DXF units/layers/blocks/line angles, PDF pages and fonts, ZIP contents or IFC entities. Returns the playbook to follow, the questions to ask the user (units, scale, origin, layers …) and the tool sequence (architectural plans → arch_analyze_drawing / arch_import_building, piping → spr_analyze_drawing / spr_import_network). For DXF plans, extract_geometry=true also returns wall centre-line candidates in metres (fallback for older apps). Text inside the drawing (title blocks, notes) is never returned. 도면 파일을 로컬에서 분류하고 플레이북·질문·도구 순서를 돌려줍니다(업로드 없음).

bulc_check_deckA

Deterministic FDS 6.10.1 deck check with rule ids: mesh XB/IJK, cell aspect ratio, 2·3·5 cell counts, multi-mesh overlaps and cell ratios, objects and devices outside the meshes, VENT planes, undefined SURF/MATL/PROP/PART/RAMP/CTRL references, HRRPUA without &REAC, total HRR and D*/dx, dump intervals ≥ T_END, missing OPEN boundary or SLCF, detector/sprinkler PROP data, spray flow keys, CHID. Give deck_text, a local .fds path, or from_app=true for the deck of the project open in BULC. Complements validate_project (which also checks app-side state). FDS 덱을 규칙 id 와 함께 결정적으로 점검합니다.

bulc_mesh_advisorA

Cell-size advice from the fire size: characteristic fire diameter D* = (Q / (ρ∞ cp T∞ √g))^(2/5) and the cell sizes for D*/dx = 4 (coarse), 10 (moderate) and 16 (fine). With domain_xb it proposes IJK per axis rounded to counts made of 2, 3 and 5 (friendly to the FFT pressure solver), the resulting cells and the total cell count. Works without the app. 화원 크기로 셀 크기와 IJK 를 제안합니다(MESH-002, MESH-003, MESH-010).

bulc_find_toolsA

Find BULC app tools by keyword (Korean or English) or category and return their names, descriptions and full input schemas. Categories: project (open/save/run/results/ASET/screenshots), arch (floor-plan drawings), geometry, fire, ventilation, device, mesh, material, surface, output, query, evac, spr, hvac, draw, furniture, result, shape. In the compact profile, call the tool you found with bulc_call. 키워드로 앱 도구를 찾습니다.

get_project_summaryA

Short summary of the project currently open in the BULC app: CHID, title, end time, mesh, and object counts (obstacles, fire sources, vents, devices, evacuation agents, sprinkler heads, HVAC terminals). Needs the app. On BULC 0.90+ project_info gives more (file path, unsaved changes, stories, deck path). 현재 앱 프로젝트 요약입니다.

run_simulationA

Guarded run for any BULC version: writes the project open in BULC to Documents/bulc_<folder_name> and starts the simulation. Before starting, this server runs the app's validate_project and refuses to start when it reports errors (점검 실패) — fix them first. When the app lists sim_preflight / sim_start (BULC 0.90+), prefer sim_preflight → user confirmation → sim_start {confirm: true}: they also check output intervals and grid resolution and write the deck next to the saved project. Summarise the conditions (mesh, fire, T_END, outputs, solver) and get the user's go-ahead before calling (GEN-016). Use a new folder_name per scenario (GEN-019). 실행 전에 validate_project 를 자동으로 돌리고, 오류가 있으면 실행하지 않습니다.

add_obstacleB

Add an obstacle (solid block) to the FDS model. XB=[x1,x2,y1,y2,z1,z2] in metres. [bulc-mcp rules] GEN-003 — bulc_knowledge_search ""

remove_obstacleC

Remove an obstacle by ID. [bulc-mcp rules] GEN-003 — bulc_knowledge_search ""

update_obstacleC

Update an existing obstacle by ID. Provide only fields to change. [bulc-mcp rules] GEN-003, GEO-002, GEO-005 — bulc_knowledge_search ""

set_fds_propertiesA

Update an obstacle's Runtime FDS Properties. Merge ANY fds_override fields and/or set is_fire_source/hrrpua/surf_ids. fds_override examples — fire: hrrpua_override, tmp_front, ramp_points, fire_area, fire_faces, ext_coeff; fuel/REAC: fuel_type, reac_co_yield, reac_soot_yield, reac_hcn_yield, reac_radiative_fraction; heat detector: activation_temp, rti, initial_temp; smoke: alpha_e, beta_e, alpha_c, beta_c; thermocouple: bead_diameter, emissivity, tc_density, specific_heat; sprinkler: spr_profile_id (shared spray profile), spr_spray_override (per-head FDS keys, e.g. {"particles_per_second":10000,"part":{"age":600}}; replaces the overrides — prefer spr_set_head_spray), spr_temp, spr_rti, k_factor (L/(min·bar^½)), operating_pressure (bar), flow_rate (L/min), spray_angle, particle_diameter (µm), spr_activation_time, spr_orientation (upright still 0,0,-1); HVAC: hvac_direction, volume_flow_rate, temperature, velocity, fan_curve, face_surfs, ramp_up_time. Read current values first with get_object_properties.

add_holeB

Add a hole (opening in an obstacle) to the FDS model. XB defines the hole volume. [bulc-mcp rules] GEO-004, GEO-008 — bulc_knowledge_search ""

remove_holeC

Remove a hole by ID. [bulc-mcp rules] EVAC-002, GEO-004 — bulc_knowledge_search ""

update_holeC

Update an existing hole by ID. [bulc-mcp rules] EVAC-002, GEN-003, GEO-004 — bulc_knowledge_search ""

add_wallB

Convenience tool: add a wall by specifying start point, end point, height, and thickness. Automatically calculates the OBST bounding box. Points are [x,y] on the floor plane. [bulc-mcp rules] GEN-003, GEO-002, DRW-004 — bulc_knowledge_search ""

add_floorC

Convenience tool: add a floor slab. Specify x/y range and optional thickness. [bulc-mcp rules] GEN-003, GEO-007 — bulc_knowledge_search ""

add_doorA

Convenience tool: add a door opening in a wall. Specify the wall obstacle ID and door position/size. Creates a HOLE that cuts through the wall. [bulc-mcp rules] EVAC-002, GEO-004 — bulc_knowledge_search ""

add_windowB

Convenience tool: add a window opening in a wall. Similar to add_door but with sill height. [bulc-mcp rules] GEO-004 — bulc_knowledge_search ""

transform_obstacleA

Move / resize / rotate an existing obstacle (the 3D gizmo + property-panel SX/SY/SZ of the GUI). move = relative offset [dx,dy,dz] (m); place_at = absolute target point for anchor (default the XB centre); scale = absolute per-axis scale factors that stretch XB about its centre and rescale furniture voxels; rotation = [rx,ry,rz] degrees (kept as GUI metadata — &OBST itself stays axis-aligned, so a rotated furniture item is exported through its voxels). Combine as many as you need in one call. [bulc-mcp rules] DEVC-001, GEN-003, GEO-002 — bulc_knowledge_search ""

list_geomsA

List the &GEOM (triangulated cut-cell geometry) entries in the deck with triangle count, SURF_ID and bounding box.

remove_geomB

Remove a &GEOM entry by ID (see list_geoms).

add_fireA

Add a fire source. HRRPUA = Heat Release Rate Per Unit Area (kW/m²). XB defines location. For a time-varying fire, pass ramp_points (an explicit HRR fraction curve) OR growth (an NFPA t-squared growth curve) — both auto-create a RAMP and link it. [bulc-mcp rules] FIRE-001, FIRE-002, FIRE-003 — bulc_knowledge_search ""

update_fireC

Update an existing fire source by index (0-based). [bulc-mcp rules] FIRE-001, FIRE-002, FIRE-003 — bulc_knowledge_search ""

remove_fireB

Remove a fire source by index (0-based). [bulc-mcp rules] FIRE-001, FIRE-002, FIRE-003 — bulc_knowledge_search ""

update_reactionC

Update the combustion reaction parameters. [bulc-mcp rules] FIRE-003, FIRE-007, FIRE-009 — bulc_knowledge_search ""

add_speciesC

Add a tracked species.

remove_speciesC

Remove a tracked species by ID.

add_ventB

Add a vent (boundary patch). XB defines the vent surface. [bulc-mcp rules] EVAC-002, VENT-002, VENT-004 — bulc_knowledge_search ""

remove_ventB

Remove a vent by ID. [bulc-mcp rules] VENT-002, VENT-004 — bulc_knowledge_search ""

update_ventC

Update an existing vent by ID. [bulc-mcp rules] GEN-003, VENT-002, VENT-004 — bulc_knowledge_search ""

set_open_boundaryB

Set a domain face as OPEN (or close it). Face: XMIN, XMAX, YMIN, YMAX, ZMIN, ZMAX. [bulc-mcp rules] EVAC-002, VENT-002, VENT-004 — bulc_knowledge_search ""

set_all_boundaries_openB

Set all 6 domain faces to OPEN (or selectively by providing a list of faces). [bulc-mcp rules] EVAC-002, VENT-002, VENT-004 — bulc_knowledge_search ""

add_deviceA

Add a measurement device (&DEVC) with full parameter support: point (xyz) or region (xb) quantities, species, statistics, trip options (setpoint/latch/initial_state/trip_direction), post-processing, aspiration, HVAC and particle quantities. Provide xyz for point quantities or xb for flow/HRR/layer/beam/statistics. [bulc-mcp rules] DEVC-001, DEVC-003, DEVC-004 — bulc_knowledge_search ""

remove_deviceA

Remove a single device by ID (or internal uid). With duplicate IDs, removes only the first match. [bulc-mcp rules] DEVC-001, DEVC-003, DEVC-004 — bulc_knowledge_search ""

update_deviceB

Update an existing device by ID (or internal uid). Any &DEVC field can be changed; only one device is modified even with duplicate IDs. [bulc-mcp rules] DEVC-001, DEVC-003, DEVC-004 — bulc_knowledge_search ""

add_sprinklerA

Convenience: add a complete sprinkler head (FDS 6.10.1). Creates DEVC + PROP (QUANTITY=SPRINKLER LINK TEMPERATURE) + water-droplet PART (SPEC_ID=WATER VAPOR) from the project default spray profile (standard pendant K80: K 80 L/(min·bar^½), 1.0 bar, 68 °C, RTI 100, SPRAY_ANGLE 30/80, 10 m/s, 1000 µm, 5000 particles/s). Flow: give k_factor+operating_pressure (FDS derives Q=K√p), or flow_rate (optionally with pressure/K). K alone or pressure alone is rejected by FDS (ERROR 238). Upright heads also spray downward (only SMOKEVIEW_ID differs). profile_id picks another shared spray profile (e.g. ESFR or water mist from spr_upsert_spray_profile); spray / particle override any other &PROP / &PART key for this head (same keys as spr_upsert_spray_profile prop / part); activation opens it by time / CTRL / at t=0. [bulc-mcp rules] DEVC-001, DEVC-009, SPR-010 — bulc_knowledge_search ""

add_nozzleA

Convenience: add a Lagrangian-particle virtual fuel nozzle (e.g. hydrogen TPRD jet release). Automatically creates DEVC (QUANTITY=TIME, SETPOINT=0, ORIENTATION), PROP (MASS_FLOW_RATE / FLOW_RAMP / PARTICLE_VELOCITY / SPRAY_ANGLE / PARTICLES_PER_SECOND), PART (SPEC_ID / DIAMETER / MONODISPERSE / INITIAL_TEMPERATURE), the fuel SPEC (FORMULA + liquid-droplet properties taken from the built-in fuel database) and aligns REAC (FUEL / RADIATIVE_FRACTION / SOOT_YIELD / CO_YIELD) when no reaction is set yet.

add_heat_detectorA

Convenience: add a heat detector as a small obstacle with FDS override. Generates DEVC+PROP in FDS output. [bulc-mcp rules] DEVC-001, DEVC-009 — bulc_knowledge_search ""

add_smoke_detectorA

Convenience: add a smoke detector as a small obstacle with FDS override. Generates DEVC+PROP in FDS output. [bulc-mcp rules] DEVC-001, DEVC-009 — bulc_knowledge_search ""

add_thermocoupleB

Convenience: add a thermocouple as a small obstacle with FDS override. Generates DEVC in FDS output. [bulc-mcp rules] DEVC-001 — bulc_knowledge_search ""

add_controlA

Add a CTRL control logic element. FUNCTION_TYPE: logic ANY/ALL/NOT/XOR/X_OF_N(N), TIME_DELAY(delay), KILL/RESTART, DEADBAND(setpoint+setpoint2+on_bound), CUSTOM(ramp_id), PID(target_value+gains), math ABS/EXP/LOG/SIN/COS/ASIN/ACOS/ATAN/SUM/SUBTRACT/MULTIPLY/DIVIDE/POWER/MIN/MAX (with setpoint+trip_direction they act as boolean gates). INPUT_ID accepts device IDs, other CTRL IDs, or CONSTANT. [bulc-mcp rules] DEVC-004, DEVC-006 — bulc_knowledge_search ""

update_controlB

Update an existing CTRL by ID. Any field of add_control can be changed. [bulc-mcp rules] DEVC-004, DEVC-006 — bulc_knowledge_search ""

remove_controlC

Remove a CTRL control by ID. [bulc-mcp rules] DEVC-004, DEVC-006 — bulc_knowledge_search ""

add_propA

Add a &PROP device model. quantity presets seed standard defaults: 'LINK TEMPERATURE' (heat detector link), 'SPRINKLER LINK TEMPERATURE', 'CHAMBER OBSCURATION' (smoke detector), 'THERMOCOUPLE' (bead). Override any field. Reference from devices via prop_id. Every other FDS 6.10.1 spray key (mass flow, pressure/flow ramp, particle velocity, orifice, parcels, spray pattern shape/table, smokeview id …) goes in spray with the spr_upsert_spray_profile.prop key names. [bulc-mcp rules] DEVC-009 — bulc_knowledge_search ""

update_propB

Update an existing &PROP model by ID. Same fields as add_prop; spray_unset removes spray keys (FDS default). [bulc-mcp rules] DEVC-009 — bulc_knowledge_search ""

remove_propA

Remove a &PROP model by ID. Devices referencing it fall back to solver defaults.

set_mesh_cell_sizeA

Set a uniform cell size (m); NI/NJ/NK are computed from the current domain extents. ⚠ Resets any multi-mesh deck to a single mesh. Use set_meshes / auto_multimesh to keep or build a multi-mesh deck. [bulc-mcp] Resets a multi-mesh deck to a single mesh (MESH-004). [bulc-mcp rules] MESH-001, MESH-005, MESH-002 — bulc_knowledge_search ""

auto_fit_meshA

Auto-fit the mesh domain to the bounding box of all obstacles plus margin; recomputes NI/NJ/NK to keep the current cell size. ⚠ Resets any multi-mesh deck to a single mesh. Use set_meshes / auto_multimesh to keep or build a multi-mesh deck. [bulc-mcp] Resets a multi-mesh deck to a single mesh (MESH-004). [bulc-mcp rules] MESH-001, MESH-005, GEO-006 — bulc_knowledge_search ""

set_run_optionsA

Set simulation RUN options (RUN dialog): solver type (gpu / gpu_cutcell = octree cut-cell engine (beta), runs on the grid from the Mesh dialog cut-cell tab / cpu_openmp), CPU thread count, FDS output path. [bulc-mcp] Writes files on this PC at the path you give. [bulc-mcp rules] GEN-016, SIM-002, SIM-009 — bulc_knowledge_search ""

set_meshA

Set the computational mesh resolution and domain extents (a single &MESH). ⚠ Resets any multi-mesh deck to a single mesh. Use set_meshes / auto_multimesh to keep or build a multi-mesh deck. [bulc-mcp] Resets a multi-mesh deck to a single mesh (MESH-004). [bulc-mcp rules] MESH-001, MESH-005, GEO-006 — bulc_knowledge_search ""

set_timeC

Set the simulation end time. [bulc-mcp rules] GEN-016, SIM-002, FIRE-005 — bulc_knowledge_search ""

update_dump_configC

Update output dump intervals and settings. [bulc-mcp rules] EVAC-008, OUT-001, OUT-004 — bulc_knowledge_search ""

set_turbulence_modelB

Set the turbulence model. Options: DEARDORFF (default), VREMAN, WALE, CONSTANT_SMAGORINSKY. [bulc-mcp rules] GEN-016, SIM-002 — bulc_knowledge_search ""

set_simulation_modeC

Set simulation mode: LES, VLES, SVLES, or DNS [bulc-mcp rules] GEN-016, SIM-002, SIM-001 — bulc_knowledge_search ""

set_numericsA

Set numerical stability controls (time step and advection scheme). Use this when a run diverges, produces NaN, or when matching CPU FDS settings. dt/lock_time_step map to &TIME; the rest to &MISC. Omitted fields keep the FDS default for the current SIMULATION_MODE. particle_global sets the particle/spray-wide keys (&MISC POROUS_FLOOR, PARTICLE_CFL(_MAX/_MIN), CNF_CUTOFF, NEAR_WALL_PARTICLE_INTERPOLATION; &DUMP MAXIMUM_PARTICLES, DT_PART); particle_global_unset returns keys to the FDS default. [bulc-mcp rules] GEN-016, SIM-002, SIM-003 — bulc_knowledge_search ""

get_numericsB

Read the current numerical stability settings (time step, CFL/VN limits, flux limiter). [bulc-mcp rules] GEN-016, SIM-002 — bulc_knowledge_search ""

set_ambientA

Set the ambient (initial atmosphere) conditions written to &MISC: TMPA (ambient temperature °C), HUMIDITY (%RH), Y_CO2_INFTY (background CO2 mass fraction). The GPU engine reads all three. Use extra for any other &MISC key you need to carry (e.g. P_INF, GVEC) — it is written verbatim. Pass null for a key to drop it and fall back to the FDS default (TMPA 20°C, HUMIDITY 40%). [bulc-mcp rules] GEN-016, SIM-002 — bulc_knowledge_search ""

get_simulation_settingsA

Read every simulation setting in one call: time (T_BEGIN/T_END), SIMULATION_MODE, turbulence model, numerics (DT/CFL/VN/flux limiter), ambient &MISC values, output dump intervals and Plot3D quantities, and the mesh deck size. Use it before changing settings so you know what is already explicit. [bulc-mcp rules] GEN-006, GEN-010, GEN-016 — bulc_knowledge_search ""

list_raw_namelistsB

List the raw namelist lines carried through unchanged (&RADI, &PRES, &COMB, &ZONE, &MULT, …) — settings the GUI has no dialog for but the deck and the engine keep. [bulc-mcp rules] GEN-016, SIM-002, SIM-006 — bulc_knowledge_search ""

add_raw_namelistA

Add a raw namelist line emitted verbatim just before &TAIL — for settings with no GUI dialog (e.g. "&RADI RADIATIVE_FRACTION=0.35 /", "&PRES VELOCITY_TOLERANCE=1.E-4 /"). Must start with & and end with /. Use the dedicated tools for anything the GUI does model (&MESH/&OBST/&VENT/&SURF/&REAC/&DEVC/&CTRL/&SLCF/&BNDF/&DUMP/&TIME/&MISC) — a duplicate namelist is an FDS error. [bulc-mcp rules] GEN-016, SIM-002, GEN-017 — bulc_knowledge_search ""

remove_raw_namelistA

Remove a raw namelist line by its index from list_raw_namelists. [bulc-mcp rules] GEN-016, SIM-002, FIRE-009 — bulc_knowledge_search ""

list_meshesA

List the current &MESH deck (multi-mesh or the single mesh) with per-mesh XB, IJK, cell size, cell count and coarse/fine ratio, plus totals and a self-check for overlap / gaps / non-cubic cells. Read this before set_meshes, slice_mesh or merge_meshes so index numbers refer to the right mesh. [bulc-mcp rules] MESH-001, MESH-005, GEO-003 — bulc_knowledge_search ""

set_meshesA

Replace the whole &MESH deck with an explicit list of meshes (multi-mesh). Passing a single mesh reverts the project to single-mesh mode. config.mesh (the union bounding box) and the OPEN-boundary vents are kept consistent by the app. Engine constraints (engine multimesh ratio_union_grid): (1) every mesh must use CUBIC cells whose size is the finest cell x 2^k (k in 1,2,4,8,16); (2) every mesh boundary and the union extent must land on a fine-grid index that is a multiple of the LARGEST ratio actually used; (3) meshes must tile the domain with no overlap and no gap; (4) a 1:4 or larger ratio makes the engine print an experimental-feature warning and switches it to per-mesh storage (MM2) plus the composite block-CG v2 pressure solve, both automatically. Verify with list_meshes; for shape-driven placement prefer auto_multimesh. [bulc-mcp rules] MESH-001, MESH-005, MESH-004 — bulc_knowledge_search ""

slice_meshA

Split one mesh into two at a plane (multi-mesh cutter). The coordinate snaps to that mesh's own grid lines, cell size is preserved on both halves, and OPEN vents crossing the plane are split too. Slicing the single mesh turns the project into a multi-mesh deck. Use list_meshes for index numbers. [bulc-mcp rules] MESH-001, MESH-005 — bulc_knowledge_search ""

merge_meshesA

Merge several meshes back into one (inverse of slice_mesh). Succeeds only when the selected meshes do not overlap and their union is exactly a box. When their cell sizes differ, choice picks which size the result uses; the union must divide into a whole number of those cells. Use list_meshes for index numbers. [bulc-mcp rules] MESH-001, MESH-005 — bulc_knowledge_search ""

auto_multimeshA

Build a multi-mesh deck from the OBSTRUCTION geometry. It measures the fluid gap everywhere (obstacles minus HOLEs, so doorways stay open), gives narrow places 3+ cells across and open places the default wide cell, then merges equal-size regions into boxes cut on obstacle faces so walls stay on mesh boundaries. Wall slabs up to 2 cells thick are absorbed into a neighbour. Cell sizes are quantised to min_cell x 2^k; an overlapping, gapped or misaligned deck is refused, not committed. The domain may grow to a multiple of the coarsest cell; OPEN vents follow. Engine constraints (engine multimesh ratio_union_grid): (1) every mesh must use CUBIC cells whose size is the finest cell x 2^k (k in 1,2,4,8,16); (2) every mesh boundary and the union extent must land on a fine-grid index that is a multiple of the LARGEST ratio actually used; (3) meshes must tile the domain with no overlap and no gap; (4) a 1:4 or larger ratio makes the engine print an experimental-feature warning and switches it to per-mesh storage (MM2) plus the composite block-CG v2 pressure solve, both automatically. Verify the result with list_meshes.

auto_cutcell_meshA

Build a cut-cell multi-mesh deck from &GEOM triangulated shapes (plus OBSTs). Cells shrink where the fluid gap is narrow (gap / gap_cells), the GEOM surface band always gets the finest cell so the engine keeps its cut-cell wall physics there, sharp curvature gets one level finer, and levels change at most 2:1 between neighbouring blocks. Cell sizes are min_cell x 2^k. If the deck has no GEOM this is identical to auto_multimesh. Over budget it relaxes curvature, buffer, gap_cells, then raises min_cell and reports what it changed; a gapped, overlapping or misaligned deck is refused. Engine constraints (engine multimesh ratio_union_grid): (1) every mesh must use CUBIC cells whose size is the finest cell x 2^k (k in 1,2,4,8,16); (2) every mesh boundary and the union extent must land on a fine-grid index that is a multiple of the LARGEST ratio actually used; (3) meshes must tile the domain with no overlap and no gap; (4) a 1:4 or larger ratio makes the engine print an experimental-feature warning and switches it to per-mesh storage (MM2) plus the composite block-CG v2 pressure solve, both automatically. Verify with list_meshes.

add_materialC

Add a material definition (MATL). [bulc-mcp rules] SURF-001 — bulc_knowledge_search ""

update_materialC

Update a material by ID. [bulc-mcp rules] SURF-001 — bulc_knowledge_search ""

remove_materialB

Remove a material by ID. [bulc-mcp rules] SURF-001 — bulc_knowledge_search ""

add_rampB

Add a time ramp (RAMP) for time-dependent parameters. Points are [time, value] pairs. [bulc-mcp rules] FIRE-008 — bulc_knowledge_search ""

update_rampB

Update an existing ramp with new points.

remove_rampC

Remove a ramp by ID.

add_surfaceA

Add a general surface (&SURF) with material layers, burning behaviour, thermal boundary conditions and injection. This is what gives walls/objects real heat transfer and lets them burn away. [bulc-mcp rules] SURF-001, VENT-005 — bulc_knowledge_search ""

update_surfaceA

Update an existing general surface (&SURF) by ID. Only the given fields change. [bulc-mcp rules] SURF-001 — bulc_knowledge_search ""

remove_surfaceA

Remove a general surface (&SURF) by ID. Objects referencing it fall back to INERT. [bulc-mcp rules] SURF-001 — bulc_knowledge_search ""

list_surfacesB

List all user-defined general surfaces (&SURF) with their layers and burning behaviour. [bulc-mcp rules] SURF-001 — bulc_knowledge_search ""

assign_surfaceA

Assign a surface (SURF_ID) to an obstacle, vent or geometry. Without 'faces' the whole object uses it; with 'faces' only those faces do (SURF_ID6 order -X,+X,-Y,+Y,-Z,+Z). [bulc-mcp rules] GEN-003, SURF-001 — bulc_knowledge_search ""

list_material_libraryB

List built-in material presets (density/conductivity/specific heat/pyrolysis) available to add to the model, optionally filtered by category or search text. [bulc-mcp rules] SURF-001 — bulc_knowledge_search ""

add_material_from_libraryB

Copy a material preset from the built-in library into the model as a &MATL. [bulc-mcp rules] SURF-001 — bulc_knowledge_search ""

add_surface_from_libraryB

Copy a surface preset from the built-in library into the model as a &SURF, pulling in any materials it needs. [bulc-mcp rules] SURF-001 — bulc_knowledge_search ""

list_slcfA

List all slice (SLCF) outputs with id, quantity, plane, and flags.

set_plot3d_outputsB

Set the Plot3D output quantities and species IDs (NUM dialog). Provide up to 5 quantities. [bulc-mcp rules] ASET-004, EVAC-008, OUT-003 — bulc_knowledge_search ""

add_slcfC

Add a slice file output (SLCF). Specify quantity and plane position. [bulc-mcp rules] ASET-001, ASET-004, OUT-002 — bulc_knowledge_search ""

remove_slcfC

Remove a slice file output by ID.

update_slcfC

Update an existing SLCF output by ID. [bulc-mcp rules] OUT-002 — bulc_knowledge_search ""

list_bndfB

List the animated boundary (BNDF) quantities written for solid surfaces.

add_bndfA

Add an animated boundary quantity (&BNDF) such as WALL TEMPERATURE or ADIABATIC SURFACE TEMPERATURE. Use spec_id for species quantities (MASS FLUX, SURFACE DEPOSITION, MPUA_Z, CPUA_Z, AMPUA_Z) and part_id for particle quantities (MPUA, CPUA, AMPUA). The GPU engine records these 7 quantities: WALL TEMPERATURE, WALL HEAT FLUX, NET HEAT FLUX, RADIATIVE HEAT FLUX, CONVECTIVE HEAT FLUX, INCIDENT HEAT FLUX, BACK WALL TEMPERATURE. Any other quantity needs CPU FDS (the GPU engine warns and falls back to WALL HEAT FLUX). WALL HEAT FLUX is a GPU-engine-only name — use NET HEAT FLUX when the deck must also run on CPU FDS. [bulc-mcp rules] OUT-005 — bulc_knowledge_search ""

remove_bndfB

Remove an animated boundary quantity (&BNDF) by QUANTITY (and SPEC_ID/PART_ID when the entry has one).

set_chidA

Set the simulation CHID (Case Heading Identifier) and optional title. Note: when the project is saved, CHID is normalized to the .fds file name (so output files such as .smv match the deck file); a CHID set here only persists until the next save. [bulc-mcp rules] GEN-006, GEN-010, GEN-016 — bulc_knowledge_search ""

preview_fdsA

Render the current project as FDS deck text and return it WITHOUT writing a file (the GUI FDS Preview dialog). Use namelist to show only one group (e.g. "MESH", "SLCF", "OBST", "DUMP") and max_lines to cap the output. This is the fastest way to check that a mesh / output / geometry change lands in the deck the way you expect. [bulc-mcp rules] DEVC-005, DEVC-009, FIRE-013 — bulc_knowledge_search ""

get_object_propertiesB

Get one obstacle's full properties as JSON, including ALL Runtime FDS Properties (fds_override: fire HRRPUA/ramp, detector activation_temp/RTI, sprinkler k_factor/flow, HVAC airflow, fuel/REAC yields, etc.). [bulc-mcp rules] GEN-001, GEN-003, GEO-011 — bulc_knowledge_search ""

get_simulation_metricsA

Get LIVE simulation runtime metrics if a simulation is running: HRR(qdot, kW), Tmax(K), max velocities(umax/wmax), pmax, dt/cfl, step/time, nan count, ms/step, particles, GPU VRAM. Only meaningful in live mode with a running simulation. [bulc-mcp rules] GEN-010, GEN-016, SIM-002 — bulc_knowledge_search ""

get_config_summaryB

Get a summary of the current FDS configuration: domain size, cell count, number of objects, etc. [bulc-mcp rules] GEN-006, GEN-010, GEN-016 — bulc_knowledge_search ""

list_obstaclesB

List all obstacles with their ID, position, and properties. [bulc-mcp rules] GEN-002, GEN-003, GEN-004 — bulc_knowledge_search ""

list_ventsB

List all vents with their ID, surface type, and position. [bulc-mcp rules] GEN-004, TRB-002, VENT-002 — bulc_knowledge_search ""

list_devicesA

List all measurement devices with their ID, quantity, and position — both &DEVC devices and detector objects (heat/smoke detectors, thermocouples, sprinkler and nozzle objects), which are written to the deck as DEVC+PROP. [bulc-mcp rules] DEVC-001, DEVC-003, DEVC-004 — bulc_knowledge_search ""

validate_projectA

Pre-flight check of the whole project before export or run: deck generation, mesh/domain sanity, objects outside the domain, duplicate IDs, dangling SURF_ID / MATL_ID / CTRL INPUT_ID / DEVC references, output intervals larger than T_END (which would store only the t=0 frame), missing OPEN boundary, fire without a reaction fuel, LOCK_TIME_STEP without DT, and sprinkler / spray-profile key combinations FDS 6.10.1 rejects. Returns errors (deck will not run) and warnings (deck runs but the result is probably not what you want). [bulc-mcp rules] DEVC-004, DEVC-005, DEVC-006 — bulc_knowledge_search ""

evac_add_agentB

Add an evacuation agent at a specific position [bulc-mcp rules] EVAC-001 — bulc_knowledge_search ""

evac_add_agents_batchC

Add multiple evacuation agents distributed in a rectangular area [bulc-mcp rules] EVAC-001, EVAC-005 — bulc_knowledge_search ""

evac_remove_agentC

Remove an evacuation agent by ID [bulc-mcp rules] EVAC-001, EVAC-005 — bulc_knowledge_search ""

evac_clear_agentsB

Remove all evacuation agents [bulc-mcp rules] EVAC-001 — bulc_knowledge_search ""

evac_add_stairB

Add a staircase connecting two floors [bulc-mcp rules] EVAC-001, EVAC-006 — bulc_knowledge_search ""

evac_add_waypointC

Add a navigation waypoint for evacuation routing

evac_add_journeyA

Create an evacuation journey (route) with ordered stages. Waypoint ids come from evac_list_summary. End the route with an EXIT stage (it goes to the nearest exit automatically). Floors are joined by stairs automatically — stairs are not journey stages. [bulc-mcp rules] EVAC-006, EVAC-007 — bulc_knowledge_search ""

evac_update_agentC

Update properties of an existing evacuation agent [bulc-mcp rules] EVAC-001 — bulc_knowledge_search ""

evac_update_stairC

Update properties of an existing staircase [bulc-mcp rules] EVAC-001 — bulc_knowledge_search ""

evac_remove_stairB

Remove a staircase by ID [bulc-mcp rules] EVAC-001 — bulc_knowledge_search ""

evac_update_waypointC

Update properties of an existing waypoint

evac_remove_waypointC

Remove a waypoint by ID

evac_update_journeyB

Update an existing evacuation journey

evac_remove_journeyC

Remove an evacuation journey by ID

evac_update_setupB

Update evacuation simulation settings (model, time, timestep)

evac_list_summaryB

Get current evacuation module status summary (read-only) [bulc-mcp rules] EVAC-001, EVAC-002, EVAC-007 — bulc_knowledge_search ""

spr_get_resultsA

Get sprinkler / water-spray results (run spr_run_calc first). With a design calculation: operation (all open / zone deluge), per scenario the actual-source flow and minimum margin, the REQUIRED SOURCE PRESSURE (inverse: every nozzle reaches its own required pressure), design flow, governing nozzle, pump check, warnings. detail = lines (table by line number) | zones | nozzles | pipes for one scenario (default governing) at supply or design point. Also the classic totals (total flow, source pressure, velocity / flow ranges, fitting losses). [bulc-mcp rules] SPR-001, SPR-002, SPR-003 — bulc_knowledge_search ""

spr_add_nodeA

Add a pipe network node (junction, sprinkler, or source). A junction can carry a fitting (elbow/tee/cross/wye/reducer); "auto" (default) detects it from the connected pipes. Node ids are generated by the store — call spr_list_summary to get them. [bulc-mcp] Give heads / terminals a unique label (H1, H2 …, EX1 …): it becomes the FDS id after *_apply_to_fds (GEN-021). [bulc-mcp rules] EVAC-001, SPR-001, SPR-002 — bulc_knowledge_search ""

spr_add_pipeA

Connect two nodes with a pipe. For a floor-to-floor connection use spr_add_riser (exactly vertical) first, then connect horizontally on the upper story [bulc-mcp rules] SPR-002, SPR-008 — bulc_knowledge_search ""

spr_add_sprinkler_headA

Add a sprinkler head to an existing sprinkler node. The head follows a shared spray profile (sprayProfileId, default = project default profile); K / activation temperature / RTI default to that profile. spray / particle override single FDS &PROP / &PART keys for this head only. [bulc-mcp rules] SPR-010, SPR-011 — bulc_knowledge_search ""

spr_add_water_sourceB

Add a water source to an existing source node: city water (static / residual pressure at residual flow), pump (rated flow / rated head / shut-off head or a curve), gravity tank (water level elevation), pressure tank. [bulc-mcp rules] SPR-001 — bulc_knowledge_search ""

spr_remove_nodeA

Remove a pipe node (also removes connected pipes and heads) [bulc-mcp rules] EVAC-001, SPR-002 — bulc_knowledge_search ""

spr_update_pipeA

Update properties of an existing pipe: diameter, pipe standard (C resets to the standard default), Hazen-Williams C, line number, and the inline valve list (replaces all valves; [] removes them; valveDetails sets open/closed, tag, zone). For many pipes use spr_set_pipes; to open/close one valve use spr_set_valves. [bulc-mcp rules] SPR-008, SPR-005, SPR-016 — bulc_knowledge_search ""

spr_update_nodeB

Update properties of an existing pipe network node, including its fitting (auto = detect from connected pipes). [bulc-mcp rules] DEVC-001, EVAC-001, SPR-002 — bulc_knowledge_search ""

spr_insert_fittingA

Insert a fitting into an existing pipe. elbow90 / elbow90_long / elbow45: bend the pipe into an L shape through a new intermediate corner node (route l_x = go along X first, l_y = Y first; elbow45 makes the last leg a 45° diagonal). tee / cross / wye / reducer: split the pipe at position with a new junction node carrying that fitting (then draw branch pipes from it with spr_add_pipe). The new node id is in spr_list_summary. [bulc-mcp rules] EVAC-001, SPR-002, SPR-007 — bulc_knowledge_search ""

spr_add_riserA

Floor-to-floor riser (e.g. 1F → 2F): a perfectly vertical pipe (same x,y, only z changes) from the node up/down to a NEW junction on the target story at targetZ (default: same height above the target story floor as the source node above its own floor). It never attaches to a nearby existing node; only a node at exactly the same position (±1 mm in x,y,z) is reused. Continue the upper network from the new junction (id via spr_list_summary). The riser is a normal pipe — the hydraulic calculation includes its static head ρgΔz and the elbows at its ends. Stories: draw_list_stories / draw_add_story. sameFloor=true makes a vertical pipe on the SAME story instead (drop / rise to targetZ or by dz, e.g. dz=-1.0 for a 1 m drop). [bulc-mcp rules] SPR-009 — bulc_knowledge_search ""

spr_remove_pipeC

Remove a pipe connection by ID

spr_update_sprinkler_headA

Update one pipe-network sprinkler head: K / activation temperature / RTI / type, its shared spray profile (sprayProfileId), per-head spray overrides (spray = &PROP keys, particle = &PART keys, inherit = keys to hand back to the profile, clearSpray = drop all). Applied FDS copies of the head are rebuilt. For many heads or obstacle/DEVC sprinklers use spr_set_head_spray. [bulc-mcp rules] SPR-010, SPR-011 — bulc_knowledge_search ""

spr_remove_sprinkler_headB

Remove a sprinkler head by ID [bulc-mcp rules] SPR-010, SPR-011 — bulc_knowledge_search ""

spr_update_water_sourceA

Update an existing water source (type, city-water pressures, pump rated flow / rated head / shut-off head / curve, tank level). [bulc-mcp rules] SPR-001, SPR-003, SPR-016 — bulc_knowledge_search ""

spr_remove_water_sourceC

Remove a water source by ID [bulc-mcp rules] SPR-001 — bulc_knowledge_search ""

spr_set_defaultsA

Set default pipe diameter, pipe standard and K-factor for new pipes/heads, the project default spray profile, the hydraulic minor-loss options (fittings/valves by NFPA 13 equivalent length, large-size 250-600 mm table), and the DESIGN BASIS: default required pressure per nozzle kind (requiredPressureClosed / requiredPressureOpen, MPa), operation (auto = zone deluge when zones exist / all_open / zone_deluge), includeClosedHeads (false = only open nozzles and drains discharge), drainCd, velocity warning / fail limits. [bulc-mcp rules] SPR-001, SPR-002, SPR-003 — bulc_knowledge_search ""

spr_run_calcA

Run the hydraulic calculation. mode design (default) = scenarios "all" and one per deluge zone, each at the actual water source AND the inverse REQUIRED SOURCE PRESSURE (minimum source pressure so every participating nozzle reaches its own required pressure; drains always open; closed valves exclude pipes) with the governing nozzle and a pump check. mode calc = the classic single forward calculation. Read the results with spr_get_results (next round) — detail lines gives the table by line number. [bulc-mcp rules] SPR-001, SPR-002, SPR-003 — bulc_knowledge_search ""

spr_list_summaryA

Get the sprinkler status (read-only): pipe network nodes / pipes / fittings / risers with ids, sprinkler heads with their spray profile and override count, the spray profile library with usage. include_presets lists spray presets (standard, quick response, ESFR, residential, water mist low/intermediate/high pressure); profile_id returns one profile with every FDS key and the heads using it. [bulc-mcp rules] EVAC-001, SPR-001, SPR-002 — bulc_knowledge_search ""

spr_auto_layoutA

Automatically build a complete, calculable sprinkler pipe network in a rectangular area: a water source node (city water) at the (xMin, yMin) corner, a cross-main along x = xMin, one branch line per row, sprinkler nodes on a grid with heads, and every connecting pipe. Follow with spr_run_calc and spr_apply_to_fds to put the sprinklers into the FDS model. [bulc-mcp rules] SPR-001, SPR-002, SPR-003 — bulc_knowledge_search ""

spr_set_nozzlesA

Set nozzle data on many pipe-network nozzles at once — choose them with all / headIds / nodeIds / zone / lineNo / kind (filters combine). Sets kind (closed sprinkler | open nozzle | drain), K, the REQUIRED DISCHARGE PRESSURE per nozzle (MPa; clearRequiredPressure = back to the design default), zone (deluge zone), lineNo, disabled, nozzleModel, drain orifice diameter (K recalculated). One undo step. [bulc-mcp rules] SPR-010, SPR-011, SPR-017 — bulc_knowledge_search ""

spr_set_valvesA

Open / close valves (closed valve → that pipe is excluded from the calculation, downstream is isolated) and set their tag or zone (zone valve = open only in the "all" scenario and its own zone scenario). Choose with pipeId (+ index, default all valves on the pipe), tag, or zone. [bulc-mcp rules] SPR-008, SPR-022 — bulc_knowledge_search ""

spr_add_drainA

Add a drain hole (always-open orifice, flow = K√P, no required pressure): on a pipe at position (splits it with a new branch node), on an existing node, or at a free point. K defaults to the project nozzle K (drain hole = sprinkler orifice); orificeDiameterMm converts with Cd 0.62. [bulc-mcp rules] SPR-023 — bulc_knowledge_search ""

spr_set_pipesA

Change many pipes at once: choose all / pipeIds / lineNo / runOf (the run through that pipe up to branches); set the pipe standard (material, C resets unless keepC), Hazen-Williams C, line number. One undo step per change. Out-of-standard sizes keep their size (inner diameter = nominal) and are reported. [bulc-mcp rules] SPR-003, SPR-005, SPR-021 — bulc_knowledge_search ""

spr_upsert_spray_profileA

Create, update or delete a shared SPRAY PROFILE — the FDS 6.10.1 &PROP+&PART template (flow, spray pattern, droplet size distribution, breakup, drag, evaporation, surface film, parcels) that sprinkler and water-mist heads reference. Omit id (or give a new id) to create: it starts from preset (default std_pendant_k80) or copy_from. With an existing id, preset overwrites its values, prop/part merge keys and unset_prop/unset_part return keys to the FDS default. Presets: standard, quick response, ESFR, residential, water mist low (12 bar) / intermediate (21 bar) / high (70-100 bar) — spr_list_summary {include_presets:true}. assign_to links heads to the profile (pipe heads take its K, activation temperature and RTI). Every edit is checked like FDS (K or pressure alone = ERROR 238, no DIAMETER = 214, equal SPRAY_ANGLE = 231, bad EVAP_MODEL = 224) for the profile and every head using it; on error nothing changes. Per-head overrides: spr_set_head_spray.

spr_set_head_sprayA

Set per-head spray settings on one or many sprinkler heads — pipe-network heads, obstacle sprinklers and DEVC sprinklers alike (the GUI spray dialog "this head only" path). Pick heads with all / group (interlock or deluge group) / network_of_node / head_ids / node_ids / obstacle_ids / device_ids. profile_id links them to a shared profile (pipe heads take its K, activation temperature and RTI unless keep_head_values). prop / part override single FDS keys for these heads only; inherit lists keys to hand back to the profile (prop/part keys or orientation, rotation, pipe_index, activation); reset drops every override. orientation / rotation / pipe_index / activation are DEVC values. head_type applies to pipe heads (upright still sprays down). All heads are checked first; if any would be an FDS error nothing changes. Pipe heads whose K changed need spr_run_calc then spr_apply_to_fds. [bulc-mcp rules] DEVC-001, SPR-010, SPR-011 — bulc_knowledge_search ""

spr_apply_to_fdsA

Apply the hydraulic pipe-network sprinklers to the FDS model: for every sprinkler node (with a head and calc results from spr_run_calc), creates/replaces DEVC (SPRINKLER LINK TEMPERATURE) + PROP + PART entries using the calculated nozzle flow and pressure. Run spr_run_calc first. [bulc-mcp rules] DEVC-001, SPR-001, SPR-002 — bulc_knowledge_search ""

spr_analyze_drawingA

Read a sprinkler / water-spray piping drawing (.dxf, .dwg, .pdf, .zip of drawings, .png/.jpg) and recognise a candidate pipe network. Isometric (ISO) drawings: scale from DIMENSION entities, pipe linetype, bends, flange/valve gaps bridged, nozzle stems, line-number / reducer / valve labels, 3D reconstruction (X,Y horizontal, Z up, inlet = origin), nominal sizes from labels and flange rings. Plan drawings: pipe layers + head symbols at one height. Returns a summary with candidateId, open ends (drain candidates), reference (dashed, other-system) labels, exclusion hints, runs and ambiguities to ask the user about. Attached chat files arrive as "[첨부 도면] name path=… candidateId=…". PDFs with outlined text set needsVision (read the page image instead). show=segments|nodes|runs|tags|components lists details (ids, offset, limit, component). Then call spr_import_network. [bulc-mcp rules] DRW-006 — bulc_knowledge_search ""

spr_import_networkA

Create the recognised (or a hand-written) pipe network in the sprinkler module in ONE undo step: nodes, pipes (nominal size, pipe standard, C, line number, valves), nozzles (kind closed|open|drain, K, required pressure, zone, line), drains and the water source. From a drawing: candidateId (+ components, excludeSegments/Nodes/Lines/Runs, source, defaults, drains, nozzleOverrides, zoneByLine/Run/Component, valves, placement). Hand-written: network = {version:1, units:"m", nodes:[{ref,x,y,z}], pipes:[{from,to,diameter,lineNo}], heads:[{node,kind,kFactor,requiredPressure,zone}], sources:[{node,sourceType,…}]}. Water-spray ISO nozzles default to open K80 (project default: general K80, zone deluge — confirm with the user). Validates first (nothing changes on error); dryRun only reports. scriptPath saves the payload JSON (re-import later). mode append (default) | replace. Then spr_run_calc. [bulc-mcp] mode='replace' replaces the current pipe network; call with dryRun=true first (DRW-009).

spr_export_resultsA

Write the sprinkler / water-spray design results to files: format csv = 5 tables (summary, zones, lines by line number, nozzles, pipes; UTF-8 BOM), fhc = FHC (Canute) calculation-sheet style CSVs (report, heads, pipes, summary, lines, NFPA worksheet, node map), both. scenario = "all" | "zone:" (default governing scenario), at = supply (actual source) | design (inverse design point). zip=true also writes one zip per format. language = header language (ko default). Uses the current design results or recalculates them. fhcDraft=true adds the FHC project-file draft (.FHC) and pipe data table draft (.PDT) to the FHC files (check them in FHC before use). The FHC files include _bulc_model.csv, which spr_import_fhc_bundle reads back exactly. [bulc-mcp] Writes files on this PC at the path you give. [bulc-mcp rules] SPR-001, SPR-002, SPR-003 — bulc_knowledge_search ""

spr_pump_sizingA

Pump specification for the sprinkler / water-spray network (deterministic). mode from_design (default): from the design calculation (per deluge zone or all-open) → rated flow and pressure with a safety margin, the points the pump curve must pass, NFPA 20 checks (churn ≤ 140 %, ≥ 65 % at 150 % flow), NFPA 20 standard capacity, hydraulic / shaft power and motor kW, NPSHa, pump type, governing zone and nozzle, governing-path losses and re-solved what-if hints (nozzle K −10 %, upsizing the bottleneck, closing drains, valve loss). mode target: a target flow and/or pressure at the source node. mode check_curve: check the network pump curve or a given curve. apply=true writes the proposed curve to the water source (then spr_run_calc). [bulc-mcp rules] SPR-001, SPR-003, SPR-030 — bulc_knowledge_search ""

spr_design_reviewA

Specification and design-error review of the sprinkler / water-spray network and its design results (deterministic). Checks: pipe pressure rating by standard (KS D 3507 1.2 MPa NFTC 103, SGP, B31.1 wall formula, CuNi/GRE ratings), valve / flange class (JIS 5K/10K/16K/20K, PN, ASME class from valve std/tag), velocities vs limits, nozzles below required / above max pressure, imbalance, drains, closed valves isolating nozzles, disconnected / orphan / dead-end / coincident nodes, zero-length or duplicate pipes, expansion against flow, tee imbalance, high-loss valves, standards / sizes / C / K / required pressure data, zones and zone valves, stories and risers, pump curve NFPA 20 and run-out. Each finding: severity, category, location, message, suggested fix, ids. [bulc-mcp rules] SPR-001, SPR-002, SPR-003 — bulc_knowledge_search ""

spr_import_fhc_bundleA

Load a BULC "FHC-style" export bundle back (zip, folder of CSVs, or *_bulc_model.csv). mode check (default) changes nothing: compares the bundle network and settings field by field with the CURRENT network, recalculates the bundle network and compares with the results written in the file (nozzle flows / pressures, required source pressure, summary). mode apply replaces the current pipe network with the bundle (undo history cleared, like opening a file) and runs the design calculation. Older bundles without bulc_model can only be partly restored (allowPartial). This is NOT an importer for files saved by the FHC (Canute) program. [bulc-mcp rules] SPR-001, SPR-002, SPR-003 — bulc_knowledge_search ""

hvac_get_resultsA

Get HVAC airflow calculation results (run hvac_run_calc first): total supply/exhaust flow, duct velocity / terminal flow ranges. [bulc-mcp rules] HVAC-001 — bulc_knowledge_search ""

hvac_add_nodeA

Add an HVAC node (junction, supply_diffuser, exhaust_grille, or fan) [bulc-mcp] Give heads / terminals a unique label (H1, H2 …, EX1 …): it becomes the FDS id after *_apply_to_fds (GEN-021). [bulc-mcp rules] EVAC-001, GEN-021 — bulc_knowledge_search ""

hvac_add_ductC

Connect two HVAC nodes with a duct

hvac_add_supply_diffuserB

Add a supply diffuser to an existing supply node [bulc-mcp rules] HVAC-001 — bulc_knowledge_search ""

hvac_add_exhaust_grilleB

Add an exhaust grille to an existing exhaust node [bulc-mcp rules] HVAC-001 — bulc_knowledge_search ""

hvac_add_air_handlerA

Add an air handler unit (AHU) to an existing fan node

hvac_remove_nodeB

Remove an HVAC node (also removes connected ducts and equipment) [bulc-mcp rules] EVAC-001 — bulc_knowledge_search ""

hvac_update_ductB

Update properties of an existing duct

hvac_update_nodeB

Update properties of an existing HVAC node [bulc-mcp rules] EVAC-001, GEN-021, HVAC-002 — bulc_knowledge_search ""

hvac_remove_ductC

Remove a duct connection by ID

hvac_update_supply_diffuserB

Update properties of an existing supply diffuser [bulc-mcp rules] HVAC-001, HVAC-003 — bulc_knowledge_search ""

hvac_remove_supply_diffuserB

Remove a supply diffuser by ID [bulc-mcp rules] HVAC-001 — bulc_knowledge_search ""

hvac_update_exhaust_grilleA

Update properties of an existing exhaust grille [bulc-mcp rules] HVAC-001, HVAC-003 — bulc_knowledge_search ""

hvac_remove_exhaust_grilleC

Remove an exhaust grille by ID [bulc-mcp rules] HVAC-001 — bulc_knowledge_search ""

hvac_update_air_handlerC

Update properties of an existing air handler unit

hvac_remove_air_handlerC

Remove an air handler unit by ID

hvac_set_defaultsB

Set default duct shape, diameter, and material for new ducts [bulc-mcp rules] HVAC-001 — bulc_knowledge_search ""

hvac_run_calcA

Run HVAC airflow calculation on the current duct network [bulc-mcp rules] HVAC-001, HVAC-003 — bulc_knowledge_search ""

hvac_list_summaryA

Get current HVAC network status summary (read-only) [bulc-mcp rules] HVAC-001, GEN-008, GEN-021 — bulc_knowledge_search ""

hvac_apply_to_fdsA

Apply the HVAC duct network to the FDS model: every supply_diffuser / exhaust_grille node becomes a small HVAC obstacle whose bottom face blows (SUPPLY) or sucks (EXHAUST) the terminal airflow. Uses the flow from hvac_run_calc when available, otherwise the design CFM of the diffuser/grille. Re-running replaces the previous ones. [bulc-mcp rules] HVAC-001, GEN-021, HVAC-003 — bulc_knowledge_search ""

draw_add_storyB

Add a new building story (floor level) [bulc-mcp rules] EVAC-001, GEO-002 — bulc_knowledge_search ""

draw_update_storyB

Update a story name or height [bulc-mcp rules] EVAC-001, GEO-002 — bulc_knowledge_search ""

draw_set_wall_paramsB

Set default wall height and thickness for 2D drawing [bulc-mcp rules] EVAC-001, GEO-002 — bulc_knowledge_search ""

draw_set_door_paramsB

Set default door dimensions [bulc-mcp rules] EVAC-001, GEO-002 — bulc_knowledge_search ""

draw_set_window_paramsB

Set default window dimensions [bulc-mcp rules] EVAC-001, GEO-002 — bulc_knowledge_search ""

draw_remove_storyC

Remove a building story by ID [bulc-mcp rules] EVAC-001, GEO-002 — bulc_knowledge_search ""

draw_list_storiesB

Get current building stories list (read-only) [bulc-mcp rules] EVAC-001, GEO-002 — bulc_knowledge_search ""

list_furniture_catalogB

List available furniture items. Filter by category or keyword search.

get_furniture_infoA

Get detailed information about a specific furniture item (dimensions, fire data, fuel)

place_furnitureA

Place a furniture/item at a position. Doors and windows (doors_windows category) auto-snap to the nearest wall and create a wall opening (hole), exactly like the GUI. Items with fire data are placed as fire sources automatically. Changes reflect to the 2D/3D view immediately. [bulc-mcp rules] EVAC-002, FIRE-001, FIRE-002 — bulc_knowledge_search ""

result_get_stateA

Get the result viewer current state: active dataset, current time, colormap, legend range, playback, particles, view-lock, graph probe count. Read this before setting values.

result_set_view_lockedB

Lock/link the result view for side-by-side compare (true = linked).

result_add_graph_probeB

Add a graph probe to extract time-series data. type=point needs xyz; type=line needs start & end. slot: primary or compare.

result_clear_graph_probesB

Remove all graph probes.

result_set_timeB

Set the result viewer playback time (seconds).

result_toggle_playbackB

Toggle play/pause of the result animation.

result_set_playback_speedB

Set result animation playback speed (1.0 = real-time).

result_set_colormapC

Set the result colormap. name: 'turbo'|'jet'|'inferno'|'viridis'|'grayscale'.

result_set_legend_rangeB

Set the result colorbar (legend) min/max range. Use null for auto.

result_set_active_datasetA

Select the active result dataset by id. Node id shapes: slcf- (slice), pl3d-var- (3D data), s3d- (smoke), bndf- (boundary surface, .bf), prt5- (particles), csv-hrr / csv-devc (time series).

result_set_particlesC

Configure particle rendering in the result viewer.

shape_new_documentA

Shape Studio: start a new empty shape document (discards current shape tree).

shape_get_treeA

Shape Studio: get the current feature tree (nodes, params, roots, bounding boxes). Call this to see what exists before editing.

shape_add_boxA

Shape Studio: add a box. Origin = bottom-face center, z-up, metres. Optional at=[x,y,z] placement and rotate_deg=[rx,ry,rz].

shape_add_cylinderB

Shape Studio: add a cylinder (axis along z, origin = bottom center, m).

shape_add_sphereC

Shape Studio: add a sphere (origin = bottom tangent point, m).

shape_add_coneB

Shape Studio: add a cone/frustum (r1=bottom radius, r2=top radius, axis z, m).

shape_add_torusC

Shape Studio: add a torus lying in the xy plane (r=ring radius, tube=tube radius, m).

shape_add_wedgeB

Shape Studio: add a right-angle wedge (ramp). Base w×d, height h; slope descends along +x. (m)

shape_add_polygon_prismB

Shape Studio: extrude a 2D polygon (xy plane, CCW) along z by height — like FreeCAD Sketch+Pad. points=[[x,y],...] (m).

shape_extrude_sketchA

Shape Studio (SketchUp-style): draw closed 2D loops on ANY plane and extrude them along the plane normal. plane = {origin:[x,y,z], normal:[nx,ny,nz], x_axis:[ax,ay,az]} (x_axis ⟂ normal; y = normal × x_axis); loops = [[[u,v],...], ...] in plane coords, even-odd fill so inner loops become holes. distance (m, sign = along/against normal). mode "new" makes a separate solid; "add"/"cut" fuses into / carves out of target_id (the result replaces target in the tree). Booleans are watertight (manifold kernel), so coplanar faces are fine.

shape_push_pullA

Shape Studio (SketchUp Push/Pull): pick a flat face of node_id and push it in (negative distance → carves) or pull it out (positive → extends the solid). The face is the whole coplanar region reached from the triangle whose outward normal matches face ("+x","-x","+y","-y","+z","-z" or [nx,ny,nz]); point [x,y,z] selects among several faces facing that way (nearest wins), otherwise the outermost one. Works on any node, including results of earlier push/pulls and booleans. Example: box then shape_push_pull(face:"+z", distance:0.5) raises the top by 0.5 m.

shape_add_revolveB

Shape Studio: revolve a half-profile around the z axis — like FreeCAD Revolution. points=[[radius,z],...] radius>=0, top-to-bottom order. angle_deg default 360.

shape_add_archA

Shape Studio: add an ARCHED / VAULTED / SEMICIRCULAR ceiling (barrel vault, dome-roof tunnel) in ONE call — a curved shell whose inner surface is a circular arc of clear width span and inner height rise above the springing line (rise = span/2 → semicircle; smaller → shallow segmental arch), extruded length metres along axis. Use this whenever the user asks for a round/arched/curved/semicircular ceiling or tunnel roof instead of composing primitives. Placement: start = coordinate along the axis where the arch begins, center = transverse coordinate of the arch centre line, z_base = height of the springing line (0 = arch rises from the floor; for a room use the wall-top height). Afterwards export it with shape_export_geom (exact curved &GEOM for the cut-cell solver) or shape_export_obst (voxelised). Units: metres.

shape_booleanB

Shape Studio: boolean of nodes. union=merge all; subtract=first minus rest; intersect=common volume. Input nodes are consumed into the result.

shape_transformA

Shape Studio: wrap a node with translate/rotate/scale. To move an existing shape, prefer shape_set_params on its transform node if it has one.

shape_mirrorA

Shape Studio: mirror a node across a plane ('xy'|'yz'|'xz', offset = plane position). keep_original default true (result = original + mirrored union).

shape_arrayB

Shape Studio: repeat a node. linear: step=[dx,dy,dz] per copy. polar: rotate copies around a z-parallel axis at axis_point=[x,y], total angle_deg (default 360).

shape_hullC

Shape Studio: convex hull of the given nodes (blob/rounded forms).

shape_set_paramsA

Shape Studio: change parameters of an existing node — everything downstream recomputes automatically (parametric). e.g. {id:"s3", params:{r:0.4}} or {params:{translate:[1,0,0]}} on a transform node.

shape_edit_nodeA

Shape Studio: rename / show-hide / assign FDS SURF / set color / mark fire faces + fire properties of a node. fire_faces: 6 booleans in FDS SURF_ID6 order [-X,+X,-Y,+Y,-Z,+Z] OR face-name strings like ["-Z"] ("bottom"/"top" aliases ok); [] clears. Fire faces render as red hatching in the viewport and are wired to a FIRE SURF (+ RAMP_Q / &REAC) on shape_export_obst. Fire properties (merged individually, unspecified keys keep their previous value): fire_hrrpua, fire_tmp_front (°C), fire_ramp_points ([[t_seconds, fraction_0..1], ...] HRR time curve), fire_fuel_type, fire_soot_yield, fire_co_yield, fire_radiative_fraction, fire_ext_coeff. ONE FIRE OBST PER DOCUMENT: fire faces may exist on only one shape — assigning them to another node automatically clears the previous node's fire faces. PLAN FIRST: real FDS can only apply a fire SURF to a FLAT face (never a curved or stepped one), so setting fire_faces without plan_confirmed changes nothing (the fire_* properties in the same call are dropped too) and returns a 6-direction flatness analysis instead — discuss it with the user, agree on which flat face, HRRPUA, RAMP and combustion properties, then call again with plan_confirmed=true.

shape_delete_nodeB

Shape Studio: delete a node. with_inputs (default true) also deletes its consumed input subtree.

shape_undoB

Shape Studio: undo the last document mutation.

shape_import_meshA

Shape Studio: import an STL or OBJ file as a mesh node (metres). y_up=true if the file is Y-up (converted to Z-up). For GLB/FBX use the Shape Studio UI import button.

shape_export_obstA

Shape Studio → FDS: voxelize the shape (node_id, or union of all visible roots) and add it to the model as an obstacle with voxel geometry. Recommended: align_to_mesh=true — voxels then use the project MESH cell size and sit exactly on FDS cell boundaries (no ±1 cell snapping). Otherwise voxel_size (m, e.g. 0.1) or per-axis cell [dx,dy,dz]. voxel_mode "shell" voxelizes only the surface (hollow meshes such as hoods, ducts, funnels, open imported STL); default "solid" fills the inside. origin optionally repositions the bbox min corner in the domain (breaks mesh alignment). [bulc-mcp rules] GEN-003, GEO-009, GEO-010 — bulc_knowledge_search ""

shape_export_geomA

Shape Studio → FDS cut-cell: export the exact CSG mesh as an &GEOM triangulated surface — no voxelization, so slopes and curves keep their true shape instead of being stair-stepped like shape_export_obst. Only a watertight surface is exported: primitives, hull, array, mirror and non-overlapping unions are fine, but an OVERLAPPING boolean (union/subtract/intersect) always leaves an open seam the CSG library cannot close, so the export is refused — voxelize those with shape_export_obst instead. Needs a GPU engine build with cut-cell support; older engines parse &GEOM but ignore it. Fire (HRRPUA) on a GEOM surface is not supported yet — use shape_export_obst for the burner. Units m, z-up. Default: every visible root, each keeping its own SURF; origin repositions the bbox min corner. [bulc-mcp rules] GEO-010 — bulc_knowledge_search ""

shape_export_stlA

Shape Studio → CFD (OpenFOAM etc.): export the exact CSG mesh as STL (no voxelization). ascii=true for text STL with solid name (snappyHexMesh patch name). Units m, z-up. [bulc-mcp] Writes files on this PC at the path you give.

shape_export_objA

Shape Studio → CFD: export the exact CSG mesh as OBJ (no voxelization). Units m, z-up. [bulc-mcp] Writes files on this PC at the path you give.

shape_register_itemA

Shape Studio: voxelize the shape and register it as a reusable library item (furniture/item catalog). It then appears in the Item panel and can be placed like any furniture. Optionally set FDS fire properties at the same time.

shape_set_item_fds_propsA

Item library: set FDS fire/material properties on a registered item (shown via the item panel's 'Library FDS Properties' button and applied when the item is placed). Sets a 'fire' preset override.

shape_get_item_fds_propsB

Item library: read the FDS properties and metadata of a registered item.

shape_screenshotA

Shape Studio: capture a screenshot of the running GUI (Shape Studio opens automatically) so you can visually REVIEW the shape you built. Returns a PNG file path — read the image, compare against reference photos, then fix with shape_set_params. select_node opens that node in the property panel first (e.g. to review fire faces / HRR chart). Live GUI mode only. [bulc-mcp] Writes files on this PC at the path you give.

shape_preview_voxelsA

Shape Studio: switch the viewport into FDS voxel preview mode — it shows exactly what the shape becomes once voxelized into FDS OBST boxes (including the fire faces). size = voxel edge in metres (default 0.1), off=true returns to the smooth CSG view. Call this before shape_screenshot to review the FDS result rather than the ideal mesh. GUI only (no effect headless). [bulc-mcp rules] GEO-009 — bulc_knowledge_search ""

project_infoA

Read the open project: file path, unsaved changes, CHID, deck path used for runs, stories (id, name, zMin, height, EVAC floorIndex), domain and mesh cells, object counts per module. Call this first in a session and after project_open. Read-only. [bulc-mcp rules] EVAC-002, GEN-006, GEN-010 — bulc_knowledge_search ""

project_openA

Open a .bulc project or a .fds deck in the running BULC app (same as File > Open, including evacuation, drawing, sprinkler and HVAC side files). path must be absolute. Refuses when the open project has unsaved changes unless discard_unsaved=true (ask the user first). Live app only. [bulc-mcp] discard_unsaved=true throws away unsaved edits — ask the user first (GEN-014). [bulc-mcp rules] GEN-006, GEN-010, GEN-016 — bulc_knowledge_search ""

project_saveA

Save the open project as a .bulc bundle (.bulc + .fds + _evac.json + _spr.json + _hvac.json) like File > Save. Without path it saves to the current .bulc file. A new path must end with .bulc; an existing file is only replaced with overwrite=true. Saving renames CHID to the file name (GEN-009) — result files follow it. Live app only. [bulc-mcp] Writes files on this PC; overwrite=true only after the user agreed (GEN-014). [bulc-mcp rules] GEN-006, GEN-010, GEN-016 — bulc_knowledge_search ""

project_newA

Start a new empty project in the running app (File > New): clears geometry, evacuation, sprinkler, HVAC and drawing state. Refuses when there are unsaved changes unless discard_unsaved=true. Live app only. [bulc-mcp] discard_unsaved=true throws away unsaved edits — ask the user first (GEN-014). [bulc-mcp rules] GEN-006, GEN-010, GEN-016 — bulc_knowledge_search ""

project_export_fdsA

Write the current model as an FDS 6.10.1 input deck (.fds) to path (absolute, must end with .fds). CHID becomes the file name. Refuses to replace an existing file unless overwrite=true. To only read the deck use preview_fds. Live app only. [bulc-mcp] Writes files on this PC; overwrite=true only after the user agreed (GEN-014). [bulc-mcp rules] GEN-006, GEN-010, GEN-016 — bulc_knowledge_search ""

project_undoA

Undo the last model edit(s) of the fire model (obstacles, holes, vents, devices, settings …) like Ctrl+Z. steps 1–20 (default 1). Sprinkler/HVAC/evacuation module edits have their own tools. [bulc-mcp rules] GEN-006, GEN-010, GEN-016 — bulc_knowledge_search ""

project_redoA

Redo model edits undone with project_undo (Ctrl+Y). steps 1–20 (default 1). [bulc-mcp rules] GEN-006, GEN-010, GEN-016 — bulc_knowledge_search ""

get_conventionsA

Units, coordinate axes, story / floorIndex numbering, id rules and file conventions used by the BULC tools (they differ between modules — read this before building a model from a drawing). topic = units | coordinates | floors | ids | files | aset | all (default all). Read-only. [bulc-mcp rules] GEN-006, GEN-010, GEN-016 — bulc_knowledge_search ""

fds_apply_textA

Apply an edited FDS deck to the project: send the complete .fds text (start from preview_fds, edit, send back). The deck is parsed and compared section by section with the current model; only changed sections (meshes, obstacles, vents, devices, controls, dump …) are applied, untouched sections keep their app metadata (changed sections are replaced by the parsed values). dryRun (default true) only reports the changed sections. sections limits which top-level sections may change. Nothing changes on a parse error. [bulc-mcp rules] GEN-006, GEN-010, GEN-016 — bulc_knowledge_search ""

sim_preflightA

Pre-run check with structured results: every issue carries a knowledge-pack rule id (e.g. OUT-001, VENT-001, MESH-002). Combines validate_project, the run dialog deck checks (output intervals ≥ T_END, deck reference errors CPU FDS rejects, fires outside the mesh, spray keys the chosen GPU solver ignores, LOCK_TIME_STEP stability hint) and grid resolution advice (D*/dx from the peak HRR). ok=false means do not run. solver = gpu (default) | gpu_cutcell | cpu_openmp. Read-only. [bulc-mcp rules] GEN-006, GEN-010, GEN-016 — bulc_knowledge_search ""

sim_startA

Start the fire simulation in the running app after the user agreed (confirm=true required). Runs sim_preflight first and refuses on errors (force=true only if the user explicitly accepts). The deck is written next to the saved project (.bulc → .fds, like the toolbar RUN) or, for an unsaved project, to Documents/bulc_/. Refuses while another run is active. solver = gpu (default) | gpu_cutcell | cpu_openmp; restart=true resumes from the checkpoint. Then poll sim_status. Live app only. [bulc-mcp] Starts the solver (GPU for minutes to hours): sim_preflight, summary, the user's go-ahead first (GEN-016). [bulc-mcp rules] GEN-006, GEN-010, GEN-016 — bulc_knowledge_search ""

sim_statusA

Status of the current / last fire simulation of this app session: running or finished, exit code, simulated time vs T_END (percent, ETA), step, dt, CFL, HRR (kW), Tmax (K), max velocity, NaN count, health flags (nan=0, Tmax ≤ 2500 K, |u| < 50 m/s) and sprinkler / detector activation times read from the engine log. Read-only. [bulc-mcp rules] GEN-010, GEN-016, SIM-002 — bulc_knowledge_search ""

sim_stopA

Stop the running fire simulation (confirm=true). mode graceful (default) writes .stop so the engine finishes its output files and a restart checkpoint; mode kill ends the process at once (results may be incomplete). Live app only. [bulc-mcp rules] GEN-016, SIM-002 — bulc_knowledge_search ""

sim_log_tailA

Last lines of the engine console output of the current / last run (lines ≤ 500, default 60). grep = optional regular expression filter. Read-only. [bulc-mcp rules] GEN-016, SIM-002 — bulc_knowledge_search ""

results_detectB

Find the result files of a deck (named by its &HEAD CHID, next to the .fds): .smv, _hrr.csv, _devc.csv, _ctrl.csv, .out, and list the slice planes (quantity + plane), Plot3D times / quantities, Smoke3D, boundary and particle files. Read-only. [bulc-mcp rules] GEN-010, ASET-004 — bulc_knowledge_search ""

fire_results_summaryA

Summarise a finished (or running) fire simulation from its result files: peak HRR and time, total heat released (MJ), radiative fraction, last simulated time vs T_END, every device column (max, time of max, final, unit), first time each device with a setpoint reached it, sprinkler / detector activation times from the engine log of this session, and the available output files. Read-only. [bulc-mcp rules] FIRE-001, GEN-010, ASET-005 — bulc_knowledge_search ""

fire_timeseriesA

Time series from the result CSV files: file = hrr (HRR, Q_RADI, MLR …) | devc (device ids) | ctrl. columns = column names (default the first 6). t0 / t1 limit the time window; maxPoints ≤ 500 (default 300 — longer series are reduced by time-averaging). Read-only. [bulc-mcp rules] FIRE-001, GEN-010 — bulc_knowledge_search ""

fire_compute_asetA

Available safe egress time (ASET) at breathing height: for each point (default: every user exit — OPEN vents, door items, Door_/Window_ holes) the time series at floor + samplingHeight (default 1.8 m) is read from horizontal slices (preferred) or Plot3D and compared with the criteria (default temperature 60 °C, visibility 5 m, CO 1,400 ppm, O2 15 %, CO2 5 %; same as the app ASET report). Returns ASET per point, the governing criterion, a lower bound when no criterion is exceeded, and which quantities are missing (then add output_add_tenability_slices and re-run). points[].floorZ = floor elevation of that point (or story = story id). Read-only. [bulc-mcp rules] GEN-010, ASET-001, ASET-004 — bulc_knowledge_search ""

output_add_tenability_slicesA

Add the horizontal slices the ASET check needs at floor + height (default 1.8 m) on every story (or the given story ids / absolute z): TEMPERATURE, VISIBILITY and VOLUME FRACTION of OXYGEN, CARBON DIOXIDE, CARBON MONOXIDE (quantities can be limited). Existing identical slices are skipped. Run before sim_start (OUT-006, ASET-004). [bulc-mcp rules] ASET-001, ASET-004 — bulc_knowledge_search ""

capture_viewA

Screenshot of the running app for visual checking: view = current (default) | 2d (plan of a story) | 3d | result (result viewer) | shape (Shape Studio). story = story id to show in 2D. region = viewport (default, only the drawing area) | window. Returns the PNG as an image (and its path); savePath (absolute .png) also keeps a copy. Live app only. [bulc-mcp] Returns the picture as an image; savePath also writes a PNG on this PC. [bulc-mcp rules] GEN-006, GEN-010, GEN-016 — bulc_knowledge_search ""

evac_runA

Run the evacuation simulation in the running app after the user agreed (confirm=true): builds the same engine input as the EVAC run dialog (agents, exits = OPEN vents / door items / Door_·Window_ holes, walls, stairs → multi-level mode, waypoints, journeys, FED and alarm settings) and starts the engine in the background. Refuses with no agents, and with no user-defined exits unless allowNoExits=true (the engine would then use temporary exits at the domain edges). Poll evac_status, then read evac_get_results. Live app only. [bulc-mcp] Starts the evacuation engine after the user agreed; outputFolder also writes the result there (EVAC-004). [bulc-mcp rules] EVAC-004 — bulc_knowledge_search ""

evac_statusB

Status of the current / last evacuation run of this app session: running or finished, percent, last engine message, error, result summary. Read-only. [bulc-mcp rules] EVAC-004 — bulc_knowledge_search ""

evac_stopA

Stop the running evacuation simulation (confirm=true). No result is kept. Live app only.

evac_get_resultsA

Summary of the last evacuation result in the project (never the raw trajectories): agents, evacuated / remaining, last exit time (the RSET shown in the app), mean and p50/p90/p95 exit times, evacuation start delay from the alarm chain, FED casualties and their causes, and per-exit counts, first/last times and flow (persons/s/m; each agent is assigned to the exit nearest to its last position). detail = summary (default) | exits | agents (agents lists exit times, limit ≤ 500). Read-only. [bulc-mcp rules] GEN-010, ASET-005, EVAC-004 — bulc_knowledge_search ""

arch_analyze_drawingA

Read an architectural floor plan (.dxf, .dwg via the bundled converter, vector .pdf, or an image) and recognise the building: units and scale (DXF $INSUNITS, dimension values, PDF scale text), layer roles, wall centrelines with thickness (double-line or single-line walls), doors (swing arcs / door blocks), windows (window layers / blocks), columns, stair areas, room names and story labels. Returns candidateId, a summary and questions to confirm with the user (DRW-001…003). Images and outlined PDFs return needsVision — then read the picture yourself and call arch_import_floorplan_report. show = walls | openings | columns | rooms | levels | layers lists details (offset, limit, ids). Read-only; the file is read on this PC only. [bulc-mcp rules] DRW-004 — bulc_knowledge_search ""

arch_import_buildingA

Create the building on one story in ONE undo step: walls as obstacles (axis-aligned box per wall, diagonal walls stair-stepped like the 2D editor), doors as holes 'Door_n' (also evacuation exits) and windows as holes 'Win_n' at sill height (not exits), optional columns and slabs. Source: candidateId from arch_analyze_drawing (exclude walls / openings by id) or building = {walls:[{start:[x,y],end:[x,y],thickness?,height?}], doors:[{at:[x,y]|wall:n,position:0..1,width?,height?}], windows:[{at|wall,position,width?,sill?,height?}], columns:[{xb:[x1,x2,y1,y2]}|{center,size}]} in metres; wall:n counts from 1 in the order of building.walls (openings that cannot be placed are listed in warnings). story = story id (default current story; z = its zMin, wall height = its height). dryRun defaults to TRUE — report first, confirm with the user, then call again with dryRun:false. mode append (default) | replace (removes what an earlier import with the same idPrefix created).

arch_import_floorplan_reportA

Build walls / doors / windows from YOUR reading of a floor-plan picture (image or outlined PDF page — use when arch_analyze_drawing says needsVision). report = {building_width_m (real width of the outer walls), wall_height_m?, wall_thickness_m?, walls:[{x1,y1,x2,y2}] wall CENTRELINES in normalised image coordinates 0..1 (origin top-left, y down; split at corners, skip dimension lines, text, furniture, hatching), doors:[{x,y,width_m?}], windows:[{x,y,width_m?,sill_m?,height_m?}]}. image = {width,height} pixels (or imagePath) for the aspect ratio. The app converts the report with fixed rules (snap to horizontal/vertical, y flipped, origin at the lower-left wall corner) and creates the same objects as arch_import_building. Needs no AI key in the app. dryRun defaults to TRUE. [bulc-mcp rules] DRW-008, DRW-004 — bulc_knowledge_search ""

Prompts

Interactive templates invoked by user choice

NameDescription
bulc-start연결 확인 → 프로젝트 요약 → 핵심 규칙 → 목표 확인. Check the connection, read the project, recall the core rules and ask for the goal.
drawing-to-fire-aset평면도(DWG/DXF/PDF/이미지)로 건물 모델을 만들고 화재·연기 해석을 준비해 ASET 을 판정합니다. Build the building from a floor plan, set up the fire run and assess ASET.
evacuation-rset화재 모델 위에 피난자·계단·경로를 넣고 FED 연계로 RSET 을 구해 ASET 과 비교합니다. Add occupants, stairs and routes, couple FED and compare RSET with ASET.
hvac-smoke-control덕트망·급배기 단말을 만들고 풍량을 계산해 FDS 에 반영합니다. Build the duct network, calculate airflows and apply them to the FDS model.
sprinkler-design스프링클러 평면도 인식·자동 배치·직접 입력으로 배관망을 만들고 수리계산·설계 검토 후 FDS 에 반영합니다. Build the sprinkler network, calculate, review and apply it to FDS.
marine-water-spray-iso배관 아이소메트릭 도면에서 물분무 배관망을 인식해 구역별 설계 계산, 수원압력 역산, 펌프 사양, 설계 검토, 계산서 내보내기까지 합니다. Recognise the water-spray network from ISO drawings and carry it through design, pump sizing, review and export.
troubleshooting증상에서 원인·확인 도구·고치는 법을 찾습니다. Go from a symptom to its cause, the tool that confirms it and the fix.
review-fds-deck앱 없이도 .fds 덱을 결정적으로 점검하고 고칠 점을 규칙 id 와 함께 제안합니다. Lint an .fds deck deterministically (no app needed) and propose fixes with rule ids.

Resources

Contextual data attached and managed by the client

NameDescription
knowledge-indexWhat is in the knowledge pack and how an agent should use it.
knowledge-ontologyClasses, units, coordinate conventions, relations, and the tools that create/read/update each object.
knowledge-ontology.jsonldThe same ontology as a JSON-LD graph.
knowledge-rules166 machine-readable rules (condition → check → fix) and 38 common LLM mistakes.
knowledge-glossaryKorean ↔ English ↔ FDS keyword ↔ BULC tool, with unit conversions.
knowledge-fds-6.10.1-keysFrequently used namelist keys: type, unit, default, mistakes, BULC tool; common input errors.
knowledge-playbooks-01-architectural-drawing-fire-aset건축 평면도(DWG, DXF, PDF, 이미지)를 받아 BULC 건물 모델을 만들고, 화재·연기 해석을 준비·실행한 뒤 피난 허용 시간(ASET)을 판정하는 순서입니다.
knowledge-playbooks-02-evacuation-fed-rset플레이북 01 의 건물·화재 모델 위에 피난자·계단·경로를 넣고, 화재 결과를 피난 계산에 연계(FED)해 피난 소요 시간(RSET)을 구한 뒤 ASET 과 비교하는 순서입니다.
knowledge-playbooks-03-hvac-smoke-control거실 제연·급기를 BULC HVAC 모듈로 설계하고 FDS 해석에 단말 경계 유량으로 넣는 순서입니다.
knowledge-playbooks-04-sprinkler-design-fds-activation건물 스프링클러 배관망을 만들고(도면 인식·자동 배치·직접 입력), 수리계산과 설계·사양 검토를 통과시킨 뒤, 계산된 헤드 유량으로 FDS 해석에 넣어 작동 시각과 효과를 보는 순서입니다.
knowledge-playbooks-05-marine-water-spray-iso배관 아이소메트릭(ISO) 도면에서 물분무(일제살수) 배관망을 인식해 구역별 설계 계산을 하고, 필요한 수원 압력과 펌프 사양을 정한 뒤 설계·사양 검토와 계산서(CSV / FHC 형식) 내보내기까지 하는 순서입니다.
knowledge-playbooks-06-troubleshooting증상에서 출발해 확인 도구와 고치는 법을 찾는 표입니다. 규칙 id 는 `rules.yaml` 에 있습니다.
examples-README.mdSynthetic example (generated, not a real project).
examples-decks-broken_deck_synthetic.fdsSynthetic example (generated, not a real project).
examples-decks-room_fire_synthetic.fdsSynthetic example (generated, not a real project).
examples-drawings-office-plan-synthetic.dxfSynthetic example (generated, not a real project).
examples-drawings-water-spray-iso-synthetic.dxfSynthetic example (generated, not a real project).
examples-sessions-01-office-plan-to-fire-model.mdSynthetic example (generated, not a real project).
examples-sessions-02-water-spray-iso.mdSynthetic example (generated, not a real project).
examples-sessions-03-deck-review-without-app.mdSynthetic example (generated, not a real project).
project-summarySummary of the project open in the BULC app. Needs the app.
project-deckThe FDS deck of the project open in the BULC app (preview_fds). Needs the app.

TDQS

B3/5.0

Scored across 249 tools

Disambiguation2/5

With 249 tools there is heavy functional overlap between modules: set_mesh / set_meshes / set_mesh_cell_size / auto_fit_mesh / auto_multimesh / auto_cutcell_mesh / slice_mesh / merge_meshes all manipulate the mesh, and add_obstacle vs shape_add_box vs add_wall vs add_floor vs place_furniture all create geometry. Convenience wrappers (add_sprinkler, add_heat_detector, add_device, add_prop) and dual undo tools (project_undo vs shape_undo) further blur boundaries, so an agent can easily misselect even though descriptions try to distinguish them.

Naming Consistency4/5

Names are overwhelmingly snake_case verb_noun with clear module prefixes (shape_, spr_, hvac_, evac_, draw_, arch_, result_, sim_, project_) and this convention holds across the whole set. Minor deviations exist: core model tools drop the prefix (add_obstacle, remove_vent, update_dump_config) while their cousins are prefixed, and a few names are noun-first (bulc_connection_status, get_conventions).

Tool Count1/5

249 tools is an extreme mismatch, far past the rubric's 50+ threshold and well beyond what an agent can reliably scan per session. Even though the server spans FDS modelling, shape studio, sprinkler, HVAC, evacuation, drawing import and results, the surface is so disaggregated that it should be split into several scoped servers.

Completeness5/5

Coverage is exhaustive: near-full CRUD for obstacles, vents, devices, materials, surfaces, meshes, sprinkler networks, HVAC, evacuation agents, outputs and simulation control, plus reading/preview/validation/results/knowledge and drawing-import paths. Almost no obvious dead ends remain across the many domains.

Maintenance

ActivityMaintained
ResponsivenessNo issues