ha-mcp-dev 7.12.3.dev1934__tar.gz → 7.12.3.dev1940__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.dev1934/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.12.3.dev1940}/PKG-INFO +10 -9
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/README.md +9 -8
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/pyproject.toml +1 -1
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/config.py +3 -17
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/settings_ui/_tools_meta.py +8 -8
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/settings_ui/settings.js +0 -4
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_bug_report.py +3 -5
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_dev.py +2 -1
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_filesystem.py +45 -6
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_hacs.py +10 -22
- ha_mcp_dev-7.12.3.dev1940/src/ha_mcp/tools/tools_yaml_read.py +336 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940/src/ha_mcp_dev.egg-info}/PKG-INFO +10 -9
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp_dev.egg-info/SOURCES.txt +1 -1
- ha_mcp_dev-7.12.3.dev1934/src/ha_mcp/tools/tools_mcp_component.py +0 -410
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/LICENSE +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/MANIFEST.in +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/setup.cfg +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/backup_manager.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/browser_landing.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/client/rest_client.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/llm_exposure.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/read_only.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/server.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/settings_ui/__init__.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/settings_ui/_persistence.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/settings_ui/_theme.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/settings_ui/settings.css +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/settings_ui/settings.html +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/strict_bps.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/auto_backup.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/component_api.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/config_entry_flow.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/enhanced.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/radio/__init__.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/radio/base.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/radio/matter.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/radio/thread.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/radio/zigbee.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/radio/zwave.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_config_automations.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_integrations.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_radio.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_themes.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/transport_security.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/update_check.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/visibility/__init__.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/visibility/model.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/visibility/persistence.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/visibility/resolver.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/tests/__init__.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/tests/test_constants.py +0 -0
- {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/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.dev1940
|
|
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-88-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>
|
|
@@ -83,12 +83,13 @@ The recommended way to run ha-mcp is the **HA-MCP Custom Component**. It install
|
|
|
83
83
|
|
|
84
84
|
**Connect URL.** The Configure screen gives you a Home Assistant webhook URL for remote clients — `https://<your-ha-domain>/api/webhook/<webhook-id>` through Nabu Casa or any reverse proxy already pointed at Home Assistant (locally, `http://<ha-host>:8123/api/webhook/<webhook-id>`). For clients on the same network, the server is also reachable directly at `http://<ha-ip>:9584/private_<random>`.
|
|
85
85
|
|
|
86
|
+
- **Replaces other install methods:** the in-process server is a complete, standalone ha-mcp install — it takes the place of the add-on, Docker, and uvx/PyPI (stdio) methods. Run only one; do not run the in-process server alongside another install.
|
|
86
87
|
- **Local only?** Turn off **Remote access via webhook** in the entry options — no webhook is registered at all, while the direct port and sidebar panel keep working.
|
|
87
88
|
- **Settings panel:** while the server runs, an admin-only **HA-MCP** panel appears in the Home Assistant sidebar for managing tools, feature flags, backups, and themes.
|
|
88
89
|
- **Optional authentication:** set **Webhook authentication** to `ha_auth` to require a Home Assistant account sign-in instead of using the secret URL as the credential.
|
|
89
90
|
- **Manual install (no HACS):** copy `custom_components/ha_mcp_tools/` from this repository into your Home Assistant `config/custom_components/` directory, then restart and add the integration as above.
|
|
90
91
|
|
|
91
|
-
The component's second entry type, **HA
|
|
92
|
+
The component's second entry type, the **File & YAML services entry** (**HA-MCP File & YAML Tools**), is only needed if you enable ha-mcp's opt-in file and YAML editing tools (feature flags, off by default) — skip it otherwise; you can add it later at any time. It works with any server type (in-process, add-on, Docker, or stdio).
|
|
92
93
|
|
|
93
94
|
[Full in-process server documentation →](docs/in-process-server.md) · [Setup Wizard for client-specific config →](https://homeassistant-ai.github.io/ha-mcp/setup/)
|
|
94
95
|
|
|
@@ -246,7 +247,7 @@ Spend less time configuring, more time enjoying your smart home.
|
|
|
246
247
|
<details>
|
|
247
248
|
<!-- TOOLS_TABLE_START -->
|
|
248
249
|
|
|
249
|
-
<summary><b>Complete Tool List (
|
|
250
|
+
<summary><b>Complete Tool List (88 tools)</b></summary>
|
|
250
251
|
|
|
251
252
|
| Category | Tools |
|
|
252
253
|
|----------|-------|
|
|
@@ -275,7 +276,7 @@ Spend less time configuring, more time enjoying your smart home.
|
|
|
275
276
|
| **Scripts** | `ha_config_get_script`, `ha_config_remove_script`, `ha_config_set_script` |
|
|
276
277
|
| **Search & Discovery** | `ha_get_overview`, `ha_get_state`, `ha_search` |
|
|
277
278
|
| **Service & Device Control** | `ha_bulk_control`, `ha_call_event`, `ha_call_service`, `ha_get_operation_status`, `ha_list_services` |
|
|
278
|
-
| **System** | `ha_config_set_yaml` *(beta)*, `ha_manage_backup`, `ha_manage_custom_tool` *(beta)*, `ha_manage_theme`, `ha_manage_updates`, `ha_reload_core`, `ha_restart` |
|
|
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` |
|
|
279
280
|
| **Todo Lists** | `ha_get_todo`, `ha_remove_todo_item`, `ha_set_todo_item` |
|
|
280
281
|
| **Utilities** | `ha_eval_template`, `ha_install_mcp_tools` *(beta)*, `ha_report_issue` |
|
|
281
282
|
| **Zones** | `ha_get_zone`, `ha_remove_zone`, `ha_set_zone` |
|
|
@@ -307,7 +308,7 @@ ha-mcp is a standalone server built for **configuring, building, and debugging**
|
|
|
307
308
|
|
|
308
309
|
## 🔌 Custom Component (ha_mcp_tools) — File & YAML Services
|
|
309
310
|
|
|
310
|
-
The **HA-MCP Custom Component** also powers a set of privileged tools that standard Home Assistant APIs can't provide: file system access and YAML config editing. (The same component runs the full server in-process — that's the recommended install in the **Get Started** section at the top.) Its **
|
|
311
|
+
The **HA-MCP Custom Component** also powers a set of privileged tools that standard Home Assistant APIs can't provide: file system access and YAML config editing. (The same component runs the full server in-process — that's the recommended install in the **Get Started** section at the top.) Its **File & YAML services entry** (**HA-MCP File & YAML Tools**) enables the tools below.
|
|
311
312
|
|
|
312
313
|
**Tools that require the component:**
|
|
313
314
|
|
|
@@ -325,13 +326,13 @@ These tools also require beta feature flags. See **[Beta Features](docs/beta.md)
|
|
|
325
326
|
|
|
326
327
|
### Install
|
|
327
328
|
|
|
328
|
-
Install the **HA
|
|
329
|
+
Install the **HA-MCP File & YAML Tools** entry from the same **HA-MCP Custom Component**:
|
|
329
330
|
|
|
330
331
|
[](https://my.home-assistant.io/redirect/hacs_repository/?owner=homeassistant-ai&repository=ha-mcp-integration&category=integration)
|
|
331
332
|
|
|
332
333
|
To add manually: open **HACS** > **Integrations** > three-dot menu > **Custom repositories** > add `https://github.com/homeassistant-ai/ha-mcp-integration` (category: Integration) > **Download**. Or copy `custom_components/ha_mcp_tools/` from this repository into your HA `config/custom_components/` directory.
|
|
333
334
|
|
|
334
|
-
After installing, restart Home Assistant, then open **Settings** > **Devices & Services** > **Add Integration**, search for **HA-MCP Custom Component**, and add the **HA
|
|
335
|
+
After installing, restart Home Assistant, then open **Settings** > **Devices & Services** > **Add Integration**, search for **HA-MCP Custom Component**, and add the **HA-MCP File & YAML Tools** entry.
|
|
335
336
|
|
|
336
337
|
To run the full ha-mcp server in-process through this same component, see the **Get Started** section at the top and the [full in-process server documentation →](docs/in-process-server.md).
|
|
337
338
|
|
|
@@ -477,7 +478,7 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
|
|
|
477
478
|
- **[@TomasDJo](https://github.com/TomasDJo)** — Category support for automations, scripts, and scenes.
|
|
478
479
|
- **[@bzelch](https://github.com/bzelch)** — `python_transform` support for automations and scripts.
|
|
479
480
|
- **[@gcormier](https://github.com/gcormier)** — Windows installer improvements: removed unused variable and fixed terminal closing after install.
|
|
480
|
-
- **[@ekobres](https://github.com/ekobres)** — Feature flags for `HAMCP_ENABLE_FILESYSTEM_TOOLS` and `HAMCP_ENABLE_CUSTOM_COMPONENT_INTEGRATION` in the add-on config, with beta tagging in source and docs.
|
|
481
|
+
- **[@ekobres](https://github.com/ekobres)** — Feature flags for `HAMCP_ENABLE_FILESYSTEM_TOOLS` and the (since removed) `HAMCP_ENABLE_CUSTOM_COMPONENT_INTEGRATION` in the add-on config, with beta tagging in source and docs.
|
|
481
482
|
- **[@w3z315](https://github.com/w3z315)** — Financial support via [GitHub Sponsors](https://github.com/sponsors/julienld). Thank you! ☕
|
|
482
483
|
- **[@griffinmartin](https://github.com/griffinmartin)** — Added OpenCode (by Anomaly) as a selectable AI client in the setup wizard, with both stdio and streamable HTTP support.
|
|
483
484
|
- **[@hhopke](https://github.com/hhopke)** — Fixed addon API calls to route through HA Core ingress proxy instead of direct container connections, fixing `ha_manage_addon` proxy mode on addon installs.
|
|
@@ -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-88-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>
|
|
@@ -50,12 +50,13 @@ The recommended way to run ha-mcp is the **HA-MCP Custom Component**. It install
|
|
|
50
50
|
|
|
51
51
|
**Connect URL.** The Configure screen gives you a Home Assistant webhook URL for remote clients — `https://<your-ha-domain>/api/webhook/<webhook-id>` through Nabu Casa or any reverse proxy already pointed at Home Assistant (locally, `http://<ha-host>:8123/api/webhook/<webhook-id>`). For clients on the same network, the server is also reachable directly at `http://<ha-ip>:9584/private_<random>`.
|
|
52
52
|
|
|
53
|
+
- **Replaces other install methods:** the in-process server is a complete, standalone ha-mcp install — it takes the place of the add-on, Docker, and uvx/PyPI (stdio) methods. Run only one; do not run the in-process server alongside another install.
|
|
53
54
|
- **Local only?** Turn off **Remote access via webhook** in the entry options — no webhook is registered at all, while the direct port and sidebar panel keep working.
|
|
54
55
|
- **Settings panel:** while the server runs, an admin-only **HA-MCP** panel appears in the Home Assistant sidebar for managing tools, feature flags, backups, and themes.
|
|
55
56
|
- **Optional authentication:** set **Webhook authentication** to `ha_auth` to require a Home Assistant account sign-in instead of using the secret URL as the credential.
|
|
56
57
|
- **Manual install (no HACS):** copy `custom_components/ha_mcp_tools/` from this repository into your Home Assistant `config/custom_components/` directory, then restart and add the integration as above.
|
|
57
58
|
|
|
58
|
-
The component's second entry type, **HA
|
|
59
|
+
The component's second entry type, the **File & YAML services entry** (**HA-MCP File & YAML Tools**), is only needed if you enable ha-mcp's opt-in file and YAML editing tools (feature flags, off by default) — skip it otherwise; you can add it later at any time. It works with any server type (in-process, add-on, Docker, or stdio).
|
|
59
60
|
|
|
60
61
|
[Full in-process server documentation →](docs/in-process-server.md) · [Setup Wizard for client-specific config →](https://homeassistant-ai.github.io/ha-mcp/setup/)
|
|
61
62
|
|
|
@@ -213,7 +214,7 @@ Spend less time configuring, more time enjoying your smart home.
|
|
|
213
214
|
<details>
|
|
214
215
|
<!-- TOOLS_TABLE_START -->
|
|
215
216
|
|
|
216
|
-
<summary><b>Complete Tool List (
|
|
217
|
+
<summary><b>Complete Tool List (88 tools)</b></summary>
|
|
217
218
|
|
|
218
219
|
| Category | Tools |
|
|
219
220
|
|----------|-------|
|
|
@@ -242,7 +243,7 @@ Spend less time configuring, more time enjoying your smart home.
|
|
|
242
243
|
| **Scripts** | `ha_config_get_script`, `ha_config_remove_script`, `ha_config_set_script` |
|
|
243
244
|
| **Search & Discovery** | `ha_get_overview`, `ha_get_state`, `ha_search` |
|
|
244
245
|
| **Service & Device Control** | `ha_bulk_control`, `ha_call_event`, `ha_call_service`, `ha_get_operation_status`, `ha_list_services` |
|
|
245
|
-
| **System** | `ha_config_set_yaml` *(beta)*, `ha_manage_backup`, `ha_manage_custom_tool` *(beta)*, `ha_manage_theme`, `ha_manage_updates`, `ha_reload_core`, `ha_restart` |
|
|
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` |
|
|
246
247
|
| **Todo Lists** | `ha_get_todo`, `ha_remove_todo_item`, `ha_set_todo_item` |
|
|
247
248
|
| **Utilities** | `ha_eval_template`, `ha_install_mcp_tools` *(beta)*, `ha_report_issue` |
|
|
248
249
|
| **Zones** | `ha_get_zone`, `ha_remove_zone`, `ha_set_zone` |
|
|
@@ -274,7 +275,7 @@ ha-mcp is a standalone server built for **configuring, building, and debugging**
|
|
|
274
275
|
|
|
275
276
|
## 🔌 Custom Component (ha_mcp_tools) — File & YAML Services
|
|
276
277
|
|
|
277
|
-
The **HA-MCP Custom Component** also powers a set of privileged tools that standard Home Assistant APIs can't provide: file system access and YAML config editing. (The same component runs the full server in-process — that's the recommended install in the **Get Started** section at the top.) Its **
|
|
278
|
+
The **HA-MCP Custom Component** also powers a set of privileged tools that standard Home Assistant APIs can't provide: file system access and YAML config editing. (The same component runs the full server in-process — that's the recommended install in the **Get Started** section at the top.) Its **File & YAML services entry** (**HA-MCP File & YAML Tools**) enables the tools below.
|
|
278
279
|
|
|
279
280
|
**Tools that require the component:**
|
|
280
281
|
|
|
@@ -292,13 +293,13 @@ These tools also require beta feature flags. See **[Beta Features](docs/beta.md)
|
|
|
292
293
|
|
|
293
294
|
### Install
|
|
294
295
|
|
|
295
|
-
Install the **HA
|
|
296
|
+
Install the **HA-MCP File & YAML Tools** entry from the same **HA-MCP Custom Component**:
|
|
296
297
|
|
|
297
298
|
[](https://my.home-assistant.io/redirect/hacs_repository/?owner=homeassistant-ai&repository=ha-mcp-integration&category=integration)
|
|
298
299
|
|
|
299
300
|
To add manually: open **HACS** > **Integrations** > three-dot menu > **Custom repositories** > add `https://github.com/homeassistant-ai/ha-mcp-integration` (category: Integration) > **Download**. Or copy `custom_components/ha_mcp_tools/` from this repository into your HA `config/custom_components/` directory.
|
|
300
301
|
|
|
301
|
-
After installing, restart Home Assistant, then open **Settings** > **Devices & Services** > **Add Integration**, search for **HA-MCP Custom Component**, and add the **HA
|
|
302
|
+
After installing, restart Home Assistant, then open **Settings** > **Devices & Services** > **Add Integration**, search for **HA-MCP Custom Component**, and add the **HA-MCP File & YAML Tools** entry.
|
|
302
303
|
|
|
303
304
|
To run the full ha-mcp server in-process through this same component, see the **Get Started** section at the top and the [full in-process server documentation →](docs/in-process-server.md).
|
|
304
305
|
|
|
@@ -444,7 +445,7 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
|
|
|
444
445
|
- **[@TomasDJo](https://github.com/TomasDJo)** — Category support for automations, scripts, and scenes.
|
|
445
446
|
- **[@bzelch](https://github.com/bzelch)** — `python_transform` support for automations and scripts.
|
|
446
447
|
- **[@gcormier](https://github.com/gcormier)** — Windows installer improvements: removed unused variable and fixed terminal closing after install.
|
|
447
|
-
- **[@ekobres](https://github.com/ekobres)** — Feature flags for `HAMCP_ENABLE_FILESYSTEM_TOOLS` and `HAMCP_ENABLE_CUSTOM_COMPONENT_INTEGRATION` in the add-on config, with beta tagging in source and docs.
|
|
448
|
+
- **[@ekobres](https://github.com/ekobres)** — Feature flags for `HAMCP_ENABLE_FILESYSTEM_TOOLS` and the (since removed) `HAMCP_ENABLE_CUSTOM_COMPONENT_INTEGRATION` in the add-on config, with beta tagging in source and docs.
|
|
448
449
|
- **[@w3z315](https://github.com/w3z315)** — Financial support via [GitHub Sponsors](https://github.com/sponsors/julienld). Thank you! ☕
|
|
449
450
|
- **[@griffinmartin](https://github.com/griffinmartin)** — Added OpenCode (by Anomaly) as a selectable AI client in the setup wizard, with both stdio and streamable HTTP support.
|
|
450
451
|
- **[@hhopke](https://github.com/hhopke)** — Fixed addon API calls to route through HA Core ingress proxy instead of direct container connections, fixing `ha_manage_addon` proxy mode on addon installs.
|
|
@@ -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.dev1940"
|
|
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
|
|
@@ -257,14 +257,6 @@ class Settings(BaseSettings):
|
|
|
257
257
|
# other gated capability.
|
|
258
258
|
enable_filesystem_tools: bool = Field(False, alias="HAMCP_ENABLE_FILESYSTEM_TOOLS")
|
|
259
259
|
|
|
260
|
-
# Custom-component installer (``ha_install_mcp_tools``) — pulls the
|
|
261
|
-
# ``ha_mcp_tools`` integration into HACS. Same env-var-direct
|
|
262
|
-
# background as ``enable_filesystem_tools``; promoted for the same
|
|
263
|
-
# reason.
|
|
264
|
-
enable_custom_component_integration: bool = Field(
|
|
265
|
-
False, alias="HAMCP_ENABLE_CUSTOM_COMPONENT_INTEGRATION"
|
|
266
|
-
)
|
|
267
|
-
|
|
268
260
|
# Dashboard screenshot mode — the ``ha_get_dashboard_screenshot`` tool
|
|
269
261
|
# plus the ``include_screenshot`` / ``return_screenshot`` params on the
|
|
270
262
|
# dashboard get/set tools. Renders responsive Lovelace images via a
|
|
@@ -356,15 +348,15 @@ class Settings(BaseSettings):
|
|
|
356
348
|
)
|
|
357
349
|
|
|
358
350
|
# Mirror the legacy ``os.getenv("FLAG", "").lower() in ("true", ...)``
|
|
359
|
-
# semantics for the
|
|
360
|
-
#
|
|
351
|
+
# semantics for the ex-direct-getenv ``enable_filesystem_tools`` flag (and
|
|
352
|
+
# its sibling toggles listed above): an empty env var value MUST be treated
|
|
353
|
+
# as False rather than raising
|
|
361
354
|
# ``ValidationError``. Pydantic v2's bool parser raises on ``""``
|
|
362
355
|
# which broke ``test_tools_filesystem.py::TestFeatureFlag::
|
|
363
356
|
# test_disabled_with_empty_string`` after the migration; this
|
|
364
357
|
# validator restores the contract callers rely on.
|
|
365
358
|
@field_validator(
|
|
366
359
|
"enable_filesystem_tools",
|
|
367
|
-
"enable_custom_component_integration",
|
|
368
360
|
"enable_dashboard_screenshot",
|
|
369
361
|
mode="before",
|
|
370
362
|
)
|
|
@@ -693,11 +685,6 @@ FEATURE_FLAG_FIELDS: tuple[FeatureFlagField, ...] = (
|
|
|
693
685
|
FeatureFlagField("enable_yaml_packages_scene", "ENABLE_YAML_PACKAGES_SCENE", bool),
|
|
694
686
|
FeatureFlagField("enable_lite_docstrings", "ENABLE_LITE_DOCSTRINGS", bool),
|
|
695
687
|
FeatureFlagField("enable_filesystem_tools", "HAMCP_ENABLE_FILESYSTEM_TOOLS", bool),
|
|
696
|
-
FeatureFlagField(
|
|
697
|
-
"enable_custom_component_integration",
|
|
698
|
-
"HAMCP_ENABLE_CUSTOM_COMPONENT_INTEGRATION",
|
|
699
|
-
bool,
|
|
700
|
-
),
|
|
701
688
|
# ``enable_code_mode`` lives in this tuple so the override file (and
|
|
702
689
|
# the web UI Server Settings tab) can write the flag. Without this
|
|
703
690
|
# entry, the UI save logic would have nowhere to land the value.
|
|
@@ -744,7 +731,6 @@ BETA_FEATURE_FIELDS: tuple[str, ...] = (
|
|
|
744
731
|
"enable_yaml_packages_script",
|
|
745
732
|
"enable_yaml_packages_scene",
|
|
746
733
|
"enable_filesystem_tools",
|
|
747
|
-
"enable_custom_component_integration",
|
|
748
734
|
"enable_code_mode",
|
|
749
735
|
"enable_lite_docstrings",
|
|
750
736
|
"enable_dashboard_screenshot",
|
{ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/settings_ui/_tools_meta.py
RENAMED
|
@@ -89,7 +89,7 @@ TRANSFORM_GENERATED_TOOLS: dict[str, ToolStub] = {}
|
|
|
89
89
|
# won't appear in local_provider._list_tools(), so we inject stub entries
|
|
90
90
|
# into the settings UI so users discover the tool exists and how to enable
|
|
91
91
|
# it. Keep this dict in sync with the ``"beta"`` tag added to each tool's
|
|
92
|
-
# source file (tools_yaml_config.py,
|
|
92
|
+
# source file (tools_yaml_config.py, tools_yaml_read.py, tools_filesystem.py,
|
|
93
93
|
# tools_code.py) — a future rename or removal needs to land in both places.
|
|
94
94
|
FEATURE_GATED_TOOLS: dict[str, ToolStub] = {
|
|
95
95
|
"ha_config_set_yaml": {
|
|
@@ -99,6 +99,13 @@ FEATURE_GATED_TOOLS: dict[str, ToolStub] = {
|
|
|
99
99
|
"disabled_by": "enable_yaml_config_editing",
|
|
100
100
|
"destructiveHint": True,
|
|
101
101
|
},
|
|
102
|
+
"ha_config_get_yaml": {
|
|
103
|
+
"title": "Read YAML Config Fragment",
|
|
104
|
+
"primary_tag": "System",
|
|
105
|
+
"description": "Read the YAML fragment under a key in a config file, or find which file defines it.",
|
|
106
|
+
"disabled_by": "enable_filesystem_tools",
|
|
107
|
+
"readOnlyHint": True,
|
|
108
|
+
},
|
|
102
109
|
"ha_manage_custom_tool": {
|
|
103
110
|
"title": "Custom Tool",
|
|
104
111
|
"primary_tag": "System",
|
|
@@ -134,13 +141,6 @@ FEATURE_GATED_TOOLS: dict[str, ToolStub] = {
|
|
|
134
141
|
"disabled_by": "enable_filesystem_tools",
|
|
135
142
|
"destructiveHint": True,
|
|
136
143
|
},
|
|
137
|
-
"ha_install_mcp_tools": {
|
|
138
|
-
"title": "Install MCP Tools Component",
|
|
139
|
-
"primary_tag": "Utilities",
|
|
140
|
-
"description": "Install the ha_mcp_tools custom component via HACS.",
|
|
141
|
-
"disabled_by": "enable_custom_component_integration",
|
|
142
|
-
"destructiveHint": True,
|
|
143
|
-
},
|
|
144
144
|
}
|
|
145
145
|
|
|
146
146
|
|
|
@@ -1616,10 +1616,6 @@ const FEATURE_META = {
|
|
|
1616
1616
|
label: "Enable filesystem tools (beta)",
|
|
1617
1617
|
help: "Sets HAMCP_ENABLE_FILESYSTEM_TOOLS=true. Enables direct file read/write access to your Home Assistant filesystem. WARNING: This gives the MCP server sensitive direct file access to your system. Only enable if you trust the AI assistant with file operations. Requires restart to take effect.",
|
|
1618
1618
|
},
|
|
1619
|
-
enable_custom_component_integration: {
|
|
1620
|
-
label: "Enable custom component integration (beta)",
|
|
1621
|
-
help: "Sets HAMCP_ENABLE_CUSTOM_COMPONENT_INTEGRATION=true. Enables the ha_install_mcp_tools installer tool, which can help install the ha_mcp_tools custom component. This setting does not control whether the MCP server loads or interacts with the custom component, and it is not required for filesystem tools to function. Only enable if you want to allow the AI assistant to use the installer tool. Requires restart to take effect.",
|
|
1622
|
-
},
|
|
1623
1619
|
enable_code_mode: {
|
|
1624
1620
|
label: "Enable code-mode sandbox (beta)",
|
|
1625
1621
|
help: "Beta feature, disabled by default. Enables ha_manage_custom_tool, a sandboxed Python interpreter (pydantic-monty) that lets AI assistants write/run/save/delete custom tools when no built-in tool covers the request. Sandbox cannot touch the filesystem or arbitrary network, but CAN call any registered MCP tool, hit the HA REST API, or send HA WebSocket commands, effectively 'do whatever existing tools allow you to do, in any combination'. Saved tools persist and are visible to any client that can connect to ha-mcp. See docs/beta.md for known limitations. Requires restart to take effect.",
|
{ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_bug_report.py
RENAMED
|
@@ -211,10 +211,9 @@ def _detect_platform() -> dict[str, str]:
|
|
|
211
211
|
# ``enable_beta_features`` leads the list because it is the master gate: when
|
|
212
212
|
# off it force-disables every beta sub-flag (filesystem tools, code mode, YAML
|
|
213
213
|
# editing, ...) regardless of the sub-flag's own value, so a "missing tool"
|
|
214
|
-
# report is meaningless without it. ``enable_filesystem_tools``
|
|
215
|
-
#
|
|
216
|
-
#
|
|
217
|
-
# the user couldn't find was even enabled server-side.
|
|
214
|
+
# report is meaningless without it. ``enable_filesystem_tools`` is a beta-gated
|
|
215
|
+
# tool family from issue #1804 — surfacing it lets triage see at a glance whether
|
|
216
|
+
# the tool the user couldn't find was even enabled server-side.
|
|
218
217
|
_CONFIG_TOGGLE_FIELDS: tuple[str, ...] = (
|
|
219
218
|
"enable_beta_features",
|
|
220
219
|
"enable_websocket",
|
|
@@ -223,7 +222,6 @@ _CONFIG_TOGGLE_FIELDS: tuple[str, ...] = (
|
|
|
223
222
|
"tool_search_max_results",
|
|
224
223
|
"enable_yaml_config_editing",
|
|
225
224
|
"enable_filesystem_tools",
|
|
226
|
-
"enable_custom_component_integration",
|
|
227
225
|
"enable_code_mode",
|
|
228
226
|
"enabled_tool_modules",
|
|
229
227
|
)
|
|
@@ -126,7 +126,8 @@ async def find_server_config_entry(
|
|
|
126
126
|
|
|
127
127
|
Probes each ``ha_mcp_tools`` entry's options flow: the server entry's
|
|
128
128
|
flow is a form whose schema carries the ``pip_spec`` field; the tools
|
|
129
|
-
(services) entry's flow
|
|
129
|
+
(services) entry's flow is an informational form with no ``pip_spec``
|
|
130
|
+
field, so it never matches. Returns
|
|
130
131
|
``(entry_id, open_flow, current_options)`` with the options flow left
|
|
131
132
|
OPEN (callers must submit or abort it), or ``None`` when no server
|
|
132
133
|
entry exists. ``current_options`` maps schema field names to their current
|
{ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_filesystem.py
RENAMED
|
@@ -7,8 +7,10 @@ configuration directory, enabling AI assistants to:
|
|
|
7
7
|
- List files in allowed directories
|
|
8
8
|
- Write/delete files in restricted directories (www/, themes/, custom_templates/)
|
|
9
9
|
|
|
10
|
-
**Dependency:** Requires the ha_mcp_tools custom component
|
|
11
|
-
|
|
10
|
+
**Dependency:** Requires the ha_mcp_tools custom component, added in HA via its
|
|
11
|
+
"HA-MCP File & YAML Tools" config entry (NOT the "HA-MCP Server" entry, which
|
|
12
|
+
starts a redundant in-process server). The tools will gracefully fail with
|
|
13
|
+
installation instructions if the component is not available.
|
|
12
14
|
|
|
13
15
|
Feature Flag: Set HAMCP_ENABLE_FILESYSTEM_TOOLS=true to enable these tools.
|
|
14
16
|
"""
|
|
@@ -74,7 +76,14 @@ CALLER_TOKEN_BOOTSTRAP_SERVICE = "get_caller_token"
|
|
|
74
76
|
# ENABLE_YAML_EDIT_CONFIRM, default on); a <0.11.0 component's strict
|
|
75
77
|
# (PREVENT_EXTRA) schema rejects the unknown arg with a raw voluptuous
|
|
76
78
|
# error — the gate surfaces an actionable "update" prompt instead.
|
|
77
|
-
|
|
79
|
+
# 1.1.0: the YAML fragment read (#1788) needs two component behaviours that a
|
|
80
|
+
# <1.1.0 component reports no differently from a missing key. ``list_files``
|
|
81
|
+
# only now honours the configured packages folder, so ha_config_get_yaml's
|
|
82
|
+
# glob/discovery would otherwise come back "Path not allowed" instead of
|
|
83
|
+
# enumerating packages; and ``include_parsed`` on ``read_file`` is a new arg
|
|
84
|
+
# that an older strict (PREVENT_EXTRA) schema rejects with a raw voluptuous
|
|
85
|
+
# error. The gate turns both into the actionable "update" prompt.
|
|
86
|
+
MIN_COMPONENT_VERSION = "1.1.0"
|
|
78
87
|
|
|
79
88
|
|
|
80
89
|
def _version_tuple(version: str) -> tuple[int, ...]:
|
|
@@ -134,7 +143,7 @@ def _raise_component_too_old(detail: str) -> NoReturn:
|
|
|
134
143
|
f"This ha-mcp release requires >= {MIN_COMPONENT_VERSION}. "
|
|
135
144
|
"Update via HACS and restart Home Assistant.",
|
|
136
145
|
suggestions=[
|
|
137
|
-
"HACS → Integrations → HA
|
|
146
|
+
"HACS → Integrations → HA-MCP Custom Component → Update",
|
|
138
147
|
"Restart Home Assistant after update completes",
|
|
139
148
|
"Then retry the operation",
|
|
140
149
|
],
|
|
@@ -355,8 +364,17 @@ async def _assert_mcp_tools_available(client: Any) -> None:
|
|
|
355
364
|
raise_tool_error(
|
|
356
365
|
create_error_response(
|
|
357
366
|
ErrorCode.COMPONENT_NOT_INSTALLED,
|
|
358
|
-
f"The {MCP_TOOLS_DOMAIN} custom component is not installed.
|
|
359
|
-
|
|
367
|
+
f"The {MCP_TOOLS_DOMAIN} custom component is not installed.",
|
|
368
|
+
suggestions=[
|
|
369
|
+
'Add the repository to HACS: ha_manage_hacs(action="add_repository",'
|
|
370
|
+
+ ' repository="homeassistant-ai/ha-mcp-integration", category="integration")',
|
|
371
|
+
'Download the component: ha_manage_hacs(action="download",'
|
|
372
|
+
+ ' repository_id="homeassistant-ai/ha-mcp-integration")',
|
|
373
|
+
"Restart Home Assistant (ha_restart) so the integration loads",
|
|
374
|
+
'In HA, add the "HA-MCP Custom Component" integration and choose the'
|
|
375
|
+
+ ' "HA-MCP File & YAML Tools" entry — NOT "HA-MCP Server", which starts'
|
|
376
|
+
+ " a second in-process server this ha-mcp server does not need",
|
|
377
|
+
],
|
|
360
378
|
)
|
|
361
379
|
)
|
|
362
380
|
|
|
@@ -511,6 +529,19 @@ class FilesystemTools:
|
|
|
511
529
|
),
|
|
512
530
|
),
|
|
513
531
|
] = None,
|
|
532
|
+
yaml_path: Annotated[
|
|
533
|
+
str | None,
|
|
534
|
+
Field(
|
|
535
|
+
default=None,
|
|
536
|
+
description=(
|
|
537
|
+
"Dotted YAML key path (e.g. 'alert2', 'mqtt.sensor'). When "
|
|
538
|
+
"set, the response also carries 'subtree': the round-trip "
|
|
539
|
+
"text of just that key's value. To look a key up across "
|
|
540
|
+
"packages/*.yaml, or to get it as structured data, use "
|
|
541
|
+
"ha_config_get_yaml instead."
|
|
542
|
+
),
|
|
543
|
+
),
|
|
544
|
+
] = None,
|
|
514
545
|
) -> dict[str, Any]:
|
|
515
546
|
"""Read a file from the Home Assistant config directory.
|
|
516
547
|
|
|
@@ -541,6 +572,9 @@ class FilesystemTools:
|
|
|
541
572
|
- size: File size in bytes
|
|
542
573
|
- modified: Last modification timestamp
|
|
543
574
|
- path: The file path that was read
|
|
575
|
+
- subtree: Round-trip text of the `yaml_path` key, when that arg is set
|
|
576
|
+
(null when the key is absent). Comments and HA tags (`!secret`,
|
|
577
|
+
`!include`) survive as written — a `!secret` is never resolved.
|
|
544
578
|
|
|
545
579
|
**Example:**
|
|
546
580
|
```python
|
|
@@ -549,6 +583,9 @@ class FilesystemTools:
|
|
|
549
583
|
|
|
550
584
|
# Read last 100 lines of log
|
|
551
585
|
result = ha_read_file(path="home-assistant.log", tail_lines=100)
|
|
586
|
+
|
|
587
|
+
# Read just the alert2 block out of a package file
|
|
588
|
+
result = ha_read_file(path="packages/alert2.yaml", yaml_path="alert2")
|
|
552
589
|
```
|
|
553
590
|
"""
|
|
554
591
|
try:
|
|
@@ -559,6 +596,8 @@ class FilesystemTools:
|
|
|
559
596
|
service_data: dict[str, Any] = {"path": path}
|
|
560
597
|
if tail_lines is not None:
|
|
561
598
|
service_data["tail_lines"] = tail_lines
|
|
599
|
+
if yaml_path is not None:
|
|
600
|
+
service_data["yaml_path"] = yaml_path
|
|
562
601
|
|
|
563
602
|
# Call the custom component service
|
|
564
603
|
result = await call_mcp_tools_service(
|
|
@@ -685,21 +685,10 @@ def _filter_and_score_repos(
|
|
|
685
685
|
# load-bearing contract is this signal name, not where it's defined.
|
|
686
686
|
HACS_REPOSITORY_SIGNAL = "hacs_dispatch_repository"
|
|
687
687
|
|
|
688
|
-
#
|
|
689
|
-
#
|
|
690
|
-
#
|
|
691
|
-
#
|
|
692
|
-
# value, which flaked ``test_install_mcp_tools_*`` with "Could not
|
|
693
|
-
# find repository ID after adding". The subscription nudges us the
|
|
694
|
-
# instant registration lands, so the happy path returns in seconds and
|
|
695
|
-
# this larger cap only ever costs wall-clock on a genuinely slow add.
|
|
696
|
-
HACS_REPO_REGISTRATION_TIMEOUT = 60.0
|
|
697
|
-
|
|
698
|
-
# Budget for the initial ``hacs/subscribe`` ack. Smaller than the
|
|
699
|
-
# overall registration timeout so a slow subscribe doesn't consume
|
|
700
|
-
# the whole budget before any ``queue.get()`` runs — subscribe acks
|
|
701
|
-
# return in milliseconds in practice, so 10 s is generous and still
|
|
702
|
-
# leaves 20 s of headroom for the queue wait.
|
|
688
|
+
# Budget for the initial ``hacs/subscribe`` ack, separate from the
|
|
689
|
+
# caller-supplied registration budget so a slow subscribe surfaces as
|
|
690
|
+
# its own failure instead of silently consuming the wait — subscribe
|
|
691
|
+
# acks return in milliseconds in practice, so 10 s is generous.
|
|
703
692
|
HACS_SUBSCRIBE_TIMEOUT = 10.0
|
|
704
693
|
|
|
705
694
|
# Backstop poll cadence inside ``wait_for_repo_registration`` —
|
|
@@ -720,11 +709,11 @@ HACS_ADD_REGISTRATION_TIMEOUT = 10.0
|
|
|
720
709
|
|
|
721
710
|
# Wall-clock budget for ``_resolve_hacs_repo_id`` (the ``owner/repo`` lookup
|
|
722
711
|
# behind read-only ``ha_get_hacs_info(action="info")`` and
|
|
723
|
-
# ``ha_manage_hacs(action="download")``).
|
|
724
|
-
# which adds a repo and then waits the full ``HACS_REPO_REGISTRATION_TIMEOUT``
|
|
725
|
-
# for that fresh registration to land — a plain info/download lookup targets a
|
|
712
|
+
# ``ha_manage_hacs(action="download")``). A plain info/download lookup targets a
|
|
726
713
|
# repo that should ALREADY be in HACS's index: default repos always are, and
|
|
727
|
-
# ``add_repository`` blocks until registration is
|
|
714
|
+
# ``ha_manage_hacs(action="add_repository")`` blocks until registration is
|
|
715
|
+
# confirmed before returning (within its own ``HACS_ADD_REGISTRATION_TIMEOUT``
|
|
716
|
+
# budget).
|
|
728
717
|
# So the post-subscribe sample resolves an existing repo instantly, and the
|
|
729
718
|
# dispatch-signal wait only ever burns wall-clock when the repo is genuinely
|
|
730
719
|
# absent. The old 30 s budget made every not-found lookup a 30 s stall (the
|
|
@@ -878,7 +867,7 @@ async def wait_for_repo_registration(
|
|
|
878
867
|
ws_client: Any,
|
|
879
868
|
full_name: str,
|
|
880
869
|
*,
|
|
881
|
-
timeout: float
|
|
870
|
+
timeout: float,
|
|
882
871
|
backstop_poll_interval: float = HACS_REPO_BACKSTOP_POLL_INTERVAL,
|
|
883
872
|
) -> dict[str, Any] | None:
|
|
884
873
|
"""Wait for a HACS repo to register, using HACS' dispatch signal.
|
|
@@ -975,8 +964,7 @@ async def _resolve_hacs_repo_id(ws_client: Any, repository_id: str) -> tuple[str
|
|
|
975
964
|
For GitHub-path identifiers, this uses the HACS dispatch-signal
|
|
976
965
|
waiter so that a caller running immediately after
|
|
977
966
|
``ha_manage_hacs(action="add_repository")`` doesn't race against
|
|
978
|
-
HACS' internal registration
|
|
979
|
-
``ha_install_mcp_tools``.
|
|
967
|
+
HACS' internal registration.
|
|
980
968
|
"""
|
|
981
969
|
if "/" not in repository_id:
|
|
982
970
|
return repository_id, repository_id
|