VomeHome lets an AI coding agent read and control your Home Assistant. That is a genuinely sensitive capability, so this page documents how it is constrained, what we deliberately do not allow, and the limitations we currently accept. It is written to be useful to someone deciding whether to trust it — which means the known weaknesses are listed alongside the controls.
For the wider platform, see Security & Privacy. Findings and fixes below are dated so you can tell how current this is.
The agent never receives a Home Assistant credential. It gets a revocable VomeHome API token, and every Home Assistant read or write is brokered through our API where the policy is enforced server-side.
This is the property everything else rests on. A compromised or misbehaving agent cannot bypass the broker to reach Home Assistant directly, because it was never given anything that would let it — the Home Assistant token stays on our server and is never returned to a caller. A read-only token genuinely cannot change anything; that is not a client-side setting an agent could ignore.
ha:write; rewriting
automations, scripts and scenes requires the separate
ha:config; creating instances requires the
account-wide instances:write.
homeassistant.turn_on is checked
against the domain of every target entity, so it
cannot be used to reach a blocked domain indirectly.
ha:config,
the same grant as rewriting automations. An agent can build and
install firmware on your ESPHome devices over the relay — a
genuinely physical capability, so it is gated on the edit
permission rather than the control one, and every build is audited
like any other write. Reading a device's logs or validating its
configuration changes nothing and needs only read access. The
shared secrets.yaml is refused outright, on both read
and write.
The hosted endpoint serves many customers from one process, so isolation between sessions is a first-order concern.
NoNewPrivileges, a
private /tmp, a read-only view of home
directories, and a strict read-only system view.
Both issues below were found in our own review of newly written code, before release and before any customer could reach them. Neither was ever live. They are published for the same reason as the ones below: a security page that lists only successes is not evidence of much.
Severity: moderate — over-broad credential exposure within a single account. No cross-account exposure, and never released.
Work to let an agent edit ESPHome device configurations treated every
file in that folder alike. One of them, secrets.yaml, is
not a device configuration at all: it holds what every device
authenticates with — the wifi password, the API encryption keys, the
firmware-update passwords. A token holding nothing but read access
could therefore have retrieved the credentials for a whole fleet of
devices, and one with edit access could have replaced them. Device
configurations refer to secrets by name and never by value, so nothing
legitimate needed to read them. That file is now refused on both read
and write, in the portal and again on the component running in your
home.
Severity: moderate — would have allowed limited cross-account exposure of build output. Never released.
Firmware builds run for minutes, so they are tracked as jobs the caller polls for output. Ownership of the Home Assistant instance was checked on every poll, but the job identifier itself was then accepted unqualified — so someone who came by another user's job identifier could have read that build's output, or cancelled the installation, through an instance of their own. The identifiers are random and unguessable, but that is obscurity rather than access control, and they are handed to callers and recorded in audit trails. The owning instance now travels with every poll and cancellation, and a mismatch is indistinguishable from a job that does not exist.
All three issues below were found during the review of the hosted endpoint, before it had any real usage, and all three are fixed. They are published because a security page that lists only successes is not evidence of much.
Severity: low — availability only. No impact on confidentiality or integrity; permissions and audit logging were unaffected throughout.
Request quotas were enforced per client network address. When the MCP server moved from running on each user's own machine to being hosted by us, every user's brokered calls began arriving from a single address and therefore shared one quota — so a single busy agent could have exhausted it for other users. Quotas for token-authenticated internal traffic are now keyed on the token itself, giving each user their own. Public traffic is still keyed per address, so the change cannot be used to escape a quota.
Severity: low — availability only, no exposure of data or bypass of access control.
Our deployment regenerates the web-server configuration from a template. Any route added by hand outside that template was therefore removed by the next deployment. This affected the new agent endpoint and, more importantly, revealed a pre-existing latent fault in the off-site backup upload route, which had the same weakness and would have been dropped by any deployment. Both routes are now produced by the template itself, so they cannot drift out again.
Severity: moderate — over-broad read access within a single account. No cross-account exposure: a token could only ever reach Home Assistant instances belonging to its own owner, and write protection was never affected.
Ticking instances when creating a key granted write access to those instances, but read access was a single account-wide permission. Every key could therefore read every Home Assistant on its owner's account — states, entities, automations and logs — including instances deliberately left unticked. Two things combined to cause it: reads were checked account-wide rather than per instance, and a key created with no explicit account-wide permissions fell back to a default that included the read wildcard. Reads are now granted and enforced per instance, and an ungranted instance is invisible to the key rather than readable. Reported by a customer who noticed an agent reading an instance they had not given it.
Current, accepted trade-offs. We would rather state them than have you discover them.
ha:write
lets an AI agent turn things on and off in your home. Grant the
narrowest scope that does the job.
If you find a security issue in the agent API or MCP endpoint, please email security@vome.io. We will investigate every legitimate report and ask for reasonable time to fix before public disclosure. The MCP server itself is open source and can be read at github.com/Vortitron/home-assistant-mcp.
Reviewed August 2026, covering the hosted MCP endpoint and the brokered agent API. Updated as controls change.