ha-mcp-dev 7.12.3.dev1940__tar.gz → 7.12.3.dev1946__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.12.3.dev1940/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.12.3.dev1946}/PKG-INFO +4 -4
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/README.md +3 -3
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/pyproject.toml +1 -1
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/config.py +31 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/server.py +11 -11
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/settings_ui/_handlers_backups.py +1 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/settings_ui/settings.js +9 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/backup.py +349 -13
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_config_helpers.py +112 -8
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_groups.py +42 -10
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_resources.py +30 -5
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946/src/ha_mcp_dev.egg-info}/PKG-INFO +4 -4
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/LICENSE +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/MANIFEST.in +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/setup.cfg +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/backup_manager.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/browser_landing.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/client/rest_client.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/llm_exposure.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/read_only.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/settings_ui/__init__.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/settings_ui/_persistence.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/settings_ui/_theme.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/settings_ui/settings.css +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/settings_ui/settings.html +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/strict_bps.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/auto_backup.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/component_api.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/config_entry_flow.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/enhanced.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/radio/__init__.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/radio/base.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/radio/matter.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/radio/thread.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/radio/zigbee.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/radio/zwave.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_config_automations.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_dev.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_integrations.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_radio.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_themes.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/transport_security.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/update_check.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/visibility/__init__.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/visibility/model.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/visibility/persistence.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/visibility/resolver.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/tests/__init__.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/tests/test_constants.py +0 -0
- {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/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.12.3.
|
|
3
|
+
Version: 7.12.3.dev1946
|
|
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
|
|
@@ -41,7 +41,7 @@ Dynamic: license-file
|
|
|
41
41
|
<!-- mcp-name: io.github.homeassistant-ai/ha-mcp -->
|
|
42
42
|
|
|
43
43
|
<p align="center">
|
|
44
|
-
<img src="https://img.shields.io/badge/tools-
|
|
44
|
+
<img src="https://img.shields.io/badge/tools-87-blue" alt="95+ Tools">
|
|
45
45
|
<a href="https://github.com/homeassistant-ai/ha-mcp/releases"><img src="https://img.shields.io/github/v/release/homeassistant-ai/ha-mcp" alt="Release"></a>
|
|
46
46
|
<a href="https://github.com/homeassistant-ai/ha-mcp/actions/workflows/e2e-tests.yml"><img src="https://img.shields.io/github/actions/workflow/status/homeassistant-ai/ha-mcp/e2e-tests.yml?branch=master&label=E2E%20Tests" alt="E2E Tests"></a>
|
|
47
47
|
<a href="LICENSE.md"><img src="https://img.shields.io/github/license/homeassistant-ai/ha-mcp.svg" alt="License"></a>
|
|
@@ -247,7 +247,7 @@ Spend less time configuring, more time enjoying your smart home.
|
|
|
247
247
|
<details>
|
|
248
248
|
<!-- TOOLS_TABLE_START -->
|
|
249
249
|
|
|
250
|
-
<summary><b>Complete Tool List (
|
|
250
|
+
<summary><b>Complete Tool List (87 tools)</b></summary>
|
|
251
251
|
|
|
252
252
|
| Category | Tools |
|
|
253
253
|
|----------|-------|
|
|
@@ -278,7 +278,7 @@ Spend less time configuring, more time enjoying your smart home.
|
|
|
278
278
|
| **Service & Device Control** | `ha_bulk_control`, `ha_call_event`, `ha_call_service`, `ha_get_operation_status`, `ha_list_services` |
|
|
279
279
|
| **System** | `ha_config_get_yaml` *(beta)*, `ha_config_set_yaml` *(beta)*, `ha_manage_backup`, `ha_manage_custom_tool` *(beta)*, `ha_manage_theme`, `ha_manage_updates`, `ha_reload_core`, `ha_restart` |
|
|
280
280
|
| **Todo Lists** | `ha_get_todo`, `ha_remove_todo_item`, `ha_set_todo_item` |
|
|
281
|
-
| **Utilities** | `ha_eval_template`, `
|
|
281
|
+
| **Utilities** | `ha_eval_template`, `ha_report_issue` |
|
|
282
282
|
| **Zones** | `ha_get_zone`, `ha_remove_zone`, `ha_set_zone` |
|
|
283
283
|
|
|
284
284
|
<!-- TOOLS_TABLE_END -->
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
<!-- mcp-name: io.github.homeassistant-ai/ha-mcp -->
|
|
9
9
|
|
|
10
10
|
<p align="center">
|
|
11
|
-
<img src="https://img.shields.io/badge/tools-
|
|
11
|
+
<img src="https://img.shields.io/badge/tools-87-blue" alt="95+ Tools">
|
|
12
12
|
<a href="https://github.com/homeassistant-ai/ha-mcp/releases"><img src="https://img.shields.io/github/v/release/homeassistant-ai/ha-mcp" alt="Release"></a>
|
|
13
13
|
<a href="https://github.com/homeassistant-ai/ha-mcp/actions/workflows/e2e-tests.yml"><img src="https://img.shields.io/github/actions/workflow/status/homeassistant-ai/ha-mcp/e2e-tests.yml?branch=master&label=E2E%20Tests" alt="E2E Tests"></a>
|
|
14
14
|
<a href="LICENSE.md"><img src="https://img.shields.io/github/license/homeassistant-ai/ha-mcp.svg" alt="License"></a>
|
|
@@ -214,7 +214,7 @@ Spend less time configuring, more time enjoying your smart home.
|
|
|
214
214
|
<details>
|
|
215
215
|
<!-- TOOLS_TABLE_START -->
|
|
216
216
|
|
|
217
|
-
<summary><b>Complete Tool List (
|
|
217
|
+
<summary><b>Complete Tool List (87 tools)</b></summary>
|
|
218
218
|
|
|
219
219
|
| Category | Tools |
|
|
220
220
|
|----------|-------|
|
|
@@ -245,7 +245,7 @@ Spend less time configuring, more time enjoying your smart home.
|
|
|
245
245
|
| **Service & Device Control** | `ha_bulk_control`, `ha_call_event`, `ha_call_service`, `ha_get_operation_status`, `ha_list_services` |
|
|
246
246
|
| **System** | `ha_config_get_yaml` *(beta)*, `ha_config_set_yaml` *(beta)*, `ha_manage_backup`, `ha_manage_custom_tool` *(beta)*, `ha_manage_theme`, `ha_manage_updates`, `ha_reload_core`, `ha_restart` |
|
|
247
247
|
| **Todo Lists** | `ha_get_todo`, `ha_remove_todo_item`, `ha_set_todo_item` |
|
|
248
|
-
| **Utilities** | `ha_eval_template`, `
|
|
248
|
+
| **Utilities** | `ha_eval_template`, `ha_report_issue` |
|
|
249
249
|
| **Zones** | `ha_get_zone`, `ha_remove_zone`, `ha_set_zone` |
|
|
250
250
|
|
|
251
251
|
<!-- TOOLS_TABLE_END -->
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ha-mcp-dev"
|
|
7
|
-
version = "7.12.3.
|
|
7
|
+
version = "7.12.3.dev1946"
|
|
8
8
|
description = "Home Assistant MCP Server - Complete control of Home Assistant through MCP"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
# Upper bound widened to <3.15 so the package installs on Home Assistant's
|
|
@@ -347,6 +347,26 @@ class Settings(BaseSettings):
|
|
|
347
347
|
7, ge=1, le=365, alias="HAMCP_AUTO_BACKUP_CALENDAR_LOOKAHEAD_DAYS"
|
|
348
348
|
)
|
|
349
349
|
|
|
350
|
+
# Snapshot-tarball deletion gate (#1861). Off by default: an agent
|
|
351
|
+
# deleting a full HA snapshot is categorically riskier than the
|
|
352
|
+
# lightweight `edits`-scope auto-backups (which already delete freely),
|
|
353
|
+
# since a snapshot may be the last recovery point after the agent
|
|
354
|
+
# itself broke something. A human must opt in via env var, the web
|
|
355
|
+
# settings UI override file, or (in the add-on) the Supervisor options
|
|
356
|
+
# — never something the agent can flip on itself.
|
|
357
|
+
enable_snapshot_delete: bool = Field(False, alias="ENABLE_SNAPSHOT_DELETE")
|
|
358
|
+
|
|
359
|
+
# Minimum age (days) a snapshot must have before it's deletable. This is
|
|
360
|
+
# the load-bearing guard, not `enable_snapshot_delete`: a count-based
|
|
361
|
+
# "keep the last N" rule is defeatable by an agent flooding new
|
|
362
|
+
# snapshots before deleting old ones, but it cannot forge a backup's
|
|
363
|
+
# HA-stamped creation date. 0 disables the age floor (still gated by
|
|
364
|
+
# enable_snapshot_delete + the newest-snapshot / automatic-backup
|
|
365
|
+
# guards enforced in tools/backup.py).
|
|
366
|
+
snapshot_delete_min_age_days: int = Field(
|
|
367
|
+
7, ge=0, le=365, alias="SNAPSHOT_DELETE_MIN_AGE_DAYS"
|
|
368
|
+
)
|
|
369
|
+
|
|
350
370
|
# Mirror the legacy ``os.getenv("FLAG", "").lower() in ("true", ...)``
|
|
351
371
|
# semantics for the ex-direct-getenv ``enable_filesystem_tools`` flag (and
|
|
352
372
|
# its sibling toggles listed above): an empty env var value MUST be treated
|
|
@@ -1486,6 +1506,10 @@ BACKUP_OVERRIDE_FIELDS: tuple[BackupOverrideField, ...] = (
|
|
|
1486
1506
|
"HAMCP_AUTO_BACKUP_CALENDAR_LOOKAHEAD_DAYS",
|
|
1487
1507
|
int,
|
|
1488
1508
|
),
|
|
1509
|
+
BackupOverrideField("enable_snapshot_delete", "ENABLE_SNAPSHOT_DELETE", bool),
|
|
1510
|
+
BackupOverrideField(
|
|
1511
|
+
"snapshot_delete_min_age_days", "SNAPSHOT_DELETE_MIN_AGE_DAYS", int
|
|
1512
|
+
),
|
|
1489
1513
|
)
|
|
1490
1514
|
|
|
1491
1515
|
# Override-file location is the same data dir that holds tool_config.json
|
|
@@ -1640,6 +1664,13 @@ def _coerce_backup_int_value(field_name: str, raw: object) -> tuple[bool, Any]:
|
|
|
1640
1664
|
coerced,
|
|
1641
1665
|
)
|
|
1642
1666
|
return False, None
|
|
1667
|
+
if field_name == "snapshot_delete_min_age_days" and not 0 <= coerced <= 365:
|
|
1668
|
+
logger.warning(
|
|
1669
|
+
"backup_settings.json: snapshot_delete_min_age_days=%d out of "
|
|
1670
|
+
"range 0..365; ignoring",
|
|
1671
|
+
coerced,
|
|
1672
|
+
)
|
|
1673
|
+
return False, None
|
|
1643
1674
|
return True, coerced
|
|
1644
1675
|
|
|
1645
1676
|
|
|
@@ -632,9 +632,8 @@ class HomeAssistantSmartMCPServer(EnhancedToolsMixin):
|
|
|
632
632
|
"Create or update a Home Assistant script.\n\n"
|
|
633
633
|
"Supports two modes: full `config` replacement, or surgical "
|
|
634
634
|
"`python_transform` on an existing script (requires "
|
|
635
|
-
"`
|
|
636
|
-
"
|
|
637
|
-
"script.\n\n"
|
|
635
|
+
"`config_hash` from ha_config_get_script). `script_id` names "
|
|
636
|
+
"the script in both modes.\n\n"
|
|
638
637
|
"For schema details and examples, see "
|
|
639
638
|
"ha_get_skill_guide."
|
|
640
639
|
),
|
|
@@ -650,19 +649,20 @@ class HomeAssistantSmartMCPServer(EnhancedToolsMixin):
|
|
|
650
649
|
"Create or update a Home Assistant scene.\n\n"
|
|
651
650
|
"Supports two modes: full `config` replacement, or surgical "
|
|
652
651
|
"`python_transform` on an existing scene (requires "
|
|
653
|
-
"`
|
|
652
|
+
"`config_hash`). `scene_id` names the scene in both modes.\n\n"
|
|
654
653
|
"For schema details and examples, see "
|
|
655
654
|
"ha_get_skill_guide."
|
|
656
655
|
),
|
|
657
656
|
"ha_config_list_helpers": (
|
|
658
|
-
"List Home Assistant helpers of a given
|
|
659
|
-
"
|
|
660
|
-
"
|
|
657
|
+
"List Home Assistant helpers of a given type, one page per "
|
|
658
|
+
"call (`limit`/`offset`; `total_count` and `has_more` "
|
|
659
|
+
"describe the full set). The 12 storage-backed types "
|
|
660
|
+
"(input_button, input_boolean, input_select, input_number, "
|
|
661
661
|
"input_text, input_datetime, counter, timer, schedule, "
|
|
662
|
-
"zone, person, tag. Flow-based
|
|
663
|
-
"
|
|
664
|
-
"
|
|
665
|
-
"
|
|
662
|
+
"zone, person, tag) are listed on every install. Flow-based "
|
|
663
|
+
"types (template, group, utility_meter, derivative, and the "
|
|
664
|
+
"rest) and `helper_type='all'` are served only through the "
|
|
665
|
+
"ha_mcp_tools custom component.\n\n"
|
|
666
666
|
"For per-type schemas and decision guidance, see "
|
|
667
667
|
"ha_get_skill_guide."
|
|
668
668
|
),
|
{ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/settings_ui/_handlers_backups.py
RENAMED
|
@@ -278,6 +278,7 @@ _BACKUP_INT_BOUNDS: dict[str, tuple[int, int]] = {
|
|
|
278
278
|
"auto_backup_throttle_minutes": (0, 1440),
|
|
279
279
|
"auto_backup_retain_per_entity": (1, 10_000),
|
|
280
280
|
"auto_backup_calendar_lookahead_days": (1, 365),
|
|
281
|
+
"snapshot_delete_min_age_days": (0, 365),
|
|
281
282
|
}
|
|
282
283
|
|
|
283
284
|
|
|
@@ -1053,6 +1053,14 @@ const BACKUP_FIELD_LABELS = {
|
|
|
1053
1053
|
label: 'Calendar lookahead (days)',
|
|
1054
1054
|
help: 'How far ahead to query for calendar events when capturing pre-edit snapshots. Range 1–365.',
|
|
1055
1055
|
},
|
|
1056
|
+
enable_snapshot_delete: {
|
|
1057
|
+
label: 'Allow snapshot deletion',
|
|
1058
|
+
help: 'Lets ha_manage_backup delete full HA snapshot tarballs. Off by default: a snapshot may be the last recovery point after a mistaken change. Even when on, scheduled backups, the newest remaining snapshot, and anything younger than the age floor below stay protected.',
|
|
1059
|
+
},
|
|
1060
|
+
snapshot_delete_min_age_days: {
|
|
1061
|
+
label: 'Minimum snapshot age to delete (days)',
|
|
1062
|
+
help: 'A snapshot must be at least this old before it can be deleted. Range 0–365; 0 disables the floor (the newest-snapshot and scheduled-backup protections still apply).',
|
|
1063
|
+
},
|
|
1056
1064
|
};
|
|
1057
1065
|
|
|
1058
1066
|
const BACKUP_ORIGIN_LABELS = {
|
|
@@ -1104,6 +1112,7 @@ function renderBackupConfig() {
|
|
|
1104
1112
|
let max = 10000;
|
|
1105
1113
|
if (f.field === 'auto_backup_throttle_minutes') { min = 0; max = 1440; }
|
|
1106
1114
|
else if (f.field === 'auto_backup_calendar_lookahead_days') { min = 1; max = 365; }
|
|
1115
|
+
else if (f.field === 'snapshot_delete_min_age_days') { min = 0; max = 365; }
|
|
1107
1116
|
controlHtml = `<input type="number" name="backup:${escapeHtml(f.field)}" data-field="${escapeHtml(f.field)}" aria-labelledby="label-backup-${escapeHtml(f.field)}" value="${Number(f.value)}" min="${min}" max="${max}" ${f.editable ? '' : 'disabled'}>`;
|
|
1108
1117
|
}
|
|
1109
1118
|
let originMsg;
|