ha-mcp-dev 7.6.0.dev658__tar.gz → 7.6.0.dev660__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ha_mcp_dev-7.6.0.dev658/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.6.0.dev660}/PKG-INFO +21 -1
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/README.md +20 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/pyproject.toml +1 -1
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/errors.py +3 -3
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/server.py +15 -18
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/settings_ui.py +2 -2
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/smart_search/_deep.py +443 -77
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/smart_search/_fetch.py +28 -9
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/smart_search/_scenes.py +88 -21
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_calendar.py +6 -6
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_camera.py +13 -4
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_code.py +1 -1
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_config_automations.py +9 -9
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_config_dashboards.py +1 -2
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_config_helpers.py +2 -3
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_config_scenes.py +6 -6
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_config_scripts.py +9 -9
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_entities.py +9 -9
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_history.py +2 -2
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_integrations.py +53 -24
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_registry.py +1 -1
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_search.py +829 -63
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_service.py +2 -2
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_traces.py +1 -1
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_voice_assistant.py +1 -1
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/util_helpers.py +16 -8
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/transforms/categorized_search.py +1 -1
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/utils/fuzzy_search.py +1 -1
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660/src/ha_mcp_dev.egg-info}/PKG-INFO +21 -1
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/LICENSE +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/MANIFEST.in +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/setup.cfg +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/backup_manager.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/client/rest_client.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/settings.css +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/settings.js +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/auto_backup.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/enhanced.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_config_entry_flow.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/tests/__init__.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/tests/test_constants.py +0 -0
- {ha_mcp_dev-7.6.0.dev658 → ha_mcp_dev-7.6.0.dev660}/tests/test_env_manager.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ha-mcp-dev
|
|
3
|
-
Version: 7.6.0.
|
|
3
|
+
Version: 7.6.0.dev660
|
|
4
4
|
Summary: Home Assistant MCP Server - Complete control of Home Assistant through MCP
|
|
5
5
|
Author-email: Julien <github@qc-h.net>
|
|
6
6
|
License: MIT
|
|
@@ -245,6 +245,26 @@ Spend less time configuring, more time enjoying your smart home.
|
|
|
245
245
|
|
|
246
246
|
---
|
|
247
247
|
|
|
248
|
+
## 🆚 ha-mcp vs. Home Assistant's built-in MCP Server
|
|
249
|
+
|
|
250
|
+
Home Assistant ships its own [MCP Server integration](https://www.home-assistant.io/integrations/mcp_server/). It is built on the **Assist** pipeline, so a connected MCP client can read and control the entities you have exposed to Assist and run the intents Assist understands — handy for voice-style control of already-exposed devices.
|
|
251
|
+
|
|
252
|
+
ha-mcp is a standalone server built for **configuring, building, and debugging** your smart home, not just controlling it. On top of device control, it adds capabilities the built-in integration does not have:
|
|
253
|
+
|
|
254
|
+
| Capability | Built-in MCP Server | ha-mcp |
|
|
255
|
+
|------------|:-------------------:|:------:|
|
|
256
|
+
| Control exposed devices, query states | Yes | Yes |
|
|
257
|
+
| Entity scope | Only entities exposed to Assist | Everything in Home Assistant |
|
|
258
|
+
| Create / edit automations, scripts, scenes | No | Yes |
|
|
259
|
+
| Build & edit dashboards | No | Yes |
|
|
260
|
+
| Debug automations from traces, read history & logs | No | Yes |
|
|
261
|
+
| Manage helpers, areas, zones, labels, groups | No | Yes |
|
|
262
|
+
| Backups, add-ons, HACS, device & entity registry | No | Yes |
|
|
263
|
+
|
|
264
|
+
**Rule of thumb:** Use the built-in integration for voice-style control of devices you have already exposed; use ha-mcp when you want an AI assistant that can also build and maintain your Home Assistant setup.
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
248
268
|
## 🔌 Custom Component (ha_mcp_tools) *(beta)*
|
|
249
269
|
|
|
250
270
|
Some tools require a companion custom component installed in Home Assistant. Standard HA APIs do not expose file system access or YAML config editing. This component provides both.
|
|
@@ -215,6 +215,26 @@ Spend less time configuring, more time enjoying your smart home.
|
|
|
215
215
|
|
|
216
216
|
---
|
|
217
217
|
|
|
218
|
+
## 🆚 ha-mcp vs. Home Assistant's built-in MCP Server
|
|
219
|
+
|
|
220
|
+
Home Assistant ships its own [MCP Server integration](https://www.home-assistant.io/integrations/mcp_server/). It is built on the **Assist** pipeline, so a connected MCP client can read and control the entities you have exposed to Assist and run the intents Assist understands — handy for voice-style control of already-exposed devices.
|
|
221
|
+
|
|
222
|
+
ha-mcp is a standalone server built for **configuring, building, and debugging** your smart home, not just controlling it. On top of device control, it adds capabilities the built-in integration does not have:
|
|
223
|
+
|
|
224
|
+
| Capability | Built-in MCP Server | ha-mcp |
|
|
225
|
+
|------------|:-------------------:|:------:|
|
|
226
|
+
| Control exposed devices, query states | Yes | Yes |
|
|
227
|
+
| Entity scope | Only entities exposed to Assist | Everything in Home Assistant |
|
|
228
|
+
| Create / edit automations, scripts, scenes | No | Yes |
|
|
229
|
+
| Build & edit dashboards | No | Yes |
|
|
230
|
+
| Debug automations from traces, read history & logs | No | Yes |
|
|
231
|
+
| Manage helpers, areas, zones, labels, groups | No | Yes |
|
|
232
|
+
| Backups, add-ons, HACS, device & entity registry | No | Yes |
|
|
233
|
+
|
|
234
|
+
**Rule of thumb:** Use the built-in integration for voice-style control of devices you have already exposed; use ha-mcp when you want an AI assistant that can also build and maintain your Home Assistant setup.
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
218
238
|
## 🔌 Custom Component (ha_mcp_tools) *(beta)*
|
|
219
239
|
|
|
220
240
|
Some tools require a companion custom component installed in Home Assistant. Standard HA APIs do not expose file system access or YAML config editing. This component provides both.
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ha-mcp-dev"
|
|
7
|
-
version = "7.6.0.
|
|
7
|
+
version = "7.6.0.dev660"
|
|
8
8
|
description = "Home Assistant MCP Server - Complete control of Home Assistant through MCP"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.13,<3.14"
|
|
@@ -134,7 +134,7 @@ DEFAULT_SUGGESTIONS: dict[ErrorCode, list[str]] = {
|
|
|
134
134
|
"Create a new token with required permissions",
|
|
135
135
|
],
|
|
136
136
|
ErrorCode.ENTITY_NOT_FOUND: [
|
|
137
|
-
"Use
|
|
137
|
+
"Use ha_search() to find correct entity ID",
|
|
138
138
|
"Verify the entity exists in Home Assistant",
|
|
139
139
|
"Check for typos in the entity ID",
|
|
140
140
|
],
|
|
@@ -145,7 +145,7 @@ DEFAULT_SUGGESTIONS: dict[ErrorCode, list[str]] = {
|
|
|
145
145
|
],
|
|
146
146
|
ErrorCode.ENTITY_INVALID_ID: [
|
|
147
147
|
"Entity ID must be in format: domain.name",
|
|
148
|
-
"Use
|
|
148
|
+
"Use ha_search() to find valid entity IDs",
|
|
149
149
|
],
|
|
150
150
|
ErrorCode.ENTITY_DOMAIN_MISMATCH: [
|
|
151
151
|
"Cannot change entity to a different domain",
|
|
@@ -241,7 +241,7 @@ def create_error_response(
|
|
|
241
241
|
"code": "ENTITY_NOT_FOUND",
|
|
242
242
|
"message": "Entity light.nonexistent not found",
|
|
243
243
|
"details": "No entity with this ID exists in Home Assistant",
|
|
244
|
-
"suggestion": "Use
|
|
244
|
+
"suggestion": "Use ha_search() to find correct entity ID"
|
|
245
245
|
},
|
|
246
246
|
"entity_id": "light.nonexistent"
|
|
247
247
|
}
|
|
@@ -453,7 +453,7 @@ class HomeAssistantSmartMCPServer(EnhancedToolsMixin):
|
|
|
453
453
|
"Once you know a tool name, call it directly \u2014 no need to search "
|
|
454
454
|
"again.\n\n"
|
|
455
455
|
"If using proxies, call with TWO top-level params:\n"
|
|
456
|
-
' ha_call_read_tool(name="
|
|
456
|
+
' ha_call_read_tool(name="ha_search", arguments={"query": "..."})\n'
|
|
457
457
|
" Do NOT nest name/arguments inside the arguments param.\n"
|
|
458
458
|
" Call proxy tools SEQUENTIALLY, not in parallel.\n\n"
|
|
459
459
|
"ALWAYS search before assuming a capability is unavailable. "
|
|
@@ -467,11 +467,12 @@ class HomeAssistantSmartMCPServer(EnhancedToolsMixin):
|
|
|
467
467
|
# (no semantic matching). Original tool docstrings stay unchanged;
|
|
468
468
|
# these keywords are appended by the transform at list-tools time.
|
|
469
469
|
_SEARCH_KEYWORDS: ClassVar[dict[str, str]] = {
|
|
470
|
-
# s02: "find entities" →
|
|
471
|
-
"
|
|
472
|
-
"find entities lookup discover search lights sensors switches "
|
|
470
|
+
# s02: "find entities or configs" → ha_search outranks more specific tools
|
|
471
|
+
"ha_search": (
|
|
472
|
+
"find entities configs lookup discover search lights sensors switches "
|
|
473
473
|
"covers climate fans media_player binary_sensor device_tracker "
|
|
474
|
-
"person weather automation script helper input_boolean input_number"
|
|
474
|
+
"person weather automation script helper input_boolean input_number "
|
|
475
|
+
"automations scripts scenes helpers dashboards"
|
|
475
476
|
),
|
|
476
477
|
# s07: "get/read automation" → ha_config_get_automation should outrank set
|
|
477
478
|
"ha_config_get_automation": (
|
|
@@ -488,7 +489,7 @@ class HomeAssistantSmartMCPServer(EnhancedToolsMixin):
|
|
|
488
489
|
"integration statistics trend random filter tod "
|
|
489
490
|
"generic_thermostat switch_as_x generic_hygrostat"
|
|
490
491
|
),
|
|
491
|
-
# Boost tools that compete with
|
|
492
|
+
# Boost tools that compete with ha_search for common queries
|
|
492
493
|
"ha_config_get_script": (
|
|
493
494
|
"read inspect fetch view existing script config sequence "
|
|
494
495
|
"actions get show detail"
|
|
@@ -607,7 +608,7 @@ class HomeAssistantSmartMCPServer(EnhancedToolsMixin):
|
|
|
607
608
|
"zone, person, tag. Flow-based helpers (template, group, "
|
|
608
609
|
"utility_meter, derivative, statistics, trend, threshold, "
|
|
609
610
|
"filter, switch_as_x, etc.) cannot be listed through this "
|
|
610
|
-
"tool — use
|
|
611
|
+
"tool — use ha_search.\n\n"
|
|
611
612
|
"For per-type schemas and decision guidance, see "
|
|
612
613
|
"ha_get_skill_guide."
|
|
613
614
|
),
|
|
@@ -655,7 +656,7 @@ class HomeAssistantSmartMCPServer(EnhancedToolsMixin):
|
|
|
655
656
|
"Execute a Home Assistant service to control entities or "
|
|
656
657
|
"trigger automations. Calls `<domain>.<service>` "
|
|
657
658
|
"(e.g., light.turn_on, climate.set_temperature). Use "
|
|
658
|
-
"
|
|
659
|
+
"ha_search to find entity IDs and ha_get_state "
|
|
659
660
|
"to read current values before changing them.\n\n"
|
|
660
661
|
"For service-parameter details and per-domain guidance, "
|
|
661
662
|
"see ha_get_skill_guide."
|
|
@@ -685,15 +686,7 @@ class HomeAssistantSmartMCPServer(EnhancedToolsMixin):
|
|
|
685
686
|
# enable_tool_search=True, because they are tuned specifically for the
|
|
686
687
|
# categorized search transform and replacing the base description would
|
|
687
688
|
# unnecessarily trim context for other clients.
|
|
688
|
-
_SEARCH_DESCRIPTION_OVERRIDES: ClassVar[dict[str, str]] = {
|
|
689
|
-
"ha_deep_search": (
|
|
690
|
-
"Search INSIDE automation, script, and helper YAML configurations. "
|
|
691
|
-
"Use ONLY when you need to find where a specific service call, "
|
|
692
|
-
"entity reference, or config field appears within existing "
|
|
693
|
-
"automation/script/helper definitions. "
|
|
694
|
-
"NOT for finding entities or discovering tools."
|
|
695
|
-
),
|
|
696
|
-
}
|
|
689
|
+
_SEARCH_DESCRIPTION_OVERRIDES: ClassVar[dict[str, str]] = {}
|
|
697
690
|
|
|
698
691
|
def _apply_lite_docstrings(self) -> None:
|
|
699
692
|
"""Swap heavy tool descriptions for shorter variants if enabled.
|
|
@@ -1212,7 +1205,11 @@ class HomeAssistantSmartMCPServer(EnhancedToolsMixin):
|
|
|
1212
1205
|
self.mcp.tool(
|
|
1213
1206
|
name=SKILL_TOOL_NAME,
|
|
1214
1207
|
description=tool_description,
|
|
1215
|
-
annotations={
|
|
1208
|
+
annotations={
|
|
1209
|
+
"readOnlyHint": True,
|
|
1210
|
+
"idempotentHint": True,
|
|
1211
|
+
"title": "Get Home Assistant Best Practices Skill Guide",
|
|
1212
|
+
},
|
|
1216
1213
|
tags={"System"},
|
|
1217
1214
|
)(ha_get_skill_guide)
|
|
1218
1215
|
logger.info(
|
|
@@ -83,12 +83,12 @@ logger = logging.getLogger(__name__)
|
|
|
83
83
|
# Tools that are always enabled regardless of saved config — the server
|
|
84
84
|
# strips them out of any disable list before applying. Three of these
|
|
85
85
|
# overlap with DEFAULT_PINNED_TOOLS in transforms/categorized_search.py
|
|
86
|
-
# (
|
|
86
|
+
# (ha_search, ha_get_overview, ha_report_issue); ha_get_state
|
|
87
87
|
# is mandatory but not pinned-by-default because it is reachable via the
|
|
88
88
|
# ha_call_read_tool proxy when tool search is on. Keep these lists in
|
|
89
89
|
# sync where it matters and divergent where it matters — don't merge them.
|
|
90
90
|
MANDATORY_TOOLS: set[str] = {
|
|
91
|
-
"
|
|
91
|
+
"ha_search",
|
|
92
92
|
"ha_get_overview",
|
|
93
93
|
"ha_get_state",
|
|
94
94
|
"ha_report_issue",
|