{"id":49940285,"url":"https://github.com/jscott3201/rusty-bacnet-mcp","last_synced_at":"2026-05-17T10:38:03.287Z","repository":{"id":356619316,"uuid":"1233204663","full_name":"jscott3201/rusty-bacnet-mcp","owner":"jscott3201","description":"Dedicated MCP (Model Context Protocol) server for agentic interaction with BACnet building automation networks — bulk reads, hot-reload safety layer, and a ratatui operator console on the rusty-bacnet stack.","archived":false,"fork":false,"pushed_at":"2026-05-08T22:24:14.000Z","size":290,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-08T23:31:30.238Z","etag":null,"topics":["agentic","bacnet","building-automation","hvac","iot","llm","mcp","model-context-protocol","ratatui","rust","smart-buildings","tui"],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jscott3201.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-08T17:50:42.000Z","updated_at":"2026-05-08T22:24:16.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/jscott3201/rusty-bacnet-mcp","commit_stats":null,"previous_names":["jscott3201/rusty-bacnet-mcp"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/jscott3201/rusty-bacnet-mcp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jscott3201%2Frusty-bacnet-mcp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jscott3201%2Frusty-bacnet-mcp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jscott3201%2Frusty-bacnet-mcp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jscott3201%2Frusty-bacnet-mcp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jscott3201","download_url":"https://codeload.github.com/jscott3201/rusty-bacnet-mcp/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jscott3201%2Frusty-bacnet-mcp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33135148,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-17T09:28:26.183Z","status":"ssl_error","status_checked_at":"2026-05-17T09:27:52.702Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agentic","bacnet","building-automation","hvac","iot","llm","mcp","model-context-protocol","ratatui","rust","smart-buildings","tui"],"created_at":"2026-05-17T10:37:58.148Z","updated_at":"2026-05-17T10:38:03.280Z","avatar_url":"https://github.com/jscott3201.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# rusty-bacnet-mcp\n\nDedicated **MCP (Model Context Protocol) server** for agentic interaction with BACnet building automation networks. Lets LLM agents discover devices, read sensor values, write setpoints, and manage local objects on the [`rusty-bacnet`](https://github.com/jscott3201/rusty-bacnet) protocol stack — over MCP, via stdio (Claude Desktop / Claude Code) or streamable-HTTP (remote / multi-client).\n\n[![CI](https://github.com/jscott3201/rusty-bacnet-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/jscott3201/rusty-bacnet-mcp/actions/workflows/ci.yml)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n\n## What you get\n\n- **MCP server** with both **stdio** and **streamable-HTTP** transports — pick one or run both.\n- **BACnet tools** — `discover_devices`, `read_property`, `write_property`, local-object CRUD, plus more landing in 0.3 (ReadPropertyMultiple, priority array, trends, alarms, schedules).\n- **Built-in BACnet reference resources** — an LLM connected via MCP can troubleshoot devices, diagnose alarms, and read sensors with **zero prior BACnet knowledge**. Reference content is compiled into the binary.\n- **Bearer-token auth** on the HTTP transport with constant-time comparison.\n- **Read-only by default** — operators must explicitly opt in to writes via config or `--writes-enabled`.\n- **JSON configuration** with full validation at boot.\n- **Single static binary** (`bacnet-mcp`) — no runtime deps beyond the JSON config.\n\n## Status\n\nVersion 0.2.0 dropped the legacy HTTP REST API and MS/TP transport to focus the project on MCP-only agentic access over IP-based BACnet (BIP + SC).\n\nComing next:\n- Phase 2 — feature expansion (RPM, priority array, trends, alarms, schedules, layered safety)\n- Phase 3 — `bacnet-mcp-tui` operator console (ratatui)\n- Phase 4 — BACnet/SC Hub + Node transport wiring\n\n## Install\n\nThe crate is not published to crates.io yet. Build from source:\n\n```bash\ngit clone https://github.com/jscott3201/rusty-bacnet-mcp\ncd rusty-bacnet-mcp\ncargo build --release --features bin\n# Binary at target/release/bacnet-mcp\n```\n\nOr via `cargo install --git`:\n\n```bash\ncargo install --git https://github.com/jscott3201/rusty-bacnet-mcp bacnet-mcp --features bin\n```\n\n## Quick Start\n\nCopy the starter config:\n\n```bash\ncp examples/bacnet-mcp.json ./bacnet-mcp.json\n# Edit transports.bip.broadcast to match your subnet\n```\n\n### Stdio (for Claude Desktop / Claude Code)\n\n```bash\nbacnet-mcp --config bacnet-mcp.json\n```\n\nStdio is the default. Logs go to `$TMPDIR/bacnet-mcp-\u003cpid\u003e.log` (override with `--log-file`); stdout is reserved for JSON-RPC.\n\nIn Claude Desktop / Claude Code MCP config, add:\n\n```json\n{\n  \"mcpServers\": {\n    \"bacnet\": {\n      \"command\": \"/absolute/path/to/bacnet-mcp\",\n      \"args\": [\"--config\", \"/absolute/path/to/bacnet-mcp.json\"]\n    }\n  }\n}\n```\n\n### Streamable-HTTP (remote / multi-client)\n\n```bash\nbacnet-mcp --config bacnet-mcp.json --transport http --bind 127.0.0.1:3000\n```\n\nEndpoint: `http://127.0.0.1:3000/mcp`. Set `mcp.api_key` in the config (or `--api-key` / `BACNET_MCP_API_KEY`) to require bearer-token auth.\n\n### Both transports concurrently\n\n```bash\nbacnet-mcp --config bacnet-mcp.json --transport both --bind 127.0.0.1:3000\n```\n\n## MCP Surface\n\n**Tools** (10 today; expanding in 0.3):\n\n```\ndiscover_devices, list_known_devices, get_device_info, register_device,\nread_property, write_property,\nlist_local_objects, read_local_property, write_local_property,\ncreate_local_object, delete_local_object\n```\n\n**Resources**:\n\n- `bacnet://reference/{object-types,properties,units,errors,reliability,priority-array,networking,services,troubleshooting}` — compiled-in reference text.\n- `bacnet://reference/object-types/{type}` — per-type drill-down.\n- `bacnet://state/{devices,local-objects,config}` — live state snapshots.\n\n## Configuration (JSON)\n\n```json\n{\n  \"mcp\": {\n    \"read_only\": true,\n    \"api_key\": \"your-secret-key\",\n    \"http\": { \"bind\": \"127.0.0.1:3000\" }\n  },\n  \"device\": {\n    \"instance\": 389001,\n    \"name\": \"BACnet MCP Gateway\",\n    \"vendor_id\": 999\n  },\n  \"transports\": {\n    \"bip\": {\n      \"interface\": \"0.0.0.0\",\n      \"port\": 47808,\n      \"broadcast\": \"192.168.1.255\",\n      \"network_number\": 1\n    }\n  }\n}\n```\n\nFull schema: see [src/config.rs](src/config.rs). Starter file: [examples/bacnet-mcp.json](examples/bacnet-mcp.json).\n\n## CLI\n\n```\nbacnet-mcp [OPTIONS]\n  -c, --config \u003cPATH\u003e          JSON config file (default: bacnet-mcp.json)\n  -t, --transport \u003cMODE\u003e       stdio | http | both (default: stdio)\n      --bind \u003cADDR\u003e            HTTP transport bind override\n  -k, --api-key \u003cKEY\u003e          Bearer token (or BACNET_MCP_API_KEY env)\n  -r, --read-only              Force read-only\n      --writes-enabled         Force writes on (overrides config)\n  -v, --verbose                -v info, -vv debug, -vvv trace\n  -q, --quiet                  Errors only\n      --log-file \u003cPATH\u003e        Log file (auto $TMPDIR/bacnet-mcp-\u003cpid\u003e.log for stdio)\n      --print-config           Print resolved config and exit\n```\n\n## Safety\n\n`mcp.read_only` defaults to `true` — out of the box, every write tool returns `Gateway is in read-only mode`. To enable writes, set `\"read_only\": false` in JSON config or pass `--writes-enabled`. Phase 2 will add a layered safety control plane: per-tool dry-run, write allow/deny lists, priority-range caps, and an append-only audit log exposed as `bacnet://audit/recent`.\n\n## Built On\n\nConsumes the [`rusty-bacnet`](https://github.com/jscott3201/rusty-bacnet) library crates (`^0.8`):\n\n- `bacnet-types`, `bacnet-encoding`, `bacnet-services`\n- `bacnet-transport`, `bacnet-network`\n- `bacnet-client`, `bacnet-objects`, `bacnet-server`\n\ncargo-deny runs against the advisory database in CI on every push.\n\n## Documentation\n\n- [CLAUDE.md](CLAUDE.md) — architectural notes for contributors.\n- [CHANGELOG.md](CHANGELOG.md) — release notes.\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjscott3201%2Frusty-bacnet-mcp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjscott3201%2Frusty-bacnet-mcp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjscott3201%2Frusty-bacnet-mcp/lists"}