BULC MCP
OfficialServer Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| BULC_MCP_HINTS | No | If set to '0', do not append rule id hints at the end of tool descriptions. Default is '1'. | 1 |
| BULC_BRIDGE_URL | No | Bridge full address (highest priority), e.g., http://127.0.0.1:8790 | |
| BULC_BRIDGE_HOST | No | Host to use when discovery file is absent (default is 127.0.0.1) | 127.0.0.1 |
| BULC_BRIDGE_PORT | No | Port to use when discovery file is absent (default is 8787) | 8787 |
| BULC_MCP_PROFILE | No | Profile 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_TOKEN | No | Bridge token (used when connecting to an app with BULC_BRIDGE_AUTH without discovery file) | |
| BULC_MCP_TOOLSETS | No | Comma-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_MS | No | App connection watch interval in milliseconds. If set to '0', watching is disabled. Default is 15000 (15 seconds). | 15000 |
| BULC_MCP_HIDE_TOOLS | No | Comma-separated tools to hide, e.g., project_new,sim_stop | |
| BULC_MCP_ALLOW_REMOTE | No | If set to '1', allow non-loopback bridge addresses (not recommended). Default is '0'. | 0 |
| BULC_MCP_ATTACH_IMAGES | No | If set to '0', do not attach capture_view and shape_screenshot images as image content. Default is '1'. | 1 |
| BULC_MCP_CALL_TIMEOUT_MS | No | App tool call timeout in milliseconds. Default is 120000 (2 minutes). Some tools like drawing analysis may take longer. | 120000 |
| BULC_MCP_MAX_DESCRIPTION | No | Maximum tool description length (characters). For clients with 1,024 character limit, set to '1024'. | |
| BULC_BRIDGE_DISCOVERY_FILE | No | Change 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
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {} |
| resources | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| 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 |
| 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 |
| 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 |
| 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, |
| 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 |
| 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 |
| 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 |
| 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 |
| 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
| Name | Description |
|---|---|
| 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
| Name | Description |
|---|---|
| knowledge-index | What is in the knowledge pack and how an agent should use it. |
| knowledge-ontology | Classes, units, coordinate conventions, relations, and the tools that create/read/update each object. |
| knowledge-ontology.jsonld | The same ontology as a JSON-LD graph. |
| knowledge-rules | 166 machine-readable rules (condition → check → fix) and 38 common LLM mistakes. |
| knowledge-glossary | Korean ↔ English ↔ FDS keyword ↔ BULC tool, with unit conversions. |
| knowledge-fds-6.10.1-keys | Frequently 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.md | Synthetic example (generated, not a real project). |
| examples-decks-broken_deck_synthetic.fds | Synthetic example (generated, not a real project). |
| examples-decks-room_fire_synthetic.fds | Synthetic example (generated, not a real project). |
| examples-drawings-office-plan-synthetic.dxf | Synthetic example (generated, not a real project). |
| examples-drawings-water-spray-iso-synthetic.dxf | Synthetic example (generated, not a real project). |
| examples-sessions-01-office-plan-to-fire-model.md | Synthetic example (generated, not a real project). |
| examples-sessions-02-water-spray-iso.md | Synthetic example (generated, not a real project). |
| examples-sessions-03-deck-review-without-app.md | Synthetic example (generated, not a real project). |
| project-summary | Summary of the project open in the BULC app. Needs the app. |
| project-deck | The FDS deck of the project open in the BULC app (preview_fds). Needs the app. |
TDQS
Scored across 249 tools
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.
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).
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.
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.