Model Context Protocol Server for Home Assistant

Model Context Protocol Server for Home Assistant

Seamlessly connect Home Assistant to LLMs for natural language smart home control via MCP.

468
Stars
41
Forks
468
Watchers
16
Issues
Enables integration between a local Home Assistant instance and language models using the Model Context Protocol (MCP). Facilitates natural language monitoring and control of smart home devices, with robust API support for state management, automation, real-time updates, and system administration. Features secure, token-based access, and supports mobile and HTTP clients. Designed to bridge Home Assistant environments with modern AI-driven automation.

Key Features

Control Home Assistant devices via natural language
Real-time updates through Server-Sent Events (SSE)
Automation creation, updating, and management
Device state monitoring and querying
Secure token-based authentication with rate limiting
Mobile and HTTP client compatibility
Add-on and package management including HACS support
Comprehensive API documentation for extensibility
Selective event subscription for domains or entities
System administration and version management

Use Cases

Enable natural language smart home commands through LLM-powered applications
Monitor and control devices in real time via AI assistants
Programmatically manage and automate Home Assistant devices using LLMs
Integrate mobile applications for smart home control with secure APIs
Receive instant notifications of automation triggers and state changes
Remotely manage add-ons and packages in Home Assistant ecosystems
Enable voice-driven queries and device control via conversational AI
Automate smart home routines and system states using NLP interfaces
Build dashboards that leverage SSE for instant smart home feedback
Support third-party IoT and AI solutions with standardized MCP protocol

README

Model Context Protocol Server for Home Assistant

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.

License Node.js Docker Compose NPM TypeScript Test Coverage

Features

  • 🎮 Device Control: Control any Home Assistant device through natural language
  • 🔄 Real-time Updates: Get instant updates through Server-Sent Events (SSE)
  • 🤖 Automation Management: Create, update, and manage automations
  • 📊 State Monitoring: Track and query device states
  • 🔐 Secure: Token-based authentication and rate limiting
  • 📱 Mobile Ready: Works with any HTTP-capable client

Real-time Updates with SSE

The server includes a powerful Server-Sent Events (SSE) system that provides real-time updates from your Home Assistant instance. This allows you to:

  • 🔄 Get instant state changes for any device
  • 📡 Monitor automation triggers and executions
  • 🎯 Subscribe to specific domains or entities
  • 📊 Track service calls and script executions

Quick SSE Example

javascript
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.

Table of Contents

Key Features

Core Functionality 🎮

  • Smart Device Control
    • 💡 Lights: Brightness, color temperature, RGB color
    • 🌡️ Climate: Temperature, HVAC modes, fan modes, humidity
    • 🚪 Covers: Position and tilt control
    • 🔌 Switches: On/off control
    • 🚨 Sensors & Contacts: State monitoring
    • 🎵 Media Players: Playback control, volume, source selection
    • 🌪️ Fans: Speed, oscillation, direction
    • 🔒 Locks: Lock/unlock control
    • 🧹 Vacuums: Start, stop, return to base
    • 📹 Cameras: Motion detection, snapshots

System Management 🛠️

  • Add-on Management

    • Browse available add-ons
    • Install/uninstall add-ons
    • Start/stop/restart add-ons
    • Version management
    • Configuration access
  • Package Management (HACS)

    • Integration with Home Assistant Community Store
    • Multiple package types support:
      • Custom integrations
      • Frontend themes
      • Python scripts
      • AppDaemon apps
      • NetDaemon apps
    • Version control and updates
    • Repository management
  • Automation Management

    • Create and edit automations
    • Advanced configuration options:
      • Multiple trigger types
      • Complex conditions
      • Action sequences
      • Execution modes
    • Duplicate and modify existing automations
    • Enable/disable automation rules
    • Trigger automation manually

Architecture Features 🏗️

  • Intelligent Organization

    • Area and floor-based device grouping
    • State monitoring and querying
    • Smart context awareness
    • Historical data access
  • Robust Architecture

    • Comprehensive error handling
    • State validation
    • Secure API integration
    • TypeScript type safety
    • Extensive test coverage

Prerequisites

  • Node.js 20.10.0 or higher
  • NPM package manager
  • Docker Compose for containerization
  • Running Home Assistant instance
  • Home Assistant long-lived access token (How to get token)
  • HACS installed for package management features
  • Supervisor access for add-on management

Installation

Basic Setup

bash
# 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

Docker Setup (Recommended)

The project includes Docker support for easy deployment and consistent environments across different platforms.

  1. Clone the repository:

    bash
    git clone https://github.com/jango-blockchained/homeassistant-mcp.git
    cd homeassistant-mcp
    
  2. Configure environment:

    bash
    cp .env.example .env
    

    Edit the .env file with your Home Assistant configuration:

    env
    # 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
    
  3. Build and run with Docker Compose:

    bash
    # Build and start the containers
    docker compose up -d
    
    # View logs
    docker compose logs -f
    
    # Stop the service
    docker compose down
    
  4. Verify the installation: The server should now be running at http://localhost:3000. You can check the health endpoint at http://localhost:3000/health.

  5. Update the application:

    bash
    # Pull the latest changes
    git pull
    
    # Rebuild and restart the containers
    docker compose up -d --build
    

Docker Configuration

The Docker setup includes:

  • Multi-stage build for optimal image size
  • Health checks for container monitoring
  • Volume mounting for environment configuration
  • Automatic container restart on failure
  • Exposed port 3000 for API access

Docker Compose Environment Variables

All environment variables can be configured in the .env file. The following variables are supported:

  • HASS_HOST: Your Home Assistant instance URL
  • HASS_TOKEN: Long-lived access token for Home Assistant
  • HASS_SOCKET_URL: WebSocket URL for Home Assistant
  • PORT: Server port (default: 3000)
  • NODE_ENV: Environment (production/development)
  • DEBUG: Enable debug mode (true/false)

Configuration

Environment Variables

env
# 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

Configuration Files

  1. Development: Copy .env.example to .env.development
  2. Production: Copy .env.example to .env.production
  3. Testing: Copy .env.example to .env.test

Adding to Claude Desktop (or other clients)

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
    }
  }
}

API Reference

Device Control

Common Entity Controls

json
{
  "tool": "control",
  "command": "turn_on",  // or "turn_off", "toggle"
  "entity_id": "light.living_room"
}

Light Control

json
{
  "tool": "control",
  "command": "turn_on",
  "entity_id": "light.living_room",
  "brightness": 128,
  "color_temp": 4000,
  "rgb_color": [255, 0, 0]
}

Add-on Management

List Available Add-ons

json
{
  "tool": "addon",
  "action": "list"
}

Install Add-on

json
{
  "tool": "addon",
  "action": "install",
  "slug": "core_configurator",
  "version": "5.6.0"
}

Manage Add-on State

json
{
  "tool": "addon",
  "action": "start",  // or "stop", "restart"
  "slug": "core_configurator"
}

Package Management

List HACS Packages

json
{
  "tool": "package",
  "action": "list",
  "category": "integration"  // or "plugin", "theme", "python_script", "appdaemon", "netdaemon"
}

Install Package

json
{
  "tool": "package",
  "action": "install",
  "category": "integration",
  "repository": "hacs/integration",
  "version": "1.32.0"
}

Automation Management

Create Automation

json
{
  "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"
        }
      }
    ]
  }
}

Duplicate Automation

json
{
  "tool": "automation_config",
  "action": "duplicate",
  "automation_id": "automation.motion_light"
}

Core Functions

State Management

http
GET /api/state
POST /api/state

Manages the current state of the system.

Example Request:

json
POST /api/state
{
  "context": "living_room",
  "state": {
    "lights": "on",
    "temperature": 22
  }
}

Context Updates

http
POST /api/context

Updates the current context with new information.

Example Request:

json
POST /api/context
{
  "user": "john",
  "location": "kitchen",
  "time": "morning",
  "activity": "cooking"
}

Action Endpoints

Execute Action

http
POST /api/action

Executes a specified action with given parameters.

Example Request:

json
POST /api/action
{
  "action": "turn_on_lights",
  "parameters": {
    "room": "living_room",
    "brightness": 80
  }
}

Batch Actions

http
POST /api/actions/batch

Executes multiple actions in sequence.

Example Request:

json
POST /api/actions/batch
{
  "actions": [
    {
      "action": "turn_on_lights",
      "parameters": {
        "room": "living_room"
      }
    },
    {
      "action": "set_temperature",
      "parameters": {
        "temperature": 22
      }
    }
  ]
}

Query Functions

Get Available Actions

http
GET /api/actions

Returns a list of all available actions.

Example Response:

json
{
  "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"
    }
  ]
}

Context Query

http
GET /api/context?type=current

Retrieves context information.

Example Response:

json
{
  "current_context": {
    "user": "john",
    "location": "kitchen",
    "time": "morning",
    "activity": "cooking"
  }
}

WebSocket Events

The server supports real-time updates via WebSocket connections.

javascript
// 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);
};

Supported Events

  • state_change: Emitted when system state changes
  • context_update: Emitted when context is updated
  • action_executed: Emitted when an action is completed
  • error: Emitted when an error occurs

Example Event Data:

json
{
  "event": "state_change",
  "data": {
    "previous_state": {
      "lights": "off"
    },
    "current_state": {
      "lights": "on"
    },
    "timestamp": "2024-03-20T10:30:00Z"
  }
}

Error Handling

All endpoints return standard HTTP status codes:

  • 200: Success
  • 400: Bad Request
  • 401: Unauthorized
  • 403: Forbidden
  • 404: Not Found
  • 500: Internal Server Error

Error Response Format:

json
{
  "error": {
    "code": "INVALID_PARAMETERS",
    "message": "Missing required parameter: room",
    "details": {
      "missing_fields": ["room"]
    }
  }
}

Rate Limiting

The API implements rate limiting to prevent abuse:

  • 100 requests per minute per IP for regular endpoints
  • 1000 requests per minute per IP for WebSocket connections

When rate limit is exceeded, the server returns:

json
{
  "error": {
    "code": "RATE_LIMIT_EXCEEDED",
    "message": "Too many requests",
    "reset_time": "2024-03-20T10:31:00Z"
  }
}

Example Usage

Using curl

bash
# 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
    }
  }'

Using JavaScript

javascript
// 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

bash
# 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

Troubleshooting

Common Issues

  1. Node.js Version (toSorted is not a function)

    • Solution: Update to Node.js 20.10.0+
    bash
    nvm install 20.10.0
    nvm use 20.10.0
    
  2. Connection Issues

    • Verify Home Assistant is running
    • Check HASS_HOST accessibility
    • Validate token permissions
    • Ensure WebSocket connection for real-time updates
  3. Add-on Management Issues

    • Verify Supervisor access
    • Check add-on compatibility
    • Validate system resources
  4. HACS Integration Issues

    • Verify HACS installation
    • Check HACS integration status
    • Validate repository access
  5. Automation Issues

    • Verify entity availability
    • Check trigger conditions
    • Validate service calls
    • Monitor execution logs

Project Status

Complete

  • Entity, Floor, and Area access
  • Device control (Lights, Climate, Covers, Switches, Contacts)
  • Add-on management system
  • Package management through HACS
  • Advanced automation configuration
  • Basic state management
  • Error handling and validation
  • Docker containerization
  • Jest testing setup
  • TypeScript integration
  • Environment variable management
  • Home Assistant API integration
  • Project documentation

🚧 In Progress

  • WebSocket implementation for real-time updates
  • Enhanced security features
  • Tool organization optimization
  • Performance optimization
  • Resource context integration
  • API documentation generation
  • Multi-platform desktop integration
  • Advanced error recovery
  • Custom prompt testing
  • Enhanced macOS integration
  • Type safety improvements
  • Testing coverage expansion

Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Implement your changes
  4. Add tests for new functionality
  5. Ensure all tests pass
  6. Submit a pull request

Resources

License

MIT License - See LICENSE file

Star History

Star History Chart

Repository Owner

tevonsb
tevonsb

User

Repository Details

Language TypeScript
Default Branch main
Size 292 KB
Contributors 3
License Apache License 2.0
MCP Verified Nov 12, 2025

Programming Languages

TypeScript
96.64%
JavaScript
1.68%
Shell
1.55%
Dockerfile
0.14%

Tags

Join Our Newsletter

Stay updated with the latest AI tools, news, and offers by subscribing to our weekly newsletter.

We respect your privacy. Unsubscribe at any time.

Related MCPs

Discover similar Model Context Protocol servers

  • Plugwise MCP Server

    Plugwise MCP Server

    TypeScript-based Model Context Protocol server for Plugwise smart home integration.

    Plugwise MCP Server is a TypeScript-based server that implements the Model Context Protocol (MCP) for integrating Plugwise smart home devices. It enables automatic discovery and secure management of Plugwise hubs, provides control over thermostats, switches, and smart plugs, and supports real-time device updates and energy monitoring. Designed for compatibility with popular MCP clients such as Claude Desktop, Cline, Cursor, and VS Code Copilot via standard I/O transport, it offers robust support for multiple hubs and both mock and real hardware environments.

    • 0
    • MCP
    • Tommertom/plugwise-mcp
  • FastMCP

    FastMCP

    The fast, Pythonic way to build MCP servers and clients.

    FastMCP is a production-ready framework for building Model Context Protocol (MCP) applications in Python. It streamlines the creation of MCP servers and clients, providing advanced features such as enterprise authentication, composable tools, OpenAPI/FastAPI generation, server proxying, deployment tools, and comprehensive client libraries. Designed for ease of use, it offers both standard protocol support and robust utilities for production deployments.

    • 20,201
    • MCP
    • jlowin/fastmcp
  • mcp-cli

    mcp-cli

    A command-line inspector and client for the Model Context Protocol

    mcp-cli is a command-line interface tool designed to interact with Model Context Protocol (MCP) servers. It allows users to run and connect to MCP servers from various sources, inspect available tools, resources, and prompts, and execute commands non-interactively or interactively. The tool supports OAuth for various server types, making integration and automation seamless for developers working with MCP-compliant servers.

    • 391
    • MCP
    • wong2/mcp-cli
  • HackMD MCP Server

    HackMD MCP Server

    MCP server connecting LLM clients to the HackMD collaborative note platform.

    HackMD MCP Server implements the Model Context Protocol (MCP) to provide a standardized interface between large language model (LLM) clients and the HackMD collaborative note service. Through HTTP and STDIO transports, it enables creation, retrieval, update, and deletion of notes, along with management of teams, user profiles, and history data. It supports deployment in both local and cloud environments, with secure API token-based authentication and configuration via environment variables or HTTP headers.

    • 43
    • MCP
    • yuna0x0/hackmd-mcp
  • Oura MCP Server

    Oura MCP Server

    Enables language models to access Oura sleep, readiness, and resilience data via MCP.

    Oura MCP Server implements the Model Context Protocol to provide language models with access to Oura API data. It allows querying of sleep, readiness, and resilience metrics for specified date ranges or for the current day. The server supports integration with tools like Claude for Desktop and handles API authentication and error scenarios gracefully. Designed for seamless access to personal health metrics through standardized protocol endpoints.

    • 34
    • MCP
    • tomekkorbak/oura-mcp-server
  • mcp-time

    mcp-time

    A Model Context Protocol server for time and date operations

    mcp-time is a Model Context Protocol (MCP) server that enables AI assistants and MCP clients to perform standardized time and date-related operations. It provides natural language parsing for relative time expressions, supports flexible formatting, and allows manipulation and comparison of times. The server offers multiple integration methods, including stdio, HTTP stream, Docker, and npx for compatibility with various clients. It is designed for robust time handling and easy integration with AI tools.

    • 8
    • MCP
    • TheoBrigitte/mcp-time
  • Didn't find tool you were looking for?

    Be as detailed as possible for better results