Read-only BACnet/IP MCP gateway with Brick + Haystack semantic tagging at ingest
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent — or use 1-click editor setup below.
💡 Paste into ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)
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_topologyOr from source:
Python 3.11 or later required.
Create a config file config.yaml:
Run the MCP server:
Or wire it into Claude Desktop:
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:
This 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):
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.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/brick-bacnet-mcp)<a href="https://allmcps.com/mcp/brick-bacnet-mcp"><img src="https://allmcps.com/api/badge/brick-bacnet-mcp?style=directory" alt="Brick Bacnet Mcp on AllMCPs" /></a>