Brick Bacnet Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Brick Bacnet Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
A read-only BACnet/IP gateway that exposes building automation point databases to LLM agents via MCP, with Brick + Project Haystack semantic tagging at ingest time.
The research note this implementation came out of is at https://habchy.dev/research/bacnet-msi-semantic-gap. A version of the same article is also published at AutomatedBuildings.com (link will be added when the AB.com edition goes live).
Short version: vendor agentic platforms (JCI OpenBlue, Honeywell Forge, Siemens Building X, Tridium Niagara 5) keep their semantic AI layer inside their own controls portfolios. Independent MSIs running mixed-vendor 5-50 building portfolios have BACnet point databases but no clean way to expose them in semantic-tagged form to external LLM agents. This gateway is one answer to that gap.
ezhuk/bacnet-mcp does read and write at the BACnet protocol layer with no semantic normalization. This project sits beside it: it adds the Brick + Haystack tagging step at ingest and restricts the v0.1 surface to read-only for a tighter compliance footprint.
list_devices, list_objects, get_object_value, get_tagged_topologypip install brick-bacnet-mcpOr from source:
git clone https://github.com/Yveshby27/brick-bacnet-mcp
cd brick-bacnet-mcp
pip install -e .Python 3.11 or later required.
Create a config file config.yaml:
bacnet:
local_device_instance: 555001
broadcast_address: 192.168.1.255
polling_interval_seconds: 30
rules:
brick: src/brick_bacnet_mcp/rules/brick_rules.yaml
haystack: src/brick_bacnet_mcp/rules/haystack_rules.yaml
mcp:
transport: stdio # or "http" for a hosted MCP host
http_port: 8080 # only if transport == http
log_level: INFORun the MCP server:
brick-bacnet-mcp --config config.yamlOr wire it into Claude Desktop:
{
"mcpServers": {
"brick-bacnet": {
"command": "brick-bacnet-mcp",
"args": ["--config", "/path/to/config.yaml"]
}
}
}With the server running and the simulator active (or a real BACnet/IP network reachable), an MCP-capable LLM can run:
User: List all the air-handling units across the building.
>
Agent (via MCP tool): calls get_tagged_topology(filter="brick:AHU")>
Agent response: Found 3 AHUs. AHU-1 has 5 child points (discharge_air_temp, return_air_temp, supply_fan_status, mixed_air_damper_position, outside_air_temp). AHU-2 ... AHU-3 ...
See examples/ for full runnable scripts.
The starter rule library targets common US-style object-name conventions (OAT, DAT, ZNT, CHWS, AHU-1, etc.). Real-world mixed-vendor portfolios use wildly different naming. Before assuming the tool is broken or working, run:
brick-bacnet-mcp --coverage-report --config config.yamlThis does one discover + enumerate + tag cycle against your network and prints:
--top-unmatched N for a different count)Use the unmatched list to extend the YAML rule files for your naming convention. A first-run match rate of 30-50% is normal for a portfolio that hasn't been calibrated yet; 70%+ is what you'd want before relying on the tagged topology for LLM queries.
The tagger applies YAML-defined rules to map BACnet object names and units to Brick classes and Haystack tag sets. The default rule set covers about 50 common HVAC, lighting, and metering object-name patterns. Users override or extend by editing src/brick_bacnet_mcp/rules/brick_rules.yaml and haystack_rules.yaml locally.
Example rule (Brick):
- pattern: '(?i)^(oat|outside_air_temp|outsideair)$'
units: ['degF', 'degC', '°F', '°C']
brick_class: 'Outside_Air_Temperature_Sensor'See docs/RULES.md for the rule grammar and override conventions.
See docs/ARCHITECTURE.md. Short version:
discovery.py runs Who-Is broadcast, captures I-Am responses, caches device metadatareader.py enumerates the object list per device and polls present-value at the configured intervaltagger.py applies Brick + Haystack rules to each enumerated objecttopology.py assembles the tagged objects into a queryable graphserver.py exposes four MCP tools over stdio or streamable HTTPv0.1 is a research instrument. The roadmap below is what the research article flagged as worth doing next IF v0.1 gets enough sustained-use signal to justify extending. None of it is committed pre-signal.
MIT. See LICENSE.
See CONTRIBUTING.md. PRs welcome for rule library extensions, documentation, examples, and test coverage. Larger changes (write path, non-BACnet protocol support, UI, FDD logic) are out of v0.1 scope. Open an issue first to discuss before submitting a PR.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.