How do I connect Grok Bot to Home Assistant, and keep it to only the devices I choose?

With Device control, the Bot gets the same tools as Home Assistant's voice assistant, Assist, and it can only see and control the entities you exposed to Assist.

All Grok Bot questions: https://www.soundminds.ai/faq.

Last updated Nov 11, 2026

Give your Bot Home Assistant's Device control address, sign it in as a non-admin Home Assistant user, and expose only the devices you want it to touch.

All Grok Bot questions: the SoundMinds Grok Bot FAQ.

Short answer

Home Assistant has a built-in Model Context Protocol (MCP) server, and Grok Bot can add an MCP server as a custom connector. Home Assistant offers more than one address for its MCP server. Use the one called Device control. With Device control, the Bot gets the same tools as Home Assistant's voice assistant, Assist, and it can only see and control the entities you exposed to Assist.

We tested this on Nov 11, 2026 with a simulated pool on a test copy of Home Assistant 2026.11.1. Grok Bot read the pool's chlorine level, turned on the pool pump, and saw the pump's power draw. When it tried to turn on the salt chlorinator, which we hadn't exposed, Home Assistant refused.

Watch the test

An 89-second narrated screen recording of our test Home Assistant with a simulated pool. It shows the Expose tab with the pool pump exposed and the salt chlorinator not exposed, the Device control address in Home Assistant's AI settings, and the pool dashboard. During the recording, Grok Bot read free chlorine at 0.8 ppm and the pump at 0 W, turned on the pool pump, and the pump then drew 1,150 W. Home Assistant refused when the Bot tried the salt chlorinator, and the chlorinator stayed off. Every device is simulated, and the recording is edited for length.

The pool example

A pool is a good example because it has one device you probably want your Bot to run, the pump, and one you might not, the salt chlorinator. Here is what we set up and what happened.

What we set up

  1. We ran Home Assistant 2026.11.1 on our Bot's computer, listening only on that computer. Every device was a simulated Home Assistant helper with no real pool hardware: a pool pump switch, a salt chlorinator switch, free chlorine, pH, water temperature, the electricity price, and a pump power sensor that reads 1,150 W while the pump is on.
  2. In Home Assistant, we went to Settings > Voice assistants, opened the Expose tab, and exposed the pool pump, the chlorine, pH, water temperature, price, and pump power. We left the salt chlorinator unexposed.
  3. We created a separate non-admin Home Assistant user for the Bot and gave the Bot a long-lived access token for that user.
  4. We added a custom connector named "Home Assistant (test)" to Grok Bot. It's a Command connector that runs a small script on the Bot's computer. The script reads the token from a file and connects to the Device control address, so the token never appears in the connector's Arguments or on screen.

What the Bot did

In our test, these were the Bot's real requests through that connector, in order:

  1. It asked Home Assistant for the live state of the home. Home Assistant returned free chlorine 0.8 ppm, pH 7.8, the pump off at 0 W, the price at $0.34 per kWh, and the water at 82°F. The salt chlorinator wasn't in the list.
  2. It turned on the Pool pump, and Home Assistant reported the action done.
  3. It read the pump's power, which was then 1,150 W (simulated).
  4. It tried to turn on the Pool salt chlorinator. Home Assistant answered, "No matching entities are exposed to the assistant (given name 'Pool salt chlorinator')", and the chlorinator stayed off.

The point to take away is that the limit lives in Home Assistant, not in the Bot. If a device isn't exposed, a Bot on the Device control address can't switch it.

I'm not giving water chemistry advice here. If you ask your Bot to run the pump when chlorine is low, pick the threshold yourself.

Why Device control and a non-admin user

Home Assistant's MCP server page says Device control "only accesses the entities you expose to voice assistants." The other choice, called Home Assistant, "accesses everything and requires an administrator account." The Main URL "exposes all tools and requires an administrator account."

We tested both ways. With the Bot's non-admin user, the Device control address worked, and the Main URL was refused with an HTTP 403 error. With an admin user on the Main URL, there were 20 tools instead of 9, including tools to read history and logs and to run any Home Assistant action. In that admin test, a direct action turned on the salt chlorinator even though it wasn't exposed. (We turned it right back off.) That's why I recommend Device control with a non-admin user.

Exposing only what the Bot should touch is the same idea Home Assistant uses for voice. Its page on exposing entities says you expose entities to Assist "to avoid that sensitive devices, such as locks and garage doors, can inadvertently be controlled by voice commands."

How to set it up

  1. In Home Assistant, go to Settings > System > AI. If the Model Context Protocol card shows an Enable button, select it. Under Individual URLs, find Device control. Its address ends in /api/mcp/assist.
  2. Go to Settings > Voice assistants, open the Expose tab, and expose only the devices you want your Bot to see and control.
  3. Create a separate non-admin Home Assistant user for your Bot.
  4. Add the server to Grok Bot. In the desktop app, choose Add a custom connector at the bottom of Connect apps, enter a Name, and pick a Type. Remote HTTPS takes a Server URL, with optional HTTP headers and an OAuth Client ID. Command takes a Command and its Arguments. Choose Add plugin to save it. Adding a server on a private network asks for your approval first.
  5. Keep secrets out of chat. For an API key or other secret, enter it in the secure secret card when the Bot asks. The field is masked, and the value isn't written into the chat or shown to the Bot.

Full disclosure, C75QKGMBPQE8 is my referral code, so if you'd like to use it, open https://grok.com/refer/bot?code=C75QKGMBPQE8.

Home Assistant's page documents OAuth for sign-in. In our test we used a long-lived access token for the non-admin user instead, sent as a Bearer header, and that worked. I haven't tested Grok Bot's OAuth sign-in against Home Assistant.

Apps are account-wide in Grok Bot, so a connected app is available to every Bot you run. If you want only one Bot near your house, keep that in mind before you add it.

Reaching Home Assistant at home

Our test ran Home Assistant on the same computer as the Bot, which made filming safe and simple. In a real home, Home Assistant runs on your own hardware, and the Bot runs on its own computer, so the Bot needs a way to reach your house.

Home Assistant's MCP page says that if the AI agent runs in the cloud, "your Home Assistant instance must be accessible from the internet," using Home Assistant Cloud or another method of remote access.

If you'd rather not open Home Assistant to the internet, you can reach it over your own Tailscale network. The steps are on our FAQ page about letting Grok Bot reach a private MCP server on your tailnet. I haven't tested Home Assistant over a tailnet yet.

Off-peak power

Power is the other job people ask about. Home Assistant's Energy page talks about using it to "charge the car when power is cheap or your panels are at their peak, and set automations that quietly save you money in the background." The Energy dashboard can also take power sensors, in units such as W or kW.

In our test, the Bot could read both numbers it would need: the electricity price and the pump's power draw. With our simulated numbers, 1,150 W at $0.34 per kWh works out to about 39 cents for each hour the pump runs. That's our arithmetic on simulated values, not a real tariff.

A Grok Bot routine can run on a schedule, so a routine could check the price and the pump every few hours. Routine schedules must be at least five minutes apart, and each run spends usage. I haven't tested a routine that switches the pump based on price, so I'll check whether it works before I say it does. For anything that changes a real system, keep it behind approval.

Limits

Our test

Sources

Home Assistant: Model Context Protocol server integration: https://www.home-assistant.io/integrations/mcp_server/

Home Assistant: Expose entities to Assist: https://www.home-assistant.io/voice_control/voice_remote_expose_devices/

Home Assistant: Authentication and long-lived access tokens: https://www.home-assistant.io/docs/authentication/

Home Assistant: Energy: https://www.home-assistant.io/docs/energy/

Grok Bot docs: Use the computer and apps: https://docs.x.ai/grok-bot/computer-and-apps

Grok Bot docs: Vault: https://docs.x.ai/grok-bot/vault

Grok Bot docs: Skills, routines, and automations: https://docs.x.ai/grok-bot/skills-routines-and-automations

Grok Bot changelog: https://x.ai/changelog/bot

SoundMinds FAQ: Letting Grok Bot reach a private MCP server on your tailnet: https://www.soundminds.ai/faq/tailscale-private-mcp

See how I set up Grok Bot: https://www.soundminds.ai/setup.