AI and Voice Control
Beacon supports four approaches for voice and AI control. Choose the one that fits your setup, or use them all together.
| Approach | Best for | Requires LLM? |
|---|---|---|
| Claude Code Plugin | Claude Code users | Yes |
| Voice API | Quick automations, custom UIs | No |
| MCP Server | Any LLM agent (Open Claw, etc.) | Yes |
| HA Custom Sentences | Home Assistant Assist | No |
Claude Code Plugin
The Beacon plugin for Claude Code gives you slash commands, domain knowledge (skills), and the MCP server in one package. Install it once and Claude understands how to manage your family dashboard.
Installation
/plugin marketplace add asachs01/beacon
Then restart Claude Code. That’s it — the plugin, skills, commands, and MCP server are all installed.
Then set your environment variables:
export BEACON_HA_TOKEN="your-ha-long-lived-access-token"
export BEACON_HA_URL="http://homeassistant.local:8123"
export BEACON_DATA_DIR="/path/to/beacon/data"
Generate a token in Home Assistant: Profile > Security > Long-Lived Access Tokens > Create Token.
Slash Commands
| Command | Description |
|---|---|
/create-chore | Create a family chore with assignments, frequency, and payout |
/family-schedule | Per-person calendar breakdown for today |
/whats-for-dinner | Show today’s meal plan |
/chore-status | Chore completion status and earnings for today |
Skills
Skills are domain knowledge files that teach Claude how Beacon works. They activate automatically when you ask about related topics.
| Skill | Triggers on |
|---|---|
| MCP Server | Setup, connection, available tools |
| Chores | Creating, assigning, completing, payouts, streaks |
| Calendar | Events, schedules, calendar-to-person mapping |
| Meal Plans | Viewing menus, AnyList sync, meal data |
| Dashboard | Layout presets, widgets, per-member columns |
Example Usage
> /create-chore "Walk the dog" --assigned_to "Lennon, Elliott" --frequency daily --value 1.00 --icon 🐕
> /family-schedule
📅 Family Schedule — Wednesday, April 2
👨 Aaron: 9:00 AM - Team standup, 2:00 PM - Dentist
👩 Ashley: 10:00 AM - PTA meeting
🧒 Lennon: (nothing today)
🧒 Elliott: (nothing today)
> /whats-for-dinner
🌙 Dinner: Instant Pot Spaghetti
> /chore-status
✅ Make bed — Lennon, Elliott
⬜ Walk the dog — pending (Lennon, Elliott)
💰 Lennon: $1.50 today
Voice API (built-in)
Beacon’s server exposes a REST endpoint for natural-language commands. It uses keyword matching — no LLM, no cloud service, and no added latency.
Endpoint
POST /beacon-action/voice
Content-Type: application/json
{ "text": "add milk to the grocery list" }
Response
{
"response": "Added milk to grocery",
"action": "add_item",
"entity_id": "todo.grocery",
"success": true
}
Supported commands
Lists: add <item> to <list> | mark <item> as done | check off <item> | complete <item>
Media: play | pause | next song | skip | set volume to 50
Navigation: show <view> | open <view> | go to <view>
Queries: what's on today | today's schedule | what's the weather
Examples
# Add a grocery item
curl -X POST http://<beacon-host>:8099/beacon-action/voice \
-H 'Content-Type: application/json' \
-d '{"text": "add eggs to the grocery list"}'
# Control media
curl -X POST http://<beacon-host>:8099/beacon-action/voice \
-H 'Content-Type: application/json' \
-d '{"text": "set volume to 40"}'
# Check the calendar
curl -X POST http://<beacon-host>:8099/beacon-action/voice \
-H 'Content-Type: application/json' \
-d '{"text": "what'\''s on my calendar"}'
The API resolves list names and media players by fuzzy-matching against available HA entities. For media commands, it automatically picks the active player (playing > paused > first available).
MCP Server (for LLM agents)
The Model Context Protocol (MCP) server exposes Beacon’s features as structured tools that LLM agents can call. This is the best approach for AI-powered automation where an LLM decides which actions to take.
The server supports two transports:
- stdio (default) — for Claude Code, Claude Desktop, and other MCP clients that spawn a subprocess
- Streamable HTTP — for web-based clients like Open Claw, Copilot Studio, and any remote MCP consumer
Option 1: stdio transport (Claude Code, Claude Desktop)
For Claude Code:
claude mcp add beacon -- node /path/to/beacon/mcp-server.cjs
For Claude Desktop or other local MCP clients, add to your config file:
{
"mcpServers": {
"beacon": {
"command": "node",
"args": ["beacon/mcp-server.cjs"],
"env": {
"SUPERVISOR_TOKEN": "your-long-lived-access-token",
"HA_URL": "http://your-ha-instance:8123"
}
}
}
}
Option 2: Streamable HTTP transport (Open Claw, Copilot Studio, remote clients)
Start the server in HTTP mode:
MCP_TRANSPORT=http \
MCP_PORT=3001 \
MCP_API_KEY=your-secret-key \
SUPERVISOR_TOKEN=your-ha-token \
HA_URL=http://your-ha-instance:8123 \
node beacon/mcp-server.cjs
Or use the --http flag:
node beacon/mcp-server.cjs --http
The server exposes:
| Endpoint | Method | Description |
|---|---|---|
/mcp | POST | JSON-RPC request → response |
/mcp | GET | SSE stream (for clients that need server-sent events) |
/health | GET | Health check ({"status": "ok"}) |
Authentication: When MCP_API_KEY is set, all requests must include either:
Authorization: Bearer <key>header, orX-API-Key: <key>header
For Open Claw / other HTTP MCP clients, point them at:
http://your-beacon-host:3001/mcp
For the Beacon HA add-on, the MCP HTTP server can be exposed alongside the web UI. Set MCP_TRANSPORT=http in the add-on configuration to enable it on port 3001.
Environment variables
| Variable | Default | Description |
|---|---|---|
SUPERVISOR_TOKEN | — | Required. HA long-lived access token |
HA_URL | http://supervisor/core | HA URL (change when running outside the add-on) |
DATA_DIR | /data | Beacon data directory (for chore/payout files) |
MCP_TRANSPORT | stdio | Set to http for Streamable HTTP transport |
MCP_PORT | 3001 | HTTP server port (only in HTTP mode) |
MCP_API_KEY | — | API key for HTTP auth (optional; open if unset) |
All 19 tools
Lists
| Tool | Description | Required inputs |
|---|---|---|
beacon_add_list_item | Add an item to a todo list | list_name, item |
beacon_get_list_items | Get all items from a list | list_name |
beacon_check_item | Mark an item as completed | list_name, item |
beacon_uncheck_item | Uncomplete an item | list_name, item |
List names are fuzzy-matched. Pass "grocery", "shopping list", or "todo.shopping_list".
Calendar
| Tool | Description | Required inputs |
|---|---|---|
beacon_get_calendar | Get events for today + N days | days_ahead (optional, default 0) |
beacon_create_event | Create a calendar event | calendar, summary, start, end |
For all-day events, pass date strings ("2026-04-07") and set all_day: true.
Media
| Tool | Description | Required inputs |
|---|---|---|
beacon_get_media_players | List all players and states | (none) |
beacon_media_control | Play, pause, next, previous, volume | entity_id, action |
For volume, also pass volume_level (0.0 to 1.0).
Weather
| Tool | Description | Required inputs |
|---|---|---|
beacon_get_weather | Current weather conditions | entity_id (optional) |
Chores
| Tool | Description | Required inputs |
|---|---|---|
beacon_manage_chore | Complete/uncomplete a chore | action, chore_name, member_name |
beacon_create_chore | Create a new chore | name; optional: assigned_to (array of member names), frequency (daily/weekly/once), max_completions, value_cents, icon |
beacon_update_chore | Update an existing chore | chore_name; optional: name, assigned_to, frequency, max_completions, value_cents, icon |
beacon_delete_chore | Delete a chore and its completions | chore_name |
beacon_list_chores | List all chores with today’s completion status and balances | (none) |
Family & Payouts
| Tool | Description | Required inputs |
|---|---|---|
beacon_list_family_members | List all family members | (none) |
beacon_get_balances | Get each child’s current chore earnings balance | (none) |
beacon_process_payout | Zero a child’s balance and log payout | member_name, parent_name |
Meal Plans
| Tool | Description | Required inputs |
|---|---|---|
beacon_get_meal_plan | Get meal plan entries | date (optional), days (optional) |
beacon_set_meal_plan | Write meal plan data | entries (array of {date, meal_type, name}) |
Example conversation
You: Create a daily chore called “Make bed” for Lennon and Elliott, worth 50 cents each.
The LLM calls
beacon_list_family_membersto confirm names, thenbeacon_create_chorewith name “Make bed”, assigned_to [“Lennon”, “Elliott”], frequency “daily”, value_cents 50.
HA Custom Sentences (for HA Assist)
Beacon ships with custom sentence and intent handler files for Home Assistant Assist. Once installed, you can use voice commands through any Assist-enabled device — smart speakers, the HA companion app, or the Assist dialog in HA.
Available voice commands
| Say this | What happens |
|---|---|
| ”Add milk to the grocery list” | Adds item to your todo list |
| ”Mark dishes as done” | Completes a chore |
| ”Alex finished vacuuming” | Completes a chore for a specific person |
| ”What’s on the calendar today” | Reads today’s events aloud |
| ”What’s on the calendar tomorrow” | Reads tomorrow’s events |
| ”Show the dashboard” | Navigates the Beacon UI |
| ”Set a timer for 5 minutes” | Starts a countdown timer |
| ”What’s on the grocery list” | Reads uncompleted grocery items |
| ”What chores are left” | Lists remaining chores |
Installation
Run the included install script:
# Auto-detect the HA config directory
beacon/scripts/install-voice-intents.sh
# Or specify it
beacon/scripts/install-voice-intents.sh /config
Then reload the Conversation integration: Developer Tools > YAML > Conversation.
Prerequisites
The intents reference these entities by default. Create or rename them to match:
| Entity | Purpose | How to create |
|---|---|---|
todo.grocery | Grocery list | Any HA todo integration |
todo.chores | Chore list | Any HA todo integration |
calendar.family | Calendar | Google Calendar, CalDAV, or Local Calendar |
timer.beacon_voice | Timer | Settings > Helpers > Timer, name “Beacon Voice” |
If your entities have different names, edit the installed YAML files in your HA config directory (custom_intents/beacon.yaml and custom_sentences/en/beacon.yaml).
Customizing
The sentence files use HA’s custom sentence syntax:
[the]means the word is optional{item}captures a text slot- Multiple patterns per intent are supported
To add new phrasings, edit /config/custom_sentences/en/beacon.yaml. To add another language, create a file like /config/custom_sentences/es/beacon.yaml with the same intent names and translated sentences.