Skip to main content
Glama
jgitta

Hubitat MCP Server

by jgitta
README.md
# Hubitat MCP Server

A production-ready **Model Context Protocol (MCP) server** for Hubitat home automation hubs. Control and manage your Hubitat devices directly from Claude Desktop or any MCP-compatible AI assistant.

## Features

✅ **List all devices** — Get a complete inventory of your Hubitat devices with IDs, names, types, and current state  
✅ **Get device details** — Retrieve full device information including capabilities, attributes, and available commands  
✅ **Send commands** — Turn devices on/off, toggle, set brightness/levels, and execute custom commands  
✅ **Query device state** — Check attribute values (temperature, switch state, battery level, etc.)  
✅ **Search devices** — Find devices by name, type, or room  
✅ **List available commands** — See what commands each device supports  

## Requirements

- **Hubitat Elevation Hub** with [Maker API](https://docs.hubitat.com/index.php?title=Maker_API) installed
- **Python 3.10+**
- **MCP Python SDK v2.x**
- Internet connectivity (for Claude Desktop integration)

## Installation

### 1. Clone or download the server

```bash
git clone https://github.com/yourusername/hubitat-mcp-server.git
cd hubitat-mcp-server
```

### 2. Install dependencies

```bash
pip install mcp requests python-dotenv
```

### 3. Configure your Hubitat credentials

Get your Maker API details from your Hubitat hub:
1. Log into your Hubitat hub at `http://[hub-ip]:8080`
2. Go to **Apps** → **Maker API**
3. Note your **App ID** and **Access Token**

Create a `.env` file:

```bash
HUBITAT_TOKEN=your_access_token_here
HUBITAT_BASE_URL=http://[HUB_IP]/apps/api/[APP_ID]  # Replace with your hub IP and App ID
```

Or set environment variables directly:

```bash
export HUBITAT_TOKEN="your_token"
export HUBITAT_BASE_URL="http://[HUB_IP]/apps/api/[APP_ID]"
```

### 4. Test the server locally

```bash
python3 hubitat-mcp-server.py
```

The server will listen on **stdio** and wait for MCP protocol messages.

## Integration with Claude Desktop

Add the server to your Claude Desktop configuration:

**File:** `~/.config/Claude/claude_desktop_config.json`

```json
{
  "mcpServers": {
    "hubitat": {
      "command": "python3",
      "args": ["/path/to/hubitat-mcp-server.py"],
      "env": {
        "HUBITAT_TOKEN": "your_token_here",
        "HUBITAT_BASE_URL": "http://[HUB_IP]/apps/api/[APP_ID]"
      }
    }
  }
}
```

Restart Claude Desktop. The Hubitat tools will now be available.

## Usage Examples

### List all devices

```
Claude: "List all my Hubitat devices"
```

The server returns all 64 devices (or however many you have) with:
- Device ID
- Name (label)
- Type
- Room assignment
- Current state/attributes
- Available capabilities

### Control a device

```
Claude: "Turn on the kitchen light"
```

The server finds the "Kitchen Light" device and sends the `on` command.

### Check device state

```
Claude: "What's the temperature in the living room?"
```

The server queries the temperature sensor and returns the current value.

### Search for devices

```
Claude: "Show me all motion sensors"
```

The server searches for devices matching "motion" and returns all matches.

### Set brightness

```
Claude: "Set the family room light to 50% brightness"
```

The server sends `setLevel` command with value `50` to the appropriate dimmer.

## Available Tools

The server exposes these MCP tools to Claude:

### `list_devices`
Returns all devices with basic info (id, name, type, room, capabilities, status).

### `get_device`
Get detailed information about a specific device.

**Parameters:**
- `device_id` (string): The device ID

### `send_command`
Send a command to a device.

**Parameters:**
- `device_id` (string): The device ID
- `command` (string): Command name (on, off, toggle, setLevel, etc.)
- `value` (string, optional): Command parameter (e.g., brightness level)

### `list_device_commands`
List all available commands for a device.

**Parameters:**
- `device_id` (string): The device ID

### `get_device_attribute`
Get the current value of a specific device attribute.

**Parameters:**
- `device_id` (string): The device ID
- `attribute` (string): Attribute name (switch, level, temperature, etc.)

### `search_devices`
Search for devices by name, type, or room.

**Parameters:**
- `query` (string): Search term

## Architecture

The server uses:
- **MCP Python SDK 2.x** — Model Context Protocol implementation
- **Hubitat Maker API** — Direct access to devices and commands
- **Async/await** — Non-blocking I/O for responsiveness
- **JSON serialization** — Standard protocol messages

## Limitations

- **Read-only for some attributes** — Some device states (like battery level) are read-only
- **Command validation** — The server doesn't validate commands before sending; invalid commands will error at the Hubitat end
- **Real-time updates** — Device state is fetched on-demand; there's no push notification system for state changes
- **Local network only** — Requires direct access to your Hubitat hub (same LAN or VPN)

For cloud access, you can:
1. Use Hubitat's cloud API instead of local
2. Set up a reverse proxy (Caddy, nginx, etc.) with HTTPS
3. Use a VPN to access your home network remotely

## Troubleshooting

### "Device not found" error
- Check the device ID is correct
- Run `list_devices` to see all available IDs

### "Failed to fetch devices from Hubitat"
- Verify your `HUBITAT_TOKEN` and `HUBITAT_BASE_URL`
- Check that the Maker API app is enabled on your hub
- Ensure your device running the server can reach the hub IP

### Commands don't work
- Check the command name is correct for that device type
- Run `list_device_commands device_id` to see available commands
- Some devices may require parameters (e.g., `setLevel` needs a brightness value)

### Server won't start
- Ensure Python 3.10+ is installed: `python3 --version`
- Install dependencies: `pip install mcp requests`
- Check for syntax errors: `python3 -m py_compile hubitat-mcp-server.py`

## Development

### Running in debug mode

```bash
HUBITAT_TOKEN=token HUBITAT_BASE_URL=url python3 -u hubitat-mcp-server.py
```

### Testing individual tools

You can test the server's Python functions directly:

```python
from hubitat_mcp_server import list_devices, get_device, send_command

# List devices
devices = list_devices()

# Get a specific device
device = get_device("140")

# Send a command
result = send_command("140", "on")
```

## Contributing

Contributions are welcome! Potential improvements:
- Support for device/driver configuration
- Real-time WebSocket updates
- Batch command execution
- Device grouping/scenes
- Temperature/humidity/motion sensor subscriptions
- Custom driver support

## License

MIT License — Feel free to use, modify, and distribute.

## Support

For issues, feature requests, or questions:
1. Check the Hubitat Maker API documentation
2. Verify your token and hub URL
3. Run `list_devices` to confirm connectivity
4. Open an issue with device ID and command you're trying to run

## Changelog

**v1.0.0** (2026-09-05)
- Initial release
- List, get, and control devices
- Search and attribute queries
- Full MCP protocol support

---

**Enjoy automating your Hubitat home with Claude!**