
Home Assistant
STDIOHome Assistant MCP server enabling natural language control of smart home devices.
Home Assistant MCP server enabling natural language control of smart home devices.
The server uses the MCP protocol to share access to a local Home Assistant instance with an LLM application.
A powerful bridge between your Home Assistant instance and Language Learning Models (LLMs), enabling natural language control and monitoring of your smart home devices through the Model Context Protocol (MCP). This server provides a comprehensive API for managing your entire Home Assistant ecosystem, from device control to system administration.
The server includes a powerful Server-Sent Events (SSE) system that provides real-time updates from your Home Assistant instance. This allows you to:
const eventSource = new EventSource( 'http://localhost:3000/subscribe_events?token=YOUR_TOKEN&domain=light' ); eventSource.onmessage = (event) => { const data = JSON.parse(event.data); console.log('Update received:', data); };
See SSE_API.md for complete documentation of the SSE system.
Add-on Management
Package Management (HACS)
Automation Management
Intelligent Organization
Robust Architecture
# Clone the repository git clone https://github.com/jango-blockchained/homeassistant-mcp.git cd homeassistant-mcp # Install dependencies npm install # Build the project npm run build
The project includes Docker support for easy deployment and consistent environments across different platforms.
Clone the repository:
git clone https://github.com/jango-blockchained/homeassistant-mcp.git cd homeassistant-mcp
Configure environment:
cp .env.example .env
Edit the .env
file with your Home Assistant configuration:
# Home Assistant Configuration HASS_HOST=http://homeassistant.local:8123 HASS_TOKEN=your_home_assistant_token HASS_SOCKET_URL=ws://homeassistant.local:8123/api/websocket # Server Configuration PORT=3000 NODE_ENV=production DEBUG=false
Build and run with Docker Compose:
# Build and start the containers docker compose up -d # View logs docker compose logs -f # Stop the service docker compose down
Verify the installation:
The server should now be running at http://localhost:3000
. You can check the health endpoint at http://localhost:3000/health
.
Update the application:
# Pull the latest changes git pull # Rebuild and restart the containers docker compose up -d --build
The Docker setup includes:
All environment variables can be configured in the .env
file. The following variables are supported:
HASS_HOST
: Your Home Assistant instance URLHASS_TOKEN
: Long-lived access token for Home AssistantHASS_SOCKET_URL
: WebSocket URL for Home AssistantPORT
: Server port (default: 3000)NODE_ENV
: Environment (production/development)DEBUG
: Enable debug mode (true/false)# Home Assistant Configuration HASS_HOST=http://homeassistant.local:8123 # Your Home Assistant instance URL HASS_TOKEN=your_home_assistant_token # Long-lived access token HASS_SOCKET_URL=ws://homeassistant.local:8123/api/websocket # WebSocket URL # Server Configuration PORT=3000 # Server port (default: 3000) NODE_ENV=production # Environment (production/development) DEBUG=false # Enable debug mode # Test Configuration TEST_HASS_HOST=http://localhost:8123 # Test instance URL TEST_HASS_TOKEN=test_token # Test token
.env.example
to .env.development
.env.example
to .env.production
.env.example
to .env.test
To use your new Home Assistant MCP server, you can add Claude Desktop as a client. Add the following to the configuration. Note this will run the MCP within claude and does not work with the Docker method.
{
"homeassistant": {
"command": "node",
"args": [<path/to/your/dist/folder>]
"env": {
NODE_ENV=development
HASS_HOST=http://homeassistant.local:8123
HASS_TOKEN=your_home_assistant_token
PORT=3000
HASS_SOCKET_URL=ws://homeassistant.local:8123/api/websocket
LOG_LEVEL=debug
}
}
}
{ "tool": "control", "command": "turn_on", // or "turn_off", "toggle" "entity_id": "light.living_room" }
{ "tool": "control", "command": "turn_on", "entity_id": "light.living_room", "brightness": 128, "color_temp": 4000, "rgb_color": [255, 0, 0] }
{ "tool": "addon", "action": "list" }
{ "tool": "addon", "action": "install", "slug": "core_configurator", "version": "5.6.0" }
{ "tool": "addon", "action": "start", // or "stop", "restart" "slug": "core_configurator" }
{ "tool": "package", "action": "list", "category": "integration" // or "plugin", "theme", "python_script", "appdaemon", "netdaemon" }
{ "tool": "package", "action": "install", "category": "integration", "repository": "hacs/integration", "version": "1.32.0" }
{ "tool": "automation_config", "action": "create", "config": { "alias": "Motion Light", "description": "Turn on light when motion detected", "mode": "single", "trigger": [ { "platform": "state", "entity_id": "binary_sensor.motion", "to": "on" } ], "action": [ { "service": "light.turn_on", "target": { "entity_id": "light.living_room" } } ] } }
{ "tool": "automation_config", "action": "duplicate", "automation_id": "automation.motion_light" }
GET /api/state POST /api/state
Manages the current state of the system.
Example Request:
POST /api/state { "context": "living_room", "state": { "lights": "on", "temperature": 22 } }
POST /api/context
Updates the current context with new information.
Example Request:
POST /api/context { "user": "john", "location": "kitchen", "time": "morning", "activity": "cooking" }
POST /api/action
Executes a specified action with given parameters.
Example Request:
POST /api/action { "action": "turn_on_lights", "parameters": { "room": "living_room", "brightness": 80 } }
POST /api/actions/batch
Executes multiple actions in sequence.
Example Request:
POST /api/actions/batch { "actions": [ { "action": "turn_on_lights", "parameters": { "room": "living_room" } }, { "action": "set_temperature", "parameters": { "temperature": 22 } } ] }
GET /api/actions
Returns a list of all available actions.
Example Response:
{ "actions": [ { "name": "turn_on_lights", "parameters": ["room", "brightness"], "description": "Turns on lights in specified room" }, { "name": "set_temperature", "parameters": ["temperature"], "description": "Sets temperature in current context" } ] }
GET /api/context?type=current
Retrieves context information.
Example Response:
{ "current_context": { "user": "john", "location": "kitchen", "time": "morning", "activity": "cooking" } }
The server supports real-time updates via WebSocket connections.
// Client-side connection example const ws = new WebSocket('ws://localhost:3000/ws'); ws.onmessage = (event) => { const data = JSON.parse(event.data); console.log('Received update:', data); };
state_change
: Emitted when system state changescontext_update
: Emitted when context is updatedaction_executed
: Emitted when an action is completederror
: Emitted when an error occursExample Event Data:
{ "event": "state_change", "data": { "previous_state": { "lights": "off" }, "current_state": { "lights": "on" }, "timestamp": "2024-03-20T10:30:00Z" } }
All endpoints return standard HTTP status codes:
Error Response Format:
{ "error": { "code": "INVALID_PARAMETERS", "message": "Missing required parameter: room", "details": { "missing_fields": ["room"] } } }
The API implements rate limiting to prevent abuse:
When rate limit is exceeded, the server returns:
{ "error": { "code": "RATE_LIMIT_EXCEEDED", "message": "Too many requests", "reset_time": "2024-03-20T10:31:00Z" } }
# Get current state curl -X GET \ http://localhost:3000/api/state \ -H 'Authorization: ApiKey your_api_key_here' # Execute action curl -X POST \ http://localhost:3000/api/action \ -H 'Authorization: ApiKey your_api_key_here' \ -H 'Content-Type: application/json' \ -d '{ "action": "turn_on_lights", "parameters": { "room": "living_room", "brightness": 80 } }'
// Execute action async function executeAction() { const response = await fetch('http://localhost:3000/api/action', { method: 'POST', headers: { 'Authorization': 'ApiKey your_api_key_here', 'Content-Type': 'application/json' }, body: JSON.stringify({ action: 'turn_on_lights', parameters: { room: 'living_room', brightness: 80 } }) }); const data = await response.json(); console.log('Action result:', data); }
# Development mode with hot reload npm run dev # Build project npm run build # Production mode npm run start # Run tests npx jest --config=jest.config.cjs # Run tests with coverage npx jest --coverage # Lint code npm run lint # Format code npm run format
Node.js Version (toSorted is not a function
)
nvm install 20.10.0 nvm use 20.10.0
Connection Issues
HASS_HOST
accessibilityAdd-on Management Issues
HACS Integration Issues
Automation Issues
✅ Complete
🚧 In Progress
MIT License - See LICENSE file