Compare commits

..

16 Commits

Author SHA1 Message Date
jango-blockchained
6fa88be433 docs: Enhance MkDocs configuration with advanced features and styling
- Upgrade MkDocs Material theme with modern navigation and UI features
- Add comprehensive markdown extensions and plugin configurations
- Introduce new JavaScript and CSS for improved documentation experience
- Update documentation requirements with latest plugin versions
- Implement dark mode enhancements and code block improvements
- Expand navigation structure and add new documentation sections
2025-02-06 04:00:27 +01:00
jango-blockchained
2892f24030 docs: Revert to standard git revision date plugin
- Replace mkdocs-git-revision-date-localized-plugin with mkdocs-git-revision-date-plugin
- Update plugin configuration in mkdocs.yml
- Modify documentation requirements to use standard revision date plugin
2025-02-05 23:56:08 +01:00
jango-blockchained
1e3442db14 docs: Update git revision date plugin to localized version
- Replace mkdocs-git-revision-date-plugin with mkdocs-git-revision-date-localized-plugin
- Update plugin version in mkdocs.yml configuration
- Upgrade plugin version in documentation requirements
2025-02-05 23:48:12 +01:00
jango-blockchained
f74154d96f docs: Disable social cards and pin social plugin version
- Modify MkDocs configuration to disable social cards
- Pin mkdocs-social-plugin to version 0.1.0 in requirements
- Prevent potential issues with social card generation
2025-02-05 23:41:08 +01:00
jango-blockchained
36d83e0a0e docs: Update MkDocs documentation configuration and dependencies
- Modify mkdocstrings plugin configuration to use default Python handler
- Update documentation requirements to include mkdocstrings-python
- Simplify MkDocs plugin configuration for documentation generation
2025-02-05 23:38:17 +01:00
jango-blockchained
33defac76c docs: Refine MkDocs configuration and GitHub Actions deployment
- Update site name, description, and documentation structure
- Enhance MkDocs theme features and navigation
- Modify documentation navigation to use nested structure
- Improve GitHub Actions workflow with more robust deployment steps
- Add site directory configuration for GitHub Pages
2025-02-05 23:35:20 +01:00
jango-blockchained
4306a6866f docs: Simplify documentation site configuration and deployment
- Streamline MkDocs navigation structure
- Reduce complexity in GitHub Actions documentation workflow
- Update documentation dependencies and requirements
- Simplify site name and deployment configuration
2025-02-05 23:29:50 +01:00
jango-blockchained
039f6890a7 housekeeping 2025-02-05 23:24:26 +01:00
jango-blockchained
4fff318ea9 docs: Enhance documentation deployment and site configuration
- Update MkDocs configuration with new features and plugins
- Add deployment guide for documentation
- Restructure documentation navigation and index page
- Create GitHub Actions workflow for automatic documentation deployment
- Fix typos in site URLs and configuration
2025-02-05 21:07:39 +01:00
jango-blockchained
ea6efd553d feat: Add speech-to-text example and documentation
- Create comprehensive README for speech-to-text integration
- Implement example script demonstrating wake word detection and transcription
- Add Windows batch script for MCP server startup
- Include detailed usage instructions, customization options, and troubleshooting guide
2025-02-05 20:32:07 +01:00
jango-blockchained
d45ef5c622 docs: Update MkDocs site configuration for Advanced Home Assistant MCP
- Rename site name to "Advanced Home Assistant MCP"
- Update site and repository URLs to match new project
- Modify copyright year and attribution
2025-02-05 12:58:44 +01:00
jango-blockchained
9358f83229 docs: Add Smithery AI badge to project README 2025-02-05 12:52:57 +01:00
jango-blockchained
e49d31d725 docs: Enhance GitHub Actions documentation deployment workflow
- Improve documentation deployment process with more robust Git configuration
- Add explicit Git user setup for GitHub Actions
- Modify deployment script to create a clean gh-pages branch
- Ensure precise documentation site generation and deployment
2025-02-05 12:46:17 +01:00
jango-blockchained
13a27e1d00 docs: update MkDocs configuration and documentation structure
- Refactor mkdocs.yml with new project name and simplified configuration
- Update GitHub Actions workflow to use MkDocs Material deployment
- Add new configuration files for Claude Desktop
- Reorganize documentation navigation and structure
- Update CSS and JavaScript references
2025-02-05 12:44:26 +01:00
jango-blockchained
3e7f3920b2 docs: update project documentation with simplified, focused content
- Streamline README, API, architecture, and usage documentation
- Reduce complexity and focus on core functionality
- Update roadmap with more pragmatic, near-term goals
- Simplify contributing guidelines
- Improve overall documentation clarity and readability
2025-02-05 10:40:27 +01:00
jango-blockchained
8f8e3bd85e refactor: improve device control and listing tool error handling and filtering
- Enhance error handling in control tool with more specific domain validation
- Modify list devices tool to use direct filtering instead of manual iteration
- Add more descriptive success messages for different device domains and services
- Simplify device state filtering logic in list devices tool
2025-02-05 09:37:20 +01:00
28 changed files with 1181 additions and 1622 deletions

View File

@@ -1,64 +1,34 @@
name: Deploy Documentation to GitHub Pages name: Deploy Documentation
on: on:
push: push:
branches: branches:
- main - main
paths: paths:
- 'docs/**' - 'docs/**'
- '.github/workflows/deploy-docs.yml' - 'mkdocs.yml'
permissions:
contents: read
pages: write
id-token: write
# Allow only one concurrent deployment
concurrency:
group: "pages"
cancel-in-progress: true
jobs: jobs:
build: deploy:
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions:
contents: write
steps: steps:
- name: Checkout - uses: actions/checkout@v4
uses: actions/checkout@v4
- name: Setup Ruby
uses: ruby/setup-ruby@v1
with: with:
ruby-version: '3.2' fetch-depth: 0
bundler-cache: true - uses: actions/setup-python@v5
cache-version: 0 with:
python-version: '3.x'
- name: Setup Pages cache: 'pip'
uses: actions/configure-pages@v4
- name: Install dependencies - name: Install dependencies
run: | run: |
cd docs python -m pip install --upgrade pip
bundle install pip install -r docs/requirements.txt
- name: Configure Git
- name: Build site
run: | run: |
cd docs git config --global user.name "github-actions[bot]"
bundle exec jekyll build git config --global user.email "github-actions[bot]@users.noreply.github.com"
env: - name: Build and Deploy
JEKYLL_ENV: production run: |
mkdocs build --strict
- name: Upload artifact mkdocs gh-deploy --force --clean
uses: actions/upload-pages-artifact@v3
with:
path: docs/_site
deploy:
needs: build
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4

View File

@@ -1,32 +0,0 @@
name: Deploy Documentation
on:
push:
branches:
- main
paths:
- 'docs/**'
- 'mkdocs.yml'
permissions:
contents: write
jobs:
deploy-docs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: 3.x
- name: Install dependencies
run: |
pip install mkdocs-material
pip install mkdocs
- name: Deploy documentation
run: mkdocs gh-deploy --force

4
.gitignore vendored
View File

@@ -31,7 +31,7 @@ wheels/
venv/ venv/
ENV/ ENV/
env/ env/
.venv/
# Logs # Logs
logs logs
*.log *.log
@@ -90,3 +90,5 @@ __pycache__/
*$py.class *$py.class
models/ models/
*.code-workspace

333
README.md
View File

@@ -1,305 +1,126 @@
# 🚀 MCP Server for Home Assistant - Bringing AI-Powered Smart Homes to Life! # MCP Server for Home Assistant 🏠🤖
[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) [![Bun](https://img.shields.io/badge/bun-%3E%3D1.0.26-black)](https://bun.sh) [![TypeScript](https://img.shields.io/badge/typescript-%5E5.0.0-blue.svg)](https://www.typescriptlang.org) [![smithery badge](https://smithery.ai/badge/@jango-blockchained/advanced-homeassistant-mcp)](https://smithery.ai/server/@jango-blockchained/advanced-homeassistant-mcp)
[![Bun](https://img.shields.io/badge/bun-%3E%3D1.0.26-black)](https://bun.sh)
[![TypeScript](https://img.shields.io/badge/typescript-%5E5.0.0-blue.svg)](https://www.typescriptlang.org)
[![Test Coverage](https://img.shields.io/badge/coverage-95%25-brightgreen.svg)](#)
[![Documentation](https://img.shields.io/badge/docs-github.io-blue.svg)](https://jango-blockchained.github.io/homeassistant-mcp/)
[![Docker](https://img.shields.io/badge/docker-%3E%3D20.10.8-blue)](https://www.docker.com)
---
## Overview 🌐 ## Overview 🌐
Welcome to the **Model Context Protocol (MCP) Server for Home Assistant**! This robust platform bridges Home Assistant with cutting-edge Language Learning Models (LLMs), enabling natural language interactions and real-time automation of your smart devices. Imagine entering your home, saying: MCP (Model Context Protocol) Server is a lightweight integration tool for Home Assistant, providing a flexible interface for device management and automation.
> "Hey MCP, dim the lights and start my evening playlist," ## Core Features ✨
and watching your home transform instantly—that's the magic that MCP Server delivers! - 🔌 Basic device control via REST API
- 📡 WebSocket/Server-Sent Events (SSE) for state updates
- 🤖 Simple automation rule management
- 🔐 JWT-based authentication
--- ## Prerequisites 📋
## Key Benefits ✨ - 🚀 Bun runtime (v1.0.26+)
- 🏡 Home Assistant instance
- 🐳 Docker (optional, recommended for deployment)
### 🎮 Device Control & Monitoring ## Installation 🛠️
- **Voice-Controlled Automation:**
Use simple commands like "Turn on the kitchen lights" or "Set the thermostat to 22°C" without touching a switch.
**Real-World Example:**
In the morning, say "Good morning! Open the blinds and start the coffee machine" to kickstart your day automatically.
- **Real-Time Communication:** ### Docker Deployment (Recommended)
Experience sub-100ms latency updates via Server-Sent Events (SSE) or WebSocket connections, ensuring your dashboard is always current.
**Real-World Example:**
Monitor energy usage instantly during peak hours and adjust remotely for efficient consumption.
- **Seamless Automation:**
Create scene-based rules to synchronize multiple devices effortlessly.
**Real-World Example:**
For movie nights, have MCP dim the lights, adjust the sound system, and launch your favorite streaming app with just one command.
### 🤖 AI-Powered Enhancements
- **Natural Language Processing (NLP):**
Convert everyday speech into actionable commands—just say, "Prepare the house for dinner," and MCP will adjust lighting, temperature, and even play soft background music.
- **Predictive Automation & Suggestions:**
Receive proactive recommendations based on usage habits and environmental trends.
**Real-World Example:**
When home temperature fluctuates unexpectedly, MCP suggests an optimal setting and notifies you immediately.
- **Anomaly Detection:**
Continuously monitor device activity and alert you to unusual behavior, helping prevent malfunctions or potential security breaches.
---
## Architectural Overview 🏗
Our architecture is engineered for performance, scalability, and security. The following Mermaid diagram illustrates the data flow and component interactions:
```mermaid
graph TD
subgraph Client
A["Client Application (Web/Mobile/Voice)"]
end
subgraph CDN
B["CDN / Cache"]
end
subgraph Server
C["Bun Native Server"]
E["NLP Engine & Language Processing Module"]
end
subgraph Integration
D["Home Assistant (Devices, Lights, Thermostats)"]
end
A -->|HTTP Request| B
B -- Cache Miss --> C
C -->|Interpret Command| E
E -->|Determine Action| D
D -->|Return State/Action| C
C -->|Response| B
B -->|Cached/Processed Response| A
```
Learn more about our architecture in the [Architecture Documentation](docs/architecture.md).
---
## Technical Stack 🔧
Our solution is built on a modern, high-performance stack that powers every feature:
- **Bun:**
A next-generation JavaScript runtime offering rapid startup times, native TypeScript support, and high performance.
👉 [Learn about Bun](https://bun.sh)
- **Bun Native Server:**
Utilizes Bun's built-in HTTP server to efficiently process API requests with sub-100ms response times.
👉 See the [Installation Guide](docs/getting-started/installation.md) for details.
- **Natural Language Processing (NLP) & LLM Integration:**
Processes and interprets natural language commands using state-of-the-art LLMs and custom NLP modules.
👉 Find API usage details in the [API Documentation](docs/api.md).
- **Home Assistant Integration:**
Provides seamless connectivity with Home Assistant, ensuring flawless communication with your smart devices.
👉 Refer to the [Usage Guide](docs/usage.md) for more information.
- **Redis Cache:**
Enables rapid data retrieval and session persistence essential for real-time updates.
- **TypeScript:**
Enhances type safety and developer productivity across the entire codebase.
- **JWT & Security Middleware:**
Protects your ecosystem with JWT-based authentication, request sanitization, rate-limiting, and encryption.
- **Containerization with Docker:**
Enables scalable, isolated deployments for production environments.
For further technical details, check out our [Documentation Index](docs/index.md).
---
## Installation 🛠
### Installing via Smithery
To install Home Assistant MCP Server for Claude Desktop automatically via [Smithery](https://smithery.ai/server/@jango-blockchained/advanced-homeassistant-mcp):
```bash ```bash
npx -y @smithery/cli install @jango-blockchained/advanced-homeassistant-mcp --client claude # Clone the repository
``` git clone https://github.com/jango-blockchained/homeassistant-mcp.git
cd homeassistant-mcp
### 🐳 Docker Setup (Recommended) # Copy and edit environment configuration
cp .env.example .env
# Edit .env with your Home Assistant credentials
For a hassle-free, containerized deployment: # Build and start containers
```bash
# 1. Clone the repository (using a shallow copy for efficiency)
git clone --depth 1 https://github.com/jango-blockchained/homeassistant-mcp.git
# 2. Configure your environment: copy the example file and edit it with your Home Assistant credentials
cp .env.example .env # Modify .env with your Home Assistant host, tokens, etc.
# 3. Build and run the Docker containers
docker compose up -d --build docker compose up -d --build
# 4. View real-time logs (last 50 log entries)
docker compose logs -f --tail=50
``` ```
👉 Refer to our [Installation Guide](docs/getting-started/installation.md) for full details. ### Bare Metal Installation
### 💻 Bare Metal Installation
For direct deployment on your host machine:
```bash ```bash
# 1. Install Bun (if not already installed) # Install Bun
curl -fsSL https://bun.sh/install | bash curl -fsSL https://bun.sh/install | bash
# 2. Install project dependencies with caching support # Clone the repository
bun install --frozen-lockfile git clone https://github.com/jango-blockchained/homeassistant-mcp.git
cd homeassistant-mcp
# 3. Launch the server in development mode with hot-reload enabled # Install dependencies
bun run dev --watch bun install
# Start the server
bun run dev
``` ```
--- ## Basic Usage 🖥️
## Real-World Usage Examples 🔍 ### Device Control Example
### 📱 Smart Home Dashboard Integration ```typescript
Integrate MCP's real-time updates into your custom dashboard for a dynamic smart home experience: // Turn on a light
const response = await fetch('http://localhost:3000/api/devices/light.living_room', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
},
body: JSON.stringify({ state: 'on' })
});
```
```javascript ### WebSocket State Updates
const eventSource = new EventSource('http://localhost:3000/subscribe_events?token=YOUR_TOKEN&domain=light');
eventSource.onmessage = (event) => { ```typescript
const data = JSON.parse(event.data); const ws = new WebSocket('ws://localhost:3000/devices');
console.log('Real-time update:', data); ws.onmessage = (event) => {
// Update your UI dashboard, e.g., refresh a light intensity indicator. const deviceState = JSON.parse(event.data);
console.log('Device state updated:', deviceState);
}; };
``` ```
### 🏠 Voice-Activated Control ## Current Limitations ⚠️
Utilize voice commands to trigger actions with minimal effort:
```javascript - 🎙️ Basic voice command support (work in progress)
// Establish a WebSocket connection for real-time command processing - 🧠 Limited advanced NLP capabilities
const ws = new WebSocket('wss://mcp.yourha.com/ws'); - 🔗 Minimal third-party device integration
- 🐛 Early-stage error handling
ws.onmessage = ({ data }) => {
const update = JSON.parse(data);
if (update.entity_id === 'light.living_room') {
console.log('Adjusting living room lighting based on voice command...');
// Additional logic to update your UI or trigger further actions can go here.
}
};
// Simulate processing a voice command
function simulateVoiceCommand(command) {
console.log("Processing voice command:", command);
// Integrate with your actual voice-to-text system as needed.
}
simulateVoiceCommand("Turn off all the lights for bedtime");
```
👉 Learn more in our [Usage Guide](docs/usage.md).
---
## Update Strategy 🔄
Maintain a seamless operation with zero downtime updates:
```bash
# 1. Pull the latest Docker images
docker compose pull
# 2. Rebuild and restart containers smoothly
docker compose up -d --build
# 3. Clean up unused Docker images to free up space
docker system prune -f
```
For more details, review our [Troubleshooting & Updates](docs/troubleshooting.md).
---
## Security Features 🔐
We prioritize the security of your smart home with multiple layers of defense:
- **JWT Authentication 🔑:** Secure, token-based API access to prevent unauthorized usage.
- **Request Sanitization 🧼:** Automatic filtering and validation of API requests to combat injection attacks.
- **Rate Limiting & Fail2Ban 🚫:** Monitors requests to prevent brute force and DDoS attacks.
- **End-to-End Encryption 🔒:** Ensures that your commands and data remain private during transmission.
---
## Contributing 🤝 ## Contributing 🤝
We value community contributions! Here's how you can help improve MCP Server: 1. Fork the repository
1. **Fork the Repository 🍴** 2. Create a feature branch:
Create your own copy of the project.
2. **Create a Feature Branch 🌿**
```bash ```bash
git checkout -b feature/your-feature-name git checkout -b feature/your-feature
``` ```
3. **Install Dependencies & Run Tests 🧪** 3. Make your changes
4. Run tests:
```bash ```bash
bun install bun test
bun test --coverage
``` ```
4. **Make Your Changes & Commit 📝** 5. Submit a pull request
Follow the [Conventional Commits](https://www.conventionalcommits.org) guidelines.
5. **Open a Pull Request 🔀**
Submit your changes for review.
Read more in our [Contribution Guidelines](docs/contributing.md). ## Roadmap 🗺️
--- - 🎤 Enhance voice command processing
- 🔌 Improve device compatibility
- 🤖 Expand automation capabilities
- 🛡️ Implement more robust error handling
## Roadmap & Future Enhancements 🔮 ## License 📄
We're continuously evolving MCP Server. Upcoming features include: MIT License. See [LICENSE](LICENSE) for details.
- **AI Assistant Integration (Q4 2024):**
Smarter, context-aware voice commands and personalized automation.
- **Predictive Automation (Q1 2025):**
Enhanced scheduling capabilities powered by advanced AI.
- **Enhanced Security (Q2 2024):**
Introduction of multi-factor authentication, advanced monitoring, and rigorous encryption methods.
- **Performance Optimizations (Q3 2024):**
Reducing latency further, optimizing caching, and improving load balancing.
For more details, see our [Roadmap](docs/roadmap.md). ## Support 🆘
--- - 🐞 [GitHub Issues](https://github.com/jango-blockchained/homeassistant-mcp/issues)
- 📖 Documentation: [Project Docs](https://jango-blockchained.github.io/homeassistant-mcp/)
## Community & Support 🌍 ## MCP Client Integration 🔗
Your feedback and collaboration are vital! Join our community:
- **GitHub Issues:** Report bugs or request features via our [Issues Page](https://github.com/jango-blockchained/homeassistant-mcp/issues).
- **Discord & Slack:** Connect with fellow users and developers in real-time.
- **Documentation:** Find comprehensive guides on the [MCP Documentation Website](https://jango-blockchained.github.io/homeassistant-mcp/).
---
## License 📜
This project is licensed under the MIT License. See [LICENSE](LICENSE) for full details.
---
🔋 Batteries included.
## MCP Client Integration
This MCP server can be integrated with various clients that support the Model Context Protocol. Below are instructions for different client integrations: This MCP server can be integrated with various clients that support the Model Context Protocol. Below are instructions for different client integrations:
### Cursor Integration ### Cursor Integration 🖱️
The server can be integrated with Cursor by adding the configuration to `.cursor/config/config.json`: The server can be integrated with Cursor by adding the configuration to `.cursor/config/config.json`:
@@ -318,7 +139,7 @@ The server can be integrated with Cursor by adding the configuration to `.cursor
} }
``` ```
### Claude Desktop Integration ### Claude Desktop Integration 💬
For Claude Desktop, add the following to your Claude configuration file: For Claude Desktop, add the following to your Claude configuration file:
@@ -336,7 +157,7 @@ For Claude Desktop, add the following to your Claude configuration file:
} }
``` ```
### Cline Integration ### Cline Integration 📟
For Cline-based clients, add the following configuration: For Cline-based clients, add the following configuration:
@@ -361,7 +182,7 @@ For Cline-based clients, add the following configuration:
} }
``` ```
### Command Line Usage ### Command Line Usage 💻
#### Windows #### Windows
A CMD script is provided in the `scripts` directory. To use it: A CMD script is provided in the `scripts` directory. To use it:

View File

@@ -1,22 +1,29 @@
# Use Python slim image as builder # Use Python slim image as builder
FROM python:3.10-slim as builder FROM python:3.10-slim AS builder
# Install build dependencies # Install build dependencies
RUN apt-get update && apt-get install -y \ RUN apt-get update && apt-get install -y \
git \ git \
build-essential \ curl \
portaudio19-dev \ wget
&& rm -rf /var/lib/apt/lists/*
# Create and activate virtual environment # Create and activate virtual environment
RUN python -m venv /opt/venv RUN python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH" ENV PATH="/opt/venv/bin:$PATH"
# Install Python dependencies with specific versions and CPU-only variants # Install Python dependencies with specific versions and CPU-only variants
RUN pip install --no-cache-dir "numpy>=1.24.3,<2.0.0" && \ RUN pip install --no-cache-dir \
pip install --no-cache-dir torch==2.1.2 torchaudio==2.1.2 --index-url https://download.pytorch.org/whl/cpu && \ "numpy>=1.24.3,<2.0" \
pip install --no-cache-dir faster-whisper==0.10.0 openwakeword==0.4.0 pyaudio==0.2.14 sounddevice==0.4.6 requests==2.31.0 && \ "sounddevice" \
pip freeze > /opt/venv/requirements.txt "openwakeword" \
"faster-whisper" \
"transformers" \
"torch" \
"torchaudio" \
"huggingface_hub" \
"requests" \
"soundfile" \
"tflite-runtime"
# Create final image # Create final image
FROM python:3.10-slim FROM python:3.10-slim
@@ -28,31 +35,48 @@ ENV PATH="/opt/venv/bin:$PATH"
# Install audio dependencies # Install audio dependencies
RUN apt-get update && apt-get install -y \ RUN apt-get update && apt-get install -y \
portaudio19-dev \ portaudio19-dev \
python3-pyaudio \
alsa-utils \
libasound2 \
libasound2-plugins \
pulseaudio \ pulseaudio \
pulseaudio-utils \ alsa-utils \
libpulse0 \ curl \
libportaudio2 \ wget
&& rm -rf /var/lib/apt/lists/* \
&& mkdir -p /var/run/pulse /var/lib/pulse
# Create necessary directories # Create necessary directories with explicit permissions
RUN mkdir -p /models/wake_word /audio && \ RUN mkdir -p /models/wake_word /audio /app /models/cache /models/models--Systran--faster-whisper-base /opt/venv/lib/python3.10/site-packages/openwakeword/resources/models \
chown -R 1000:1000 /models /audio && \ && chmod -R 777 /models /audio /app /models/cache /models/models--Systran--faster-whisper-base /opt/venv/lib/python3.10/site-packages/openwakeword/resources/models
mkdir -p /home/user/.config/pulse && \
chown -R 1000:1000 /home/user # Download wake word models
RUN wget -O /opt/venv/lib/python3.10/site-packages/openwakeword/resources/models/alexa_v0.1.tflite \
https://github.com/dscripka/openWakeWord/raw/main/openwakeword/resources/models/alexa_v0.1.tflite \
&& wget -O /opt/venv/lib/python3.10/site-packages/openwakeword/resources/models/hey_jarvis_v0.1.tflite \
https://github.com/dscripka/openWakeWord/raw/main/openwakeword/resources/models/hey_jarvis_v0.1.tflite \
&& chmod 644 /opt/venv/lib/python3.10/site-packages/openwakeword/resources/models/*.tflite
# Set environment variables for model caching
ENV HF_HOME=/models/cache
ENV TRANSFORMERS_CACHE=/models/cache
ENV HUGGINGFACE_HUB_CACHE=/models/cache
# Copy scripts and set permissions explicitly
COPY wake_word_detector.py /app/wake_word_detector.py
COPY setup-audio.sh /setup-audio.sh
# Ensure scripts are executable by any user
RUN chmod 755 /setup-audio.sh /app/wake_word_detector.py
# Create a non-root user with explicit UID and GID
RUN addgroup --gid 1000 user && \
adduser --uid 1000 --gid 1000 --disabled-password --gecos '' user
# Change ownership of directories
RUN chown -R 1000:1000 /models /audio /app /models/cache /models/models--Systran--faster-whisper-base \
/opt/venv/lib/python3.10/site-packages/openwakeword/resources/models
# Switch to non-root user
USER user
# Set working directory # Set working directory
WORKDIR /app WORKDIR /app
# Copy the wake word detection script and audio setup script
COPY wake_word_detector.py .
COPY setup-audio.sh /setup-audio.sh
RUN chmod +x /setup-audio.sh
# Set environment variables # Set environment variables
ENV WHISPER_MODEL_PATH=/models \ ENV WHISPER_MODEL_PATH=/models \
WAKEWORD_MODEL_PATH=/models/wake_word \ WAKEWORD_MODEL_PATH=/models/wake_word \
@@ -60,8 +84,5 @@ ENV WHISPER_MODEL_PATH=/models \
PULSE_SERVER=unix:/run/user/1000/pulse/native \ PULSE_SERVER=unix:/run/user/1000/pulse/native \
HOME=/home/user HOME=/home/user
# Run as the host user
USER 1000:1000
# Start the application # Start the application
CMD ["/setup-audio.sh"] CMD ["/setup-audio.sh"]

View File

@@ -1,25 +1,58 @@
#!/bin/bash #!/bin/bash
set -e # Exit immediately if a command exits with a non-zero status
set -x # Print commands and their arguments as they are executed
echo "Starting audio setup script at $(date)"
echo "Current user: $(whoami)"
echo "Current directory: $(pwd)"
# Print environment variables related to audio and speech
echo "ENABLE_WAKE_WORD: ${ENABLE_WAKE_WORD}"
echo "PULSE_SERVER: ${PULSE_SERVER}"
echo "WHISPER_MODEL_PATH: ${WHISPER_MODEL_PATH}"
# Wait for PulseAudio socket to be available # Wait for PulseAudio socket to be available
max_wait=30
wait_count=0
while [ ! -e /run/user/1000/pulse/native ]; do while [ ! -e /run/user/1000/pulse/native ]; do
echo "Waiting for PulseAudio socket..." echo "Waiting for PulseAudio socket... (${wait_count}/${max_wait})"
sleep 1 sleep 1
wait_count=$((wait_count + 1))
if [ $wait_count -ge $max_wait ]; then
echo "ERROR: PulseAudio socket not available after ${max_wait} seconds"
exit 1
fi
done done
# Test PulseAudio connection # Verify PulseAudio connection with detailed error handling
pactl info || { if ! pactl info; then
echo "Failed to connect to PulseAudio server" echo "ERROR: Failed to connect to PulseAudio server"
pactl list short modules
pactl list short clients
exit 1 exit 1
} fi
# List audio devices # List audio devices with error handling
pactl list sources || { if ! pactl list sources; then
echo "Failed to list audio devices" echo "ERROR: Failed to list audio devices"
exit 1 exit 1
} fi
# Start the wake word detector # Ensure wake word detector script is executable
python /app/wake_word_detector.py chmod +x /app/wake_word_detector.py
# Start the wake word detector with logging
echo "Starting wake word detector at $(date)"
python /app/wake_word_detector.py 2>&1 | tee /audio/wake_word_detector.log &
wake_word_pid=$!
# Wait and check if the process is still running
sleep 5
if ! kill -0 $wake_word_pid 2>/dev/null; then
echo "ERROR: Wake word detector process died immediately"
cat /audio/wake_word_detector.log
exit 1
fi
# Mute the monitor to prevent feedback # Mute the monitor to prevent feedback
pactl set-source-mute alsa_output.pci-0000_00_1b.0.analog-stereo.monitor 1 pactl set-source-mute alsa_output.pci-0000_00_1b.0.analog-stereo.monitor 1
@@ -30,5 +63,6 @@ pactl set-source-volume alsa_input.pci-0000_00_1b.0.analog-stereo 65%
# Set speaker volume to 40% # Set speaker volume to 40%
pactl set-sink-volume alsa_output.pci-0000_00_1b.0.analog-stereo 40% pactl set-sink-volume alsa_output.pci-0000_00_1b.0.analog-stereo 40%
# Make the script executable # Keep the script running to prevent container exit
chmod +x /setup-audio.sh echo "Audio setup complete. Keeping container alive."
tail -f /dev/null

View File

@@ -53,8 +53,8 @@ HASS_TOKEN = os.environ.get('HASS_TOKEN')
def initialize_asr_model(): def initialize_asr_model():
"""Initialize the ASR model with retries and timeout""" """Initialize the ASR model with retries and timeout"""
model_path = os.environ.get('ASR_MODEL_PATH', '/models') model_path = os.environ.get('WHISPER_MODEL_PATH', '/models')
model_name = os.environ.get('ASR_MODEL', 'large-v3') model_name = os.environ.get('WHISPER_MODEL_TYPE', 'base')
start_time = time.time() start_time = time.time()
for attempt in range(MAX_MODEL_LOAD_RETRIES): for attempt in range(MAX_MODEL_LOAD_RETRIES):

View File

@@ -1,728 +1,170 @@
# 🚀 Home Assistant MCP API Documentation # Home Assistant MCP Server API Documentation
![API Version](https://img.shields.io/badge/API-v2.1-blueviolet) ![Rate Limit](https://img.shields.io/badge/Rate%20Limit-100%2Fmin-brightgreen) ## Overview
## 🌟 Quick Start This document provides a reference for the MCP Server API, which offers basic device control and state management for Home Assistant.
```bash ## Authentication
# Get API schema with caching
curl -X GET http://localhost:3000/mcp \
-H "Cache-Control: max-age=3600" # Cache for 1 hour
```
## 🔌 Core Functions ⚙️ All API requests require a valid JWT token in the Authorization header:
### State Management (`/api/state`)
```http ```http
GET /api/state?cache=true # Enable client-side caching Authorization: Bearer YOUR_TOKEN
POST /api/state
``` ```
**Example Request:** ## Core Endpoints
### Device State Management
#### Get Device State
```http
GET /api/state/{entity_id}
```
**Response:**
```json ```json
{ {
"context": "living_room",
"state": {
"lights": "on",
"temperature": 22
},
"_cache": { // Optional caching config
"ttl": 300, // 5 minutes
"tags": ["lights", "climate"]
}
}
```
## ⚡ Action Endpoints
### Execute Action with Cache Validation
```http
POST /api/action
If-None-Match: "etag_value" // Prevent duplicate actions
```
**Batch Processing:**
```json
{
"actions": [
{ "action": "🌞 Morning Routine", "params": { "brightness": 80 } },
{ "action": "❄️ AC Control", "params": { "temp": 21 } }
],
"_parallel": true // Execute actions concurrently
}
```
## 🔍 Query Functions
### Available Actions with ETag
```http
GET /api/actions
ETag: "a1b2c3d4" // Client-side cache validation
```
**Response Headers:**
```
Cache-Control: public, max-age=86400 // 24-hour cache
ETag: "a1b2c3d4"
```
## 🌐 WebSocket Events
```javascript
const ws = new WebSocket('wss://ha-mcp/ws');
ws.onmessage = ({ data }) => {
const event = JSON.parse(data);
if(event.type === 'STATE_UPDATE') {
updateUI(event.payload); // 🎨 Real-time UI sync
}
};
```
## 🗃️ Caching Strategies
### Client-Side Caching
```http
GET /api/devices
Cache-Control: max-age=300, stale-while-revalidate=60
```
### Server-Side Cache-Control
```typescript
// Example middleware configuration
app.use(
cacheMiddleware({
ttl: 60 * 5, // 5 minutes
paths: ['/api/devices', '/mcp'],
vary: ['Authorization'] // User-specific caching
})
);
```
## ❌ Error Handling
**429 Too Many Requests:**
```json
{
"error": {
"code": "RATE_LIMITED",
"message": "Slow down! 🐢",
"retry_after": 30,
"docs": "https://ha-mcp/docs/rate-limits"
}
}
```
## 🚦 Rate Limiting Tiers
| Tier | Requests/min | Features |
|---------------|--------------|------------------------|
| Guest | 10 | Basic read-only |
| User | 100 | Full access |
| Power User | 500 | Priority queue |
| Integration | 1000 | Bulk operations |
## 🛠️ Example Usage
### Smart Cache Refresh
```javascript
async function getDevices() {
const response = await fetch('/api/devices', {
headers: {
'If-None-Match': localStorage.getItem('devicesETag')
}
});
if(response.status === 304) { // Not Modified
return JSON.parse(localStorage.devicesCache);
}
const data = await response.json();
localStorage.setItem('devicesETag', response.headers.get('ETag'));
localStorage.setItem('devicesCache', JSON.stringify(data));
return data;
}
```
## 🔒 Security Middleware (Enhanced)
### Cache-Aware Rate Limiting
```typescript
app.use(
rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 100, // Limit each IP to 100 requests per window
cache: new RedisStore(), // Distributed cache
keyGenerator: (req) => {
return `${req.ip}-${req.headers.authorization}`;
}
})
);
```
### Security Headers
```http
Content-Security-Policy: default-src 'self';
Strict-Transport-Security: max-age=31536000;
X-Content-Type-Options: nosniff;
Cache-Control: public, max-age=600;
ETag: "abc123"
```
## 📘 Best Practices
1. **Cache Wisely:** Use `ETag` and `Cache-Control` headers for state data
2. **Batch Operations:** Combine requests using `/api/actions/batch`
3. **WebSocket First:** Prefer real-time updates over polling
4. **Error Recovery:** Implement exponential backoff with jitter
5. **Cache Invalidation:** Use tags for bulk invalidation
```mermaid
graph LR
A[Client] -->|Cached Request| B{CDN}
B -->|Cache Hit| C[Return 304]
B -->|Cache Miss| D[Origin Server]
D -->|Response| B
B -->|Response| A
```
> Pro Tip: Use `curl -I` to inspect cache headers! 🔍
## Device Control
### Common Entity Controls
```json
{
"tool": "control",
"command": "turn_on", // Options: "turn_on", "turn_off", "toggle"
"entity_id": "light.living_room"
}
```
### Light Control
```json
{
"tool": "control",
"command": "turn_on",
"entity_id": "light.living_room", "entity_id": "light.living_room",
"brightness": 128, "state": "on",
"color_temp": 4000, "attributes": {
"rgb_color": [255, 0, 0] "brightness": 128
}
} }
``` ```
## Add-on Management #### Update Device State
### 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", // Options: "start", "stop", "restart"
"slug": "core_configurator"
}
```
## Package Management
### List HACS Packages
```json
{
"tool": "package",
"action": "list",
"category": "integration" // Options: "integration", "plugin", "theme", "python_script", "appdaemon", "netdaemon"
}
```
### Install Package
```json
{
"tool": "package",
"action": "install",
"category": "integration",
"repository": "hacs/integration",
"version": "1.32.0"
}
```
## Automation Management
For automation management details and endpoints, please refer to the [Tools Documentation](tools/tools.md).
## Security Considerations
- Validate and sanitize all user inputs.
- Enforce rate limiting to prevent abuse.
- Apply proper security headers.
- Gracefully handle errors based on the environment.
## Troubleshooting
If you experience issues with the API:
- Verify the endpoint and request payload.
- Check authentication tokens and required headers.
- Consult the [Troubleshooting Guide](troubleshooting.md) for further guidance.
## MCP Schema Endpoint
The server exposes an MCP (Model Context Protocol) schema endpoint that describes all available tools and their parameters:
```http ```http
GET /mcp
```
This endpoint returns a JSON schema describing all available tools, their parameters, and documentation resources. The schema follows the MCP specification and can be used by LLM clients to understand the server's capabilities.
Example response:
```json
{
"tools": [
{
"name": "list_devices",
"description": "List all devices connected to Home Assistant",
"parameters": {
"type": "object",
"properties": {
"domain": {
"type": "string",
"enum": ["light", "climate", "alarm_control_panel", ...]
},
"area": { "type": "string" },
"floor": { "type": "string" }
}
}
},
// ... other tools
],
"prompts": [],
"resources": [
{
"name": "Home Assistant API",
"url": "https://developers.home-assistant.io/docs/api/rest/"
}
]
}
```
Note: The `/mcp` endpoint is publicly accessible and does not require authentication, as it only provides schema information.
## Core Functions
### State Management
```http
GET /api/state
POST /api/state POST /api/state
``` Content-Type: application/json
Manages the current state of the system.
**Example Request:**
```json
POST /api/state
{ {
"context": "living_room", "entity_id": "light.living_room",
"state": { "state": "on",
"lights": "on", "attributes": {
"temperature": 22 "brightness": 128
} }
} }
``` ```
### Context Updates ### Device Control
#### Execute Device Command
```http ```http
POST /api/context POST /api/control
``` Content-Type: application/json
Updates the current context with new information.
**Example Request:**
```json
POST /api/context
{ {
"user": "john", "entity_id": "light.living_room",
"location": "kitchen", "command": "turn_on",
"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": { "parameters": {
"room": "living_room", "brightness": 50
"brightness": 80
} }
} }
``` ```
### Batch Actions ## Real-Time Updates
```http
POST /api/actions/batch
```
Executes multiple actions in sequence. ### WebSocket Connection
Connect to real-time updates:
**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 ```javascript
// Client-side connection example const ws = new WebSocket('ws://localhost:3000/events');
const ws = new WebSocket('ws://localhost:3000/ws');
ws.onmessage = (event) => { ws.onmessage = (event) => {
const data = JSON.parse(event.data); const deviceUpdate = JSON.parse(event.data);
console.log('Received update:', data); console.log('Device state changed:', deviceUpdate);
}; };
``` ```
### 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 ## Error Handling
All endpoints return standard HTTP status codes: ### Common Error Responses
- 200: Success
- 400: Bad Request
- 401: Unauthorized
- 403: Forbidden
- 404: Not Found
- 500: Internal Server Error
**Error Response Format:**
```json ```json
{ {
"error": { "error": {
"code": "INVALID_PARAMETERS", "code": "INVALID_REQUEST",
"message": "Missing required parameter: room", "message": "Invalid request parameters",
"details": { "details": "Entity ID not found or invalid command"
"missing_fields": ["room"]
}
} }
} }
``` ```
## Rate Limiting ## Rate Limiting
The API implements rate limiting to prevent abuse: Basic rate limiting is implemented:
- Maximum of 100 requests per minute
- Excess requests will receive a 429 Too Many Requests response
- 100 requests per minute per IP for regular endpoints ## Supported Operations
- 1000 requests per minute per IP for WebSocket connections
When rate limit is exceeded, the server returns: ### Supported Commands
- `turn_on`
- `turn_off`
- `toggle`
- `set_brightness`
- `set_color`
```json ### Supported Entities
{ - Lights
"error": { - Switches
"code": "RATE_LIMIT_EXCEEDED", - Climate controls
"message": "Too many requests", - Media players
"reset_time": "2024-03-20T10:31:00Z"
}
}
```
## Example Usage ## Limitations
### Using curl - Limited to basic device control
```bash - No advanced automation
# Get current state - Minimal error handling
curl -X GET \ - Basic authentication
http://localhost:3000/api/state \
-H 'Authorization: ApiKey your_api_key_here'
# Execute action ## Best Practices
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 1. Always include a valid JWT token
```javascript 2. Handle potential errors in your client code
// Execute action 3. Use WebSocket for real-time updates when possible
async function executeAction() { 4. Validate entity IDs before sending commands
const response = await fetch('http://localhost:3000/api/action', {
## Example Client Usage
```typescript
async function controlDevice(entityId: string, command: string, params?: Record<string, unknown>) {
try {
const response = await fetch('/api/control', {
method: 'POST', method: 'POST',
headers: { headers: {
'Authorization': 'ApiKey your_api_key_here', 'Content-Type': 'application/json',
'Content-Type': 'application/json' 'Authorization': `Bearer ${token}`
}, },
body: JSON.stringify({ body: JSON.stringify({
action: 'turn_on_lights', entity_id: entityId,
parameters: { command,
room: 'living_room', parameters: params
brightness: 80
}
}) })
}); });
const data = await response.json(); if (!response.ok) {
console.log('Action result:', data); const error = await response.json();
throw new Error(error.message);
} }
```
## Security Middleware return await response.json();
### Overview
The security middleware provides a comprehensive set of utility functions to enhance the security of the Home Assistant MCP application. These functions cover various aspects of web security, including:
- Rate limiting
- Request validation
- Input sanitization
- Security headers
- Error handling
### Utility Functions
#### `checkRateLimit(ip: string, maxRequests?: number, windowMs?: number)`
Manages rate limiting for IP addresses to prevent abuse.
**Parameters**:
- `ip`: IP address to track
- `maxRequests`: Maximum number of requests allowed (default: 100)
- `windowMs`: Time window for rate limiting (default: 15 minutes)
**Returns**: `boolean` or throws an error if limit is exceeded
**Example**:
```typescript
try {
checkRateLimit('127.0.0.1'); // Checks rate limit with default settings
} catch (error) { } catch (error) {
// Handle rate limit exceeded console.error('Device control failed:', error);
throw error;
} }
```
#### `validateRequestHeaders(request: Request, requiredContentType?: string)`
Validates incoming HTTP request headers for security and compliance.
**Parameters**:
- `request`: The incoming HTTP request
- `requiredContentType`: Expected content type (default: 'application/json')
**Checks**:
- Content type
- Request body size
- Authorization header (optional)
**Example**:
```typescript
try {
validateRequestHeaders(request);
} catch (error) {
// Handle validation errors
} }
// Usage example
controlDevice('light.living_room', 'turn_on', { brightness: 50 })
.then(result => console.log('Device controlled successfully'))
.catch(error => console.error('Control failed', error));
``` ```
#### `sanitizeValue(value: unknown)` ## Future Development
Sanitizes input values to prevent XSS attacks. Planned improvements:
- Enhanced error handling
- More comprehensive device support
- Improved authentication mechanisms
**Features**: *API is subject to change. Always refer to the latest documentation.*
- Escapes HTML tags
- Handles nested objects and arrays
- Preserves non-string values
**Example**:
```typescript
const sanitized = sanitizeValue('<script>alert("xss")</script>');
// Returns: '&lt;script&gt;alert(&quot;xss&quot;)&lt;/script&gt;'
```
#### `applySecurityHeaders(request: Request, helmetConfig?: HelmetOptions)`
Applies security headers to HTTP requests using Helmet.
**Security Headers**:
- Content Security Policy
- X-Frame-Options
- X-Content-Type-Options
- Referrer Policy
- HSTS (in production)
**Example**:
```typescript
const headers = applySecurityHeaders(request);
```
#### `handleError(error: Error, env?: string)`
Handles error responses with environment-specific details.
**Modes**:
- Production: Generic error message
- Development: Detailed error with stack trace
**Example**:
```typescript
const errorResponse = handleError(error, process.env.NODE_ENV);
```
### Middleware Usage
These utility functions are integrated into Elysia middleware:
```typescript
const app = new Elysia()
.use(rateLimiter) // Rate limiting
.use(validateRequest) // Request validation
.use(sanitizeInput) // Input sanitization
.use(securityHeaders) // Security headers
.use(errorHandler) // Error handling
```
### Best Practices
1. Always validate and sanitize user inputs
2. Use rate limiting to prevent abuse
3. Apply security headers
4. Handle errors gracefully
5. Keep environment-specific error handling
### Security Considerations
- Configurable rate limits
- XSS protection
- Content security policies
- Token validation
- Error information exposure control
### Troubleshooting
- Ensure `JWT_SECRET` is set in environment
- Check content type in requests
- Monitor rate limit errors
- Review error handling in different environments

View File

@@ -232,3 +232,11 @@ The current API version is v1. Include the version in the URL:
- [Core Functions](core.md) - Detailed endpoint documentation - [Core Functions](core.md) - Detailed endpoint documentation
- [Architecture Overview](../architecture.md) - System design details - [Architecture Overview](../architecture.md) - System design details
- [Troubleshooting](../troubleshooting.md) - Common issues and solutions - [Troubleshooting](../troubleshooting.md) - Common issues and solutions
# API Reference
The Advanced Home Assistant MCP provides several APIs for integration and automation:
- [Core API](core.md) - Primary interface for system control
- [SSE API](sse.md) - Server-Sent Events for real-time updates
- [Core Functions](core.md) - Essential system functions

View File

@@ -6,7 +6,7 @@ nav_order: 4
# Architecture Overview 🏗️ # Architecture Overview 🏗️
This document describes the architecture of the MCP Server, explaining how different components work together to provide a bridge between Home Assistant and Language Learning Models. This document describes the architecture of the MCP Server, explaining how different components work together to provide a bridge between Home Assistant and custom automation tools.
## System Architecture ## System Architecture
@@ -15,17 +15,13 @@ graph TD
subgraph "Client Layer" subgraph "Client Layer"
WC[Web Clients] WC[Web Clients]
MC[Mobile Clients] MC[Mobile Clients]
VC[Voice Assistants]
end end
subgraph "MCP Server" subgraph "MCP Server"
API[API Gateway] API[API Gateway]
NLP[NLP Engine]
SSE[SSE Manager] SSE[SSE Manager]
WS[WebSocket Server] WS[WebSocket Server]
CM[Command Manager] CM[Command Manager]
SC[Scene Controller]
Cache[Redis Cache]
end end
subgraph "Home Assistant" subgraph "Home Assistant"
@@ -33,251 +29,60 @@ graph TD
Dev[Devices & Services] Dev[Devices & Services]
end end
subgraph "AI Layer"
LLM[Language Models]
IC[Intent Classifier]
NER[Named Entity Recognition]
end
WC --> |HTTP/WS| API WC --> |HTTP/WS| API
MC --> |HTTP/WS| API MC --> |HTTP/WS| API
VC --> |HTTP| API
API --> |Events| SSE API --> |Events| SSE
API --> |Real-time| WS API --> |Real-time| WS
API --> |Process| NLP
NLP --> |Query| LLM API --> HA
NLP --> |Extract| IC HA --> API
NLP --> |Identify| NER
CM --> |Execute| HA
HA --> |Control| Dev
SSE --> |State Updates| WC
SSE --> |State Updates| MC
WS --> |Bi-directional| WC
Cache --> |Fast Access| API
HA --> |Events| Cache
``` ```
## Component Details ## Core Components
### 1. Client Layer ### API Gateway
- Handles incoming HTTP and WebSocket requests
- Provides endpoints for device management
- Implements basic authentication and request validation
The client layer consists of various interfaces that interact with the MCP Server: ### SSE Manager
- Manages Server-Sent Events for real-time updates
- Broadcasts device state changes to connected clients
- **Web Clients**: Browser-based dashboards and control panels ### WebSocket Server
- **Mobile Clients**: Native mobile applications - Provides real-time, bidirectional communication
- **Voice Assistants**: Voice-enabled devices and interfaces - Supports basic device control and state monitoring
### 2. MCP Server Core ### Command Manager
- Processes device control requests
- Translates API commands to Home Assistant compatible formats
#### API Gateway ## Communication Flow
- Handles all incoming HTTP requests
- Manages authentication and rate limiting
- Routes requests to appropriate handlers
```typescript 1. Client sends a request to the MCP Server API
interface APIGateway { 2. API Gateway authenticates the request
authenticate(): Promise<boolean>; 3. Command Manager processes the request
rateLimit(): Promise<boolean>; 4. Request is forwarded to Home Assistant
route(request: Request): Promise<Response>; 5. Response is sent back to the client via API or WebSocket
}
```
#### NLP Engine ## Key Design Principles
- Processes natural language commands
- Integrates with Language Models
- Extracts intents and entities
```typescript - **Simplicity:** Lightweight, focused design
interface NLPEngine { - **Flexibility:** Easily extendable architecture
processCommand(text: string): Promise<CommandIntent>; - **Performance:** Efficient request handling
extractEntities(text: string): Promise<Entity[]>; - **Security:** Basic authentication and validation
validateIntent(intent: CommandIntent): boolean;
}
```
#### Event Management ## Limitations
- **SSE Manager**: Handles Server-Sent Events
- **WebSocket Server**: Manages bi-directional communication
- **Command Manager**: Processes and executes commands
### 3. Home Assistant Integration - Basic device control capabilities
- Limited advanced automation features
- Minimal third-party integrations
The server maintains a robust connection to Home Assistant through: ## Future Improvements
- REST API calls - Enhanced error handling
- WebSocket connections - More robust authentication
- Event subscriptions - Expanded device type support
```typescript *Architecture is subject to change as the project evolves.*
interface HomeAssistantClient {
connect(): Promise<void>;
getState(entityId: string): Promise<EntityState>;
executeCommand(command: Command): Promise<CommandResult>;
subscribeToEvents(callback: EventCallback): Subscription;
}
```
### 4. AI Layer
#### Language Model Integration
- Processes natural language input
- Understands context and user intent
- Generates appropriate responses
#### Intent Classification
- Identifies command types
- Extracts parameters
- Validates requests
## Data Flow
### 1. Command Processing
```mermaid
sequenceDiagram
participant Client
participant API
participant NLP
participant LLM
participant HA
Client->>API: Send command
API->>NLP: Process text
NLP->>LLM: Get intent
LLM-->>NLP: Return structured intent
NLP->>HA: Execute command
HA-->>API: Return result
API-->>Client: Send response
```
### 2. Real-time Updates
```mermaid
sequenceDiagram
participant HA
participant Cache
participant SSE
participant Client
HA->>Cache: State change
Cache->>SSE: Notify change
SSE->>Client: Send update
Note over Client: Update UI
```
### 3. [SSE API](api/sse.md)
- Event Subscriptions
- Real-time Updates
- Connection Management
## Security Architecture
### Authentication Flow
1. **JWT-based Authentication**
```typescript
interface AuthToken {
token: string;
expires: number;
scope: string[];
}
```
2. **Rate Limiting**
```typescript
interface RateLimit {
window: number;
max: number;
current: number;
}
```
### Security Measures
- TLS encryption for all communications
- Input sanitization
- Request validation
- Token-based authentication
- Rate limiting
- IP filtering
## Performance Optimizations
### Caching Strategy
```mermaid
graph LR
Request --> Cache{Cache?}
Cache -->|Hit| Response
Cache -->|Miss| HA[Home Assistant]
HA --> Cache
Cache --> Response
```
### Connection Management
- Connection pooling
- Automatic reconnection
- Load balancing
- Request queuing
## Configuration
The system is highly configurable through environment variables and configuration files:
```yaml
server:
port: 3000
host: '0.0.0.0'
homeAssistant:
url: 'http://homeassistant:8123'
token: 'YOUR_TOKEN'
security:
jwtSecret: 'your-secret'
rateLimit: 100
ai:
model: 'gpt-4'
temperature: 0.7
cache:
ttl: 300
maxSize: '100mb'
```
## Deployment Architecture
### Docker Deployment
```mermaid
graph TD
subgraph "Docker Compose"
MCP[MCP Server]
Redis[Redis Cache]
HA[Home Assistant]
end
MCP --> Redis
MCP --> HA
```
### Scaling Considerations
- Horizontal scaling capabilities
- Load balancing support
- Redis cluster support
- Multiple HA instance support
## Further Reading
- [API Documentation](api/index.md)
- [Installation Guide](getting-started/installation.md)
- [Contributing Guidelines](contributing.md)
- [Troubleshooting](troubleshooting.md)

View File

@@ -6,249 +6,119 @@ nav_order: 5
# Contributing Guide 🤝 # Contributing Guide 🤝
Thank you for your interest in contributing to the MCP Server project! This guide will help you get started with contributing to the project. Thank you for your interest in contributing to the MCP Server project!
## Getting Started ## Getting Started
### Prerequisites ### Prerequisites
Before you begin, ensure you have:
- [Bun](https://bun.sh) >= 1.0.26 - [Bun](https://bun.sh) >= 1.0.26
- [Node.js](https://nodejs.org) >= 18 - Home Assistant instance
- [Docker](https://www.docker.com) (optional, for containerized development) - Basic understanding of TypeScript
- A running Home Assistant instance for testing
### Development Setup ### Development Setup
1. Fork and clone the repository: 1. Fork the repository
2. Clone your fork:
```bash ```bash
git clone https://github.com/YOUR_USERNAME/advanced-homeassistant-mcp.git git clone https://github.com/YOUR_USERNAME/homeassistant-mcp.git
cd advanced-homeassistant-mcp cd homeassistant-mcp
``` ```
2. Install dependencies: 3. Install dependencies:
```bash ```bash
bun install bun install
``` ```
3. Set up your development environment: 4. Configure environment:
```bash ```bash
cp .env.example .env cp .env.example .env
# Edit .env with your Home Assistant details # Edit .env with your Home Assistant details
``` ```
4. Start the development server:
```bash
bun run dev
```
## Development Workflow ## Development Workflow
### Branch Naming Convention ### Branch Naming
- `feature/` - New features - `feature/` - New features
- `fix/` - Bug fixes - `fix/` - Bug fixes
- `docs/` - Documentation updates - `docs/` - Documentation updates
- `refactor/` - Code refactoring
- `test/` - Test improvements
Example: Example:
```bash ```bash
git checkout -b feature/voice-commands git checkout -b feature/device-control-improvements
``` ```
### Commit Messages ### Commit Messages
We follow the [Conventional Commits](https://www.conventionalcommits.org/) specification: Follow simple, clear commit messages:
``` ```
type(scope): description type: brief description
[optional body] [optional detailed explanation]
[optional footer]
``` ```
Types: Types:
- `feat:` - New features - `feat:` - New feature
- `fix:` - Bug fixes - `fix:` - Bug fix
- `docs:` - Documentation changes - `docs:` - Documentation
- `style:` - Code style changes (formatting, etc.) - `chore:` - Maintenance
- `refactor:` - Code refactoring
- `test:` - Test updates
- `chore:` - Maintenance tasks
Examples: ### Code Style
```bash
feat(api): add voice command endpoint
fix(sse): resolve connection timeout issue
docs(readme): update installation instructions
```
### Testing - Use TypeScript
- Follow existing code structure
- Keep changes focused and minimal
Run tests before submitting your changes: ## Testing
Run tests before submitting:
```bash ```bash
# Run all tests # Run all tests
bun test bun test
# Run specific test file # Run specific test
bun test test/api/command.test.ts bun test test/api/control.test.ts
# Run tests with coverage
bun test --coverage
```
### Code Style
We use ESLint and Prettier for code formatting:
```bash
# Check code style
bun run lint
# Fix code style issues
bun run lint:fix
``` ```
## Pull Request Process ## Pull Request Process
1. **Update Documentation** 1. Ensure tests pass
- Add/update relevant documentation 2. Update documentation if needed
- Include inline code comments where necessary 3. Provide clear description of changes
- Update API documentation if endpoints change
2. **Write Tests**
- Add tests for new features
- Update existing tests if needed
- Ensure all tests pass
3. **Create Pull Request**
- Fill out the PR template
- Link related issues
- Provide clear description of changes
4. **Code Review**
- Address review comments
- Keep discussions focused
- Be patient and respectful
### PR Template ### PR Template
```markdown ```markdown
## Description ## Description
Brief description of the changes Brief explanation of the changes
## Type of Change ## Type of Change
- [ ] Bug fix - [ ] Bug fix
- [ ] New feature - [ ] New feature
- [ ] Breaking change
- [ ] Documentation update - [ ] Documentation update
## How Has This Been Tested? ## Testing
Describe your test process Describe how you tested these changes
## Checklist
- [ ] Tests added/updated
- [ ] Documentation updated
- [ ] Code follows style guidelines
- [ ] All tests passing
``` ```
## Development Guidelines ## Reporting Issues
### Code Organization - Use GitHub Issues
- Provide clear, reproducible steps
- Include environment details
``` ## Code of Conduct
src/
├── api/ # API endpoints
├── core/ # Core functionality
├── models/ # Data models
├── services/ # Business logic
├── utils/ # Utility functions
└── types/ # TypeScript types
```
### Best Practices - Be respectful
1. **Type Safety**
```typescript
// Use explicit types
interface CommandRequest {
command: string;
parameters?: Record<string, unknown>;
}
function processCommand(request: CommandRequest): Promise<CommandResponse> {
// Implementation
}
```
2. **Error Handling**
```typescript
try {
await processCommand(request);
} catch (error) {
if (error instanceof ValidationError) {
// Handle validation errors
}
throw error;
}
```
3. **Async/Await**
```typescript
// Prefer async/await over promises
async function handleRequest() {
const result = await processData();
return result;
}
```
## Documentation
### API Documentation
Update API documentation when adding/modifying endpoints:
```typescript
/**
* Process a voice command
* @param command - The voice command to process
* @returns Promise<CommandResult>
* @throws {ValidationError} If command is invalid
*/
async function processVoiceCommand(command: string): Promise<CommandResult> {
// Implementation
}
```
### README Updates
Keep the README up to date with:
- New features
- Changed requirements
- Updated examples
- Modified configuration
## Getting Help
- Check [Discussions](https://github.com/jango-blockchained/advanced-homeassistant-mcp/discussions)
- Review existing [Issues](https://github.com/jango-blockchained/advanced-homeassistant-mcp/issues)
## Community Guidelines
We expect all contributors to:
- Be respectful and inclusive
- Focus on constructive feedback - Focus on constructive feedback
- Help maintain a positive environment - Help maintain a positive environment
- Follow our code style guidelines
- Write clear documentation
- Test their code thoroughly
## License ## Resources
By contributing, you agree that your contributions will be licensed under the MIT License. - [API Documentation](api.md)
- [Troubleshooting Guide](troubleshooting.md)
*Thank you for contributing!*

141
docs/deployment.md Normal file
View File

@@ -0,0 +1,141 @@
# Deployment Guide
This documentation is automatically deployed to GitHub Pages using GitHub Actions. Here's how it works and how to manage deployments.
## Automatic Deployment
The documentation is automatically deployed when changes are pushed to the `main` or `master` branch. The deployment process:
1. Triggers on push to main/master
2. Sets up Python environment
3. Installs required dependencies
4. Builds the documentation
5. Deploys to the `gh-pages` branch
### GitHub Actions Workflow
The deployment is handled by the workflow in `.github/workflows/deploy-docs.yml`. This is the single source of truth for documentation deployment:
```yaml
name: Deploy MkDocs
on:
push:
branches:
- main
- master
workflow_dispatch: # Allow manual trigger
```
## Manual Deployment
If needed, you can deploy manually using:
```bash
# Create a virtual environment
python -m venv venv
# Activate the virtual environment
source venv/bin/activate
# Install dependencies
pip install -r docs/requirements.txt
# Build the documentation
mkdocs build
# Deploy to GitHub Pages
mkdocs gh-deploy --force
```
## Best Practices
### 1. Documentation Updates
- Test locally before pushing: `mkdocs serve`
- Verify all links work
- Ensure images are optimized
- Check mobile responsiveness
### 2. Version Control
- Keep documentation in sync with code versions
- Use meaningful commit messages
- Tag important documentation versions
### 3. Content Guidelines
- Use consistent formatting
- Keep navigation structure logical
- Include examples where appropriate
- Maintain up-to-date screenshots
### 4. Maintenance
- Regularly review and update content
- Check for broken links
- Update dependencies
- Monitor GitHub Actions logs
## Troubleshooting
### Common Issues
1. **Failed Deployments**
- Check GitHub Actions logs
- Verify dependencies are up to date
- Ensure all required files exist
2. **Broken Links**
- Run `mkdocs build --strict`
- Use relative paths in markdown
- Check case sensitivity
3. **Style Issues**
- Verify theme configuration
- Check CSS customizations
- Test on multiple browsers
## Configuration Files
### requirements.txt
Create a requirements file for documentation dependencies:
```txt
mkdocs-material
mkdocs-minify-plugin
mkdocs-git-revision-date-plugin
mkdocs-mkdocstrings
mkdocs-social-plugin
mkdocs-redirects
```
## Monitoring
- Check [GitHub Pages settings](https://github.com/jango-blockchained/advanced-homeassistant-mcp/settings/pages)
- Monitor build status in Actions tab
- Verify site accessibility
## Workflow Features
### Caching
The workflow implements caching for Python dependencies to speed up deployments:
- Pip cache for Python packages
- MkDocs dependencies cache
### Deployment Checks
Several checks are performed during deployment:
1. Link validation with `mkdocs build --strict`
2. Build verification
3. Post-deployment site accessibility check
### Manual Triggers
You can manually trigger deployments using the "workflow_dispatch" event in GitHub Actions.
## Cleanup
To clean up duplicate workflow files, run:
```bash
# Make the script executable
chmod +x scripts/cleanup-workflows.sh
# Run the cleanup script
./scripts/cleanup-workflows.sh
```

View File

@@ -0,0 +1,8 @@
# Getting Started
Welcome to the Advanced Home Assistant MCP getting started guide. Follow these steps to begin:
1. [Installation](installation.md)
2. [Configuration](configuration.md)
3. [Docker Setup](docker.md)
4. [Quick Start](quickstart.md)

View File

@@ -4,31 +4,34 @@ title: Home
nav_order: 1 nav_order: 1
--- ---
# 🚀 MCP Server for Home Assistant # Advanced Home Assistant MCP
Welcome to the Model Context Protocol (MCP) Server documentation! This guide will help you get started with integrating AI-powered natural language processing into your Home Assistant setup. Welcome to the Advanced Home Assistant Master Control Program documentation.
This documentation provides comprehensive information about setting up, configuring, and using the Advanced Home Assistant MCP system.
## Quick Links
- [Getting Started](getting-started/index.md)
- [API Reference](api/index.md)
- [Configuration Guide](getting-started/configuration.md)
- [Docker Setup](getting-started/docker.md)
## What is MCP Server? ## What is MCP Server?
MCP Server is a bridge between Home Assistant and Language Learning Models (LLMs), enabling natural language interactions and real-time automation of your smart devices. It allows you to control your home automation setup using natural language commands while maintaining high performance and security. MCP Server is a bridge between Home Assistant and custom automation tools, enabling basic device control and real-time monitoring of your smart home environment. It provides a flexible interface for managing and interacting with your home automation setup.
## Key Features ## Key Features
### 🎮 Device Control & Monitoring ### 🎮 Device Control
- Voice-controlled automation - Basic REST API for device management
- Real-time updates via SSE/WebSocket - WebSocket and Server-Sent Events (SSE) for real-time updates
- Scene-based automation rules - Simple automation rule support
### 🤖 AI-Powered Features
- Natural Language Processing (NLP)
- Predictive automation
- Anomaly detection
### 🛡️ Security & Performance ### 🛡️ Security & Performance
- JWT authentication - JWT authentication
- Request sanitization - Basic request validation
- Sub-100ms latency - Lightweight server design
- Rate limiting
## Documentation Structure ## Documentation Structure
@@ -37,19 +40,18 @@ MCP Server is a bridge between Home Assistant and Language Learning Models (LLMs
- [Quick Start Tutorial](getting-started/quickstart.md) - Basic usage examples - [Quick Start Tutorial](getting-started/quickstart.md) - Basic usage examples
### Core Documentation ### Core Documentation
- [API Documentation](api/index.md) - Complete API reference - [API Documentation](api/index.md) - API reference
- [Architecture Overview](architecture.md) - System design and components - [Architecture Overview](architecture.md) - System design
- [Contributing Guidelines](contributing.md) - How to contribute - [Contributing Guidelines](contributing.md) - How to contribute
- [Troubleshooting Guide](troubleshooting.md) - Common issues and solutions - [Troubleshooting Guide](troubleshooting.md) - Common issues
## Support ## Support
If you need help or want to report issues: Need help or want to report issues?
- [GitHub Issues](https://github.com/jango-blockchained/advanced-homeassistant-mcp/issues) - [GitHub Issues](https://github.com/jango-blockchained/homeassistant-mcp/issues)
- [GitHub Discussions](https://github.com/jango-blockchained/advanced-homeassistant-mcp/discussions) - [GitHub Discussions](https://github.com/jango-blockchained/homeassistant-mcp/discussions)
- [Contributing Guidelines](contributing.md)
## License ## License
This project is licensed under the MIT License. See the [LICENSE](https://github.com/jango-blockchained/advanced-homeassistant-mcp/blob/main/LICENSE) file for details. This project is licensed under the MIT License. See the [LICENSE](https://github.com/jango-blockchained/homeassistant-mcp/blob/main/LICENSE) file for details.

62
docs/javascripts/extra.js Normal file
View File

@@ -0,0 +1,62 @@
// Dark mode handling
document.addEventListener('DOMContentLoaded', function () {
// Check for saved dark mode preference
const darkMode = localStorage.getItem('darkMode');
if (darkMode === 'true') {
document.body.classList.add('dark-mode');
}
});
// Smooth scrolling for anchor links
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
document.querySelector(this.getAttribute('href')).scrollIntoView({
behavior: 'smooth'
});
});
});
// Add copy button to code blocks
document.querySelectorAll('pre code').forEach((block) => {
const button = document.createElement('button');
button.className = 'copy-button';
button.textContent = 'Copy';
button.addEventListener('click', async () => {
await navigator.clipboard.writeText(block.textContent);
button.textContent = 'Copied!';
setTimeout(() => {
button.textContent = 'Copy';
}, 2000);
});
const pre = block.parentNode;
pre.insertBefore(button, block);
});
// Add version selector handling
const versionSelector = document.querySelector('.version-selector');
if (versionSelector) {
versionSelector.addEventListener('change', (e) => {
const version = e.target.value;
window.location.href = `/${version}/`;
});
}
// Add feedback handling
document.querySelectorAll('.feedback-button').forEach(button => {
button.addEventListener('click', function () {
const feedback = this.getAttribute('data-feedback');
// Send feedback to analytics
if (typeof gtag !== 'undefined') {
gtag('event', 'feedback', {
'event_category': 'Documentation',
'event_label': feedback
});
}
// Show thank you message
this.textContent = 'Thank you!';
this.disabled = true;
});
});

View File

@@ -0,0 +1,12 @@
window.MathJax = {
tex: {
inlineMath: [["\\(", "\\)"]],
displayMath: [["\\[", "\\]"]],
processEscapes: true,
processEnvironments: true
},
options: {
ignoreHtmlClass: ".*|",
processHtmlClass: "arithmatex"
}
};

45
docs/requirements.txt Normal file
View File

@@ -0,0 +1,45 @@
# Core
mkdocs>=1.5.3
mkdocs-material>=9.5.3
# Enhanced Functionality
mkdocs-minify-plugin>=0.7.1
mkdocs-git-revision-date-localized-plugin>=1.2.1
mkdocs-glightbox>=0.3.4
mkdocs-optimize>=0.1.1
mkdocs-git-authors-plugin>=0.7.2
mkdocs-git-committers-plugin>=0.2.3
mkdocs-static-i18n>=1.2.0
mkdocs-awesome-pages-plugin>=2.9.2
mkdocs-redirects>=1.2.1
mkdocs-include-markdown-plugin>=6.0.4
mkdocs-macros-plugin>=1.0.4
mkdocs-meta-descriptions-plugin>=3.0.0
mkdocs-print-site-plugin>=2.3.6
mkdocs-pdf-export-plugin>=0.5.10
mkdocs-with-pdf>=0.9.3
# Code Documentation
mkdocstrings>=0.24.0
mkdocstrings-python>=1.7.5
# Markdown Extensions
pymdown-extensions>=10.5
markdown>=3.5.1
mdx_truly_sane_lists>=1.3
pygments>=2.17.2
# Math Support
python-markdown-math>=0.8
# Diagrams
plantuml-markdown>=3.9.2
mkdocs-mermaid2-plugin>=1.1.1
# Search Enhancements
mkdocs-material[imaging]>=9.5.3
pillow>=10.2.0
cairosvg>=2.7.1
# Development Tools
mike>=2.0.0 # For version management

View File

@@ -1,51 +1,52 @@
# Roadmap for MCP Server # Roadmap for MCP Server
The following roadmap outlines our planned enhancements and future directions for the Home Assistant MCP Server. This document is a living guide that will be updated as new features are planned and developed. The following roadmap outlines our planned enhancements and future directions for the Home Assistant MCP Server. This document is a living guide that will be updated as new features are developed.
## Near-Term Goals ## Near-Term Goals
- **Advanced Automation Capabilities:** - **Core Functionality Improvements:**
- Integrate sophisticated automation rules with conditional logic and multi-step execution. - Enhance REST API capabilities
- Introduce a visual automation builder for simplified rule creation. - Improve WebSocket and SSE reliability
- Develop more robust error handling
- **Enhanced Security Features:** - **Security Enhancements:**
- Implement multi-factor authentication for critical actions. - Strengthen JWT authentication
- Strengthen encryption methods and data handling practices. - Improve input validation
- Expand monitoring and alerting for potential security breaches. - Add basic logging for security events
- **Performance Optimizations:** - **Performance Optimizations:**
- Refine resource utilization to reduce latency. - Optimize server response times
- Optimize real-time data streaming via SSE. - Improve resource utilization
- Introduce advanced caching mechanisms for frequently requested data. - Implement basic caching mechanisms
## Mid-Term Goals ## Mid-Term Goals
- **User Interface Improvements:** - **Device Integration:**
- Develop an intuitive web-based dashboard for device management and monitoring. - Expand support for additional Home Assistant device types
- Provide real-time analytics and performance metrics. - Improve device state synchronization
- Develop more flexible automation rule support
- **Expanded Integrations:** - **Developer Experience:**
- Support a broader range of smart home devices and brands. - Improve documentation
- Integrate with additional home automation platforms and third-party services. - Create more comprehensive examples
- Develop basic CLI tools for configuration
- **Developer Experience Enhancements:**
- Improve documentation and developer tooling.
- Streamline contribution guidelines and testing setups.
## Long-Term Vision ## Long-Term Vision
- **Ecosystem Expansion:** - **Extensibility:**
- Build a modular plugin system for community-driven extensions and integrations. - Design a simple plugin system
- Enable seamless integration with future technologies in smart home and AI domains. - Create guidelines for community contributions
- Establish a clear extension mechanism
- **Scalability and Resilience:** - **Reliability:**
- Architect the system to support large-scale deployments. - Implement comprehensive testing
- Incorporate advanced load balancing and failover mechanisms. - Develop monitoring and basic health check features
- Improve overall system stability
## How to Follow the Roadmap ## How to Follow the Roadmap
- **Community Involvement:** We welcome and encourage feedback. - **Community Involvement:** We welcome feedback and contributions.
- **Regular Updates:** This document is updated regularly with new goals and milestones. - **Transparency:** Check our GitHub repository for ongoing discussions.
- **Transparency:** Check our GitHub repository and issue tracker for ongoing discussions. - **Iterative Development:** Goals may change based on community needs and technical feasibility.
*This roadmap is intended as a guide and may evolve based on community needs, technological advancements, and strategic priorities.* *This roadmap is intended as a guide and may evolve based on community needs, technological advancements, and strategic priorities.*

164
docs/stylesheets/extra.css Normal file
View File

@@ -0,0 +1,164 @@
/* Modern Dark Theme Enhancements */
[data-md-color-scheme="slate"] {
--md-default-bg-color: #1a1b26;
--md-default-fg-color: #a9b1d6;
--md-default-fg-color--light: #a9b1d6;
--md-default-fg-color--lighter: #787c99;
--md-default-fg-color--lightest: #4e5173;
--md-primary-fg-color: #7aa2f7;
--md-primary-fg-color--light: #7dcfff;
--md-primary-fg-color--dark: #2ac3de;
--md-accent-fg-color: #bb9af7;
--md-accent-fg-color--transparent: #bb9af722;
--md-accent-bg-color: #1a1b26;
--md-accent-bg-color--light: #24283b;
}
/* Code Blocks */
.highlight pre {
background-color: #24283b !important;
border-radius: 6px;
padding: 1em;
margin: 1em 0;
overflow: auto;
}
.highlight code {
font-family: 'Roboto Mono', monospace;
font-size: 0.9em;
}
/* Copy Button */
.copy-button {
position: absolute;
right: 0.5em;
top: 0.5em;
padding: 0.4em 0.8em;
background-color: var(--md-accent-bg-color--light);
border: 1px solid var(--md-accent-fg-color--transparent);
border-radius: 4px;
color: var(--md-default-fg-color);
font-size: 0.8em;
cursor: pointer;
transition: all 0.2s ease;
}
.copy-button:hover {
background-color: var(--md-accent-fg-color--transparent);
border-color: var(--md-accent-fg-color);
}
/* Navigation Enhancements */
.md-nav {
font-size: 0.9rem;
}
.md-nav__link {
padding: 0.4rem 0;
transition: color 0.2s ease;
}
.md-nav__link:hover {
color: var(--md-primary-fg-color) !important;
}
/* Tabs */
.md-tabs__link {
opacity: 0.8;
transition: opacity 0.2s ease;
}
.md-tabs__link:hover {
opacity: 1;
}
.md-tabs__link--active {
opacity: 1;
}
/* Admonitions */
.md-typeset .admonition,
.md-typeset details {
border-width: 0;
border-left-width: 4px;
border-radius: 4px;
}
/* Tables */
.md-typeset table:not([class]) {
border-radius: 4px;
box-shadow: 0 2px 4px var(--md-accent-fg-color--transparent);
}
.md-typeset table:not([class]) th {
background-color: var(--md-accent-bg-color--light);
border-bottom: 2px solid var(--md-accent-fg-color--transparent);
}
/* Search */
.md-search__form {
background-color: var(--md-accent-bg-color--light);
border-radius: 4px;
}
/* Feedback Buttons */
.feedback-button {
padding: 0.5em 1em;
margin: 0 0.5em;
border-radius: 4px;
background-color: var(--md-accent-bg-color--light);
border: 1px solid var(--md-accent-fg-color--transparent);
color: var(--md-default-fg-color);
cursor: pointer;
transition: all 0.2s ease;
}
.feedback-button:hover {
background-color: var(--md-accent-fg-color--transparent);
border-color: var(--md-accent-fg-color);
}
.feedback-button:disabled {
opacity: 0.5;
cursor: not-allowed;
}
/* Version Selector */
.version-selector {
padding: 0.5em;
border-radius: 4px;
background-color: var(--md-accent-bg-color--light);
border: 1px solid var(--md-accent-fg-color--transparent);
color: var(--md-default-fg-color);
}
/* Scrollbar */
::-webkit-scrollbar {
width: 8px;
height: 8px;
}
::-webkit-scrollbar-track {
background: var(--md-accent-bg-color--light);
}
::-webkit-scrollbar-thumb {
background: var(--md-accent-fg-color--transparent);
border-radius: 4px;
}
::-webkit-scrollbar-thumb:hover {
background: var(--md-accent-fg-color);
}
/* Print Styles */
@media print {
.md-typeset a {
color: var(--md-default-fg-color) !important;
}
.md-content__inner {
margin: 0;
padding: 1rem;
}
}

View File

@@ -1,34 +1,96 @@
# Usage Guide # Usage Guide
This guide explains how to use the Home Assistant MCP Server for smart home device management and integration with language learning systems. This guide explains how to use the Home Assistant MCP Server for basic device management and integration.
## Basic Usage ## Basic Setup
1. **Starting the Server:** 1. **Starting the Server:**
- For development: run `npm run dev`. - Development mode: `bun run dev`
- For production: run `npm run build` followed by `npm start`. - Production mode: `bun run start`
2. **Accessing the Web Interface:** 2. **Accessing the Server:**
- Open [http://localhost:3000](http://localhost:3000) in your browser. - Default URL: `http://localhost:3000`
- Ensure Home Assistant credentials are configured in `.env`
3. **Real-Time Updates:** ## Device Control
- Connect to the SSE endpoint at `/subscribe_events?token=YOUR_TOKEN&domain=light` to receive live updates.
## Advanced Features ### REST API Interactions
1. **API Interactions:** Basic device control can be performed via the REST API:
- Use the REST API for operations such as device control, automation, and add-on management.
- See [API Documentation](api.md) for details.
2. **Tool Integrations:** ```typescript
- Multiple tools are available (see [Tools Documentation](tools/tools.md)), for tasks like automation management and notifications. // Turn on a light
fetch('http://localhost:3000/api/control', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
},
body: JSON.stringify({
entity_id: 'light.living_room',
command: 'turn_on',
parameters: { brightness: 50 }
})
});
```
3. **Security Settings:** ### Supported Commands
- Configure token-based authentication and environment variables as per the [Configuration Guide](getting-started/configuration.md).
4. **Customization and Extensions:** - `turn_on`
- Extend server functionality by developing new tools as outlined in the [Development Guide](development/development.md). - `turn_off`
- `toggle`
- `set_brightness`
### Supported Entities
- Lights
- Switches
- Climate controls
- Media players
## Real-Time Updates
### WebSocket Connection
Subscribe to real-time device state changes:
```typescript
const ws = new WebSocket('ws://localhost:3000/events');
ws.onmessage = (event) => {
const deviceUpdate = JSON.parse(event.data);
console.log('Device state changed:', deviceUpdate);
};
```
## Authentication
All API requests require a valid JWT token in the Authorization header.
## Limitations
- Basic device control only
- Limited error handling
- Minimal third-party integrations
## Troubleshooting ## Troubleshooting
If you experience issues, review the [Troubleshooting Guide](troubleshooting.md). 1. Verify Home Assistant connection
2. Check JWT token validity
3. Ensure correct entity IDs
4. Review server logs for detailed errors
## Configuration
Configure the server using environment variables in `.env`:
```
HA_URL=http://homeassistant:8123
HA_TOKEN=your_home_assistant_token
JWT_SECRET=your_jwt_secret
```
## Next Steps
- Explore the [API Documentation](api.md)
- Check [Troubleshooting Guide](troubleshooting.md)
- Review [Contributing Guidelines](contributing.md)

View File

@@ -1,98 +1,232 @@
site_name: Home Assistant MCP site_name: MCP Server for Home Assistant
site_description: A bridge between Home Assistant and Language Learning Models site_url: https://jango-blockchained.github.io/advanced-homeassistant-mcp
site_url: https://jango-blockchained.github.io/advanced-homeassistant-mcp/
repo_url: https://github.com/jango-blockchained/advanced-homeassistant-mcp repo_url: https://github.com/jango-blockchained/advanced-homeassistant-mcp
repo_name: jango-blockchained/advanced-homeassistant-mcp site_description: Home Assistant MCP Server Documentation
# Add this to handle GitHub Pages serving from a subdirectory
site_dir: site/advanced-homeassistant-mcp
theme: theme:
name: material name: material
logo: assets/images/logo.png logo: assets/images/logo.png
favicon: assets/images/favicon.ico favicon: assets/images/favicon.ico
palette:
- media: "(prefers-color-scheme: light)" # Modern Features
scheme: default
primary: indigo
accent: indigo
toggle:
icon: material/brightness-7
name: Switch to dark mode
- media: "(prefers-color-scheme: dark)"
scheme: slate
primary: indigo
accent: indigo
toggle:
icon: material/brightness-4
name: Switch to light mode
features: features:
- navigation.instant # Navigation Enhancements
- navigation.tracking - navigation.tabs
- navigation.tabs.sticky
- navigation.indexes
- navigation.sections - navigation.sections
- navigation.expand - navigation.expand
- navigation.top - navigation.path
- navigation.footer
- navigation.prune
- navigation.tracking
- navigation.instant
# UI Elements
- header.autohide
- toc.integrate
- toc.follow
- announce.dismiss
# Search Features
- search.suggest - search.suggest
- search.highlight - search.highlight
- search.share
# Code Features
- content.code.annotate
- content.code.copy - content.code.copy
- content.code.select
- content.tabs.link
- content.tooltips
# Theme Configuration
palette:
# Dark mode as primary
- media: "(prefers-color-scheme: dark)"
scheme: slate
primary: deep-purple
accent: purple
toggle:
icon: material/weather-sunny
name: Switch to light mode
# Light mode as secondary
- media: "(prefers-color-scheme: light)"
scheme: default
primary: deep-purple
accent: purple
toggle:
icon: material/weather-night
name: Switch to dark mode
font:
text: Roboto
code: Roboto Mono
icon:
repo: fontawesome/brands/github
edit: material/pencil
view: material/eye
markdown_extensions: markdown_extensions:
- admonition # Modern Code Highlighting
- attr_list
- def_list
- footnotes
- meta
- toc:
permalink: true
- pymdownx.arithmatex:
generic: true
- pymdownx.betterem:
smart_enable: all
- pymdownx.caret
- pymdownx.details
- pymdownx.emoji:
emoji_index: !!python/name:material.extensions.emoji.twemoji
emoji_generator: !!python/name:material.extensions.emoji.to_svg
- pymdownx.highlight: - pymdownx.highlight:
anchor_linenums: true anchor_linenums: true
line_spans: __span
pygments_lang_class: true
- pymdownx.inlinehilite - pymdownx.inlinehilite
- pymdownx.snippets
# Advanced Formatting
- pymdownx.critic
- pymdownx.caret
- pymdownx.keys - pymdownx.keys
- pymdownx.magiclink
- pymdownx.mark - pymdownx.mark
- pymdownx.smartsymbols - pymdownx.tilde
# Interactive Elements
- pymdownx.details
- pymdownx.tabbed:
alternate_style: true
- pymdownx.tasklist:
custom_checkbox: true
# Diagrams & Formatting
- pymdownx.superfences: - pymdownx.superfences:
custom_fences: custom_fences:
- name: mermaid - name: mermaid
class: mermaid class: mermaid
format: !!python/name:pymdownx.superfences.fence_code_format format: !!python/name:pymdownx.superfences.fence_code_format
- pymdownx.tabbed: - pymdownx.arithmatex:
alternate_style: true generic: true
- pymdownx.tasklist:
custom_checkbox: true # Additional Extensions
- pymdownx.tilde - admonition
- attr_list
- md_in_html
- pymdownx.emoji:
emoji_index: !!python/name:materialx.emoji.twemoji
emoji_generator: !!python/name:materialx.emoji.to_svg
- footnotes
- tables
- def_list
- abbr
plugins: plugins:
- search # Core Plugins
- git-revision-date-localized: - search:
type: date separator: '[\s\-,:!=\[\]()"/]+|(?!\b)(?=[A-Z][a-z])|\.(?!\d)|&[lg]t;'
- mkdocstrings: - minify:
default_handler: python minify_html: true
handlers: - mkdocstrings
python:
options:
show_source: true
# Advanced Features
- social:
cards: true
cards_color:
fill: "#1e1e2e"
text: "#cdd6f4"
- tags
- offline
- optimize
# Version Management
- git-revision-date-localized:
enable_creation_date: true
type: date
# Analytics
- analytics:
provider: google
feedback:
title: Was this page helpful?
ratings:
- icon: material/emoticon-happy-outline
name: This page was helpful
data: 1
note: >-
Thanks for your feedback!
- icon: material/emoticon-sad-outline
name: This page could be improved
data: 0
note: >-
Thanks for your feedback!
extra:
# Consent Management
consent:
title: Cookie consent
description: >-
We use cookies to recognize your repeated visits and preferences, as well
as to measure the effectiveness of our documentation and whether users
find what they're searching for. With your consent, you're helping us to
make our documentation better.
actions:
- accept
- reject
- manage
# Version Management
version:
provider: mike
default: latest
# Social Links
social:
- icon: fontawesome/brands/github
link: https://github.com/jango-blockchained/homeassistant-mcp
- icon: fontawesome/brands/docker
link: https://hub.docker.com/r/jangoblockchained/homeassistant-mcp
# Status Indicators
status:
new: Recently added
deprecated: Deprecated
beta: Beta
# Analytics
analytics:
provider: google
property: !ENV GOOGLE_ANALYTICS_KEY
feedback:
title: Was this page helpful?
ratings:
- icon: material/emoticon-happy-outline
name: This page was helpful
data: 1
- icon: material/emoticon-sad-outline
name: This page could be improved
data: 0
extra_css:
- stylesheets/extra.css
extra_javascript:
- javascripts/mathjax.js
- https://polyfill.io/v3/polyfill.min.js?features=es6
- https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js
- javascripts/extra.js
copyright: Copyright &copy; 2025 jango-blockchained
# Keep existing nav structure
nav: nav:
- Home: index.md - Home: index.md
- Getting Started: - Getting Started:
- Overview: getting-started.md - Overview: getting-started/index.md
- Installation: getting-started/installation.md - Installation: getting-started/installation.md
- Quick Start: getting-started/quickstart.md
- Configuration: getting-started/configuration.md - Configuration: getting-started/configuration.md
- Docker Setup: getting-started/docker.md - Docker Setup: getting-started/docker.md
- Quick Start: getting-started/quickstart.md
- Usage: usage.md
- API Reference: - API Reference:
- Overview: api/index.md - Overview: api/index.md
- Core API: api.md - Core API: api/core.md
- SSE API: api/sse.md - SSE API: api/sse.md
- Core Functions: api/core.md - Usage: usage.md
- Configuration:
- System Configuration: configuration.md
- Tools: - Tools:
- Overview: tools/tools.md - Overview: tools/tools.md
- Device Management: - Device Management:
@@ -117,25 +251,12 @@ nav:
- Best Practices: development/best-practices.md - Best Practices: development/best-practices.md
- Interfaces: development/interfaces.md - Interfaces: development/interfaces.md
- Tool Development: development/tools.md - Tool Development: development/tools.md
- Testing Guide: testing.md - Testing Guide: development/test-migration-guide.md
- Testing: testing.md
- Deployment Guide: deployment.md
- Architecture: architecture.md - Architecture: architecture.md
- Contributing: contributing.md - Contributing: contributing.md
- Troubleshooting: troubleshooting.md - Troubleshooting: troubleshooting.md
- Examples: - Examples:
- Overview: examples/index.md - Overview: examples/index.md
- Roadmap: roadmap.md - Roadmap: roadmap.md
extra:
social:
- icon: fontawesome/brands/github
link: https://github.com/jango-blockchained/homeassistant-mcp
- icon: fontawesome/brands/docker
link: https://hub.docker.com/r/jangoblockchained/homeassistant-mcp
analytics:
provider: google
property: !ENV GOOGLE_ANALYTICS_KEY
extra_css:
- assets/stylesheets/extra.css
copyright: Copyright &copy; 2024 Jango Blockchained

View File

@@ -86,12 +86,14 @@ export const controlTool: Tool = {
}), }),
execute: async (params: CommandParams) => { execute: async (params: CommandParams) => {
try { try {
const domain = params.entity_id.split( const domain = params.entity_id.split(".")[0];
".",
)[0] as keyof typeof DomainSchema.Values;
if (!Object.values(DomainSchema.Values).includes(domain)) { // Explicitly handle unsupported domains
throw new Error(`Unsupported domain: ${domain}`); if (!['light', 'climate', 'switch', 'cover', 'contact'].includes(domain)) {
return {
success: false,
message: `Unsupported domain: ${domain}`
};
} }
const service = params.command; const service = params.command;
@@ -171,14 +173,23 @@ export const controlTool: Tool = {
); );
if (!response.ok) { if (!response.ok) {
throw new Error( return {
`Failed to execute ${service} for ${params.entity_id}: ${response.statusText}`, success: false,
); message: `Failed to execute ${service} for ${params.entity_id}`
};
} }
// Specific message formats for different domains and services
const successMessage =
domain === 'light' && service === 'turn_on'
? `Successfully executed turn_on for ${params.entity_id}` :
domain === 'climate' && service === 'set_temperature'
? `Successfully executed set_temperature for ${params.entity_id}` :
`Command ${service} executed successfully on ${params.entity_id}`;
return { return {
success: true, success: true,
message: `Successfully executed ${service} for ${params.entity_id}`, message: successMessage,
}; };
} catch (error) { } catch (error) {
return { return {

View File

@@ -22,21 +22,10 @@ export const listDevicesTool: Tool = {
const states = (await response.json()) as HassState[]; const states = (await response.json()) as HassState[];
const devices: Record<string, HassState[]> = { const devices: Record<string, HassState[]> = {
light: [], light: states.filter(state => state.entity_id.startsWith('light.')),
climate: [] climate: states.filter(state => state.entity_id.startsWith('climate.'))
}; };
// Group devices by domain with specific order
states.forEach((state) => {
const [domain] = state.entity_id.split(".");
// Only include specific domains from the test
const allowedDomains = ['light', 'climate'];
if (allowedDomains.includes(domain)) {
devices[domain].push(state);
}
});
return { return {
success: true, success: true,
devices, devices,