ha-mcp-dev 7.14.2.dev2146__tar.gz → 7.14.2.dev2152__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.14.2.dev2146/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.14.2.dev2152}/PKG-INFO +1 -1
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/pyproject.toml +4 -1
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/server.py +4 -4
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/_tools_meta.py +32 -9
- ha_mcp_dev-7.14.2.dev2152/src/ha_mcp/settings_ui/locales/es.json +808 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/locales/zh-Hans.json +808 -813
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_filesystem.py +12 -1
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/transforms/categorized_search.py +17 -6
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp_dev.egg-info/SOURCES.txt +1 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/tests/test_constants.py +1 -1
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/LICENSE +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/MANIFEST.in +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/README.md +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/setup.cfg +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/backup_manager.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/browser_landing.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/client/rest_client.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/llm_exposure.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/read_only.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/__init__.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/_i18n.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/_persistence.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/_theme.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/locales/README.md +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/locales/de.json +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/locales/en.json +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/settings.css +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/settings.html +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/settings.js +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/strict_bps.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/auto_backup.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/component_api.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/component_config_reads.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/component_devices.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/component_registries.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/config_entry_flow.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/enhanced.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/radio/__init__.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/radio/base.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/radio/matter.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/radio/thread.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/radio/zigbee.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/radio/zwave.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_config_automations.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_dev.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_integrations.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_radio.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_themes.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/transport_security.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/update_check.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/utils/config_write_lock.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/visibility/__init__.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/visibility/enforcement.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/visibility/model.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/visibility/persistence.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/visibility/resolver.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/tests/__init__.py +0 -0
- {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/tests/test_env_manager.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ha-mcp-dev"
|
|
7
|
-
version = "7.14.2.
|
|
7
|
+
version = "7.14.2.dev2152"
|
|
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
|
|
@@ -173,6 +173,9 @@ testpaths = ["tests"]
|
|
|
173
173
|
python_files = ["test_*.py", "*_test.py"]
|
|
174
174
|
python_classes = ["Test*"]
|
|
175
175
|
python_functions = ["test_*"]
|
|
176
|
+
# See tests/pytest.ini: an empty parametrize list is a guard that stopped
|
|
177
|
+
# running, and the default mark hides it as a skip the summary ignores.
|
|
178
|
+
empty_parameter_set_mark = "fail_at_collect"
|
|
176
179
|
addopts = [
|
|
177
180
|
"--strict-markers",
|
|
178
181
|
"--strict-config",
|
|
@@ -422,10 +422,10 @@ class HomeAssistantSmartMCPServer(EnhancedToolsMixin):
|
|
|
422
422
|
"again \u2014 call it directly.\n\n"
|
|
423
423
|
f"A few default tools are listed directly "
|
|
424
424
|
f"({', '.join(DEFAULT_PINNED_TOOLS)}) — these are the "
|
|
425
|
-
f"starting pins,
|
|
426
|
-
f"Tools tab in the settings UI, so the
|
|
427
|
-
f"may be a subset of this list.
|
|
428
|
-
f"discovered via search.\n\n"
|
|
425
|
+
f"starting pins, and users can unpin the non-mandatory "
|
|
426
|
+
f"ones via the Tools tab in the settings UI, so the "
|
|
427
|
+
f"actual visible set may be a subset of this list. "
|
|
428
|
+
f"Everything else must be discovered via search.\n\n"
|
|
429
429
|
"DO NOT assume a capability is unavailable because you "
|
|
430
430
|
"don't see a direct tool for it. ALWAYS search first."
|
|
431
431
|
)
|
{ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/_tools_meta.py
RENAMED
|
@@ -15,6 +15,7 @@ families and ``__init__`` can depend on it without cycles.
|
|
|
15
15
|
from __future__ import annotations
|
|
16
16
|
|
|
17
17
|
import logging
|
|
18
|
+
from collections.abc import Iterable
|
|
18
19
|
from typing import TYPE_CHECKING, Any, NamedTuple, NotRequired, TypedDict
|
|
19
20
|
|
|
20
21
|
from ..transforms import categorize_capability
|
|
@@ -50,10 +51,37 @@ class ToolStub(TypedDict):
|
|
|
50
51
|
|
|
51
52
|
_VALID_STATES = frozenset({"enabled", "disabled", "pinned"})
|
|
52
53
|
|
|
54
|
+
# Groups not considered "primary" when choosing a tool's canonical group —
|
|
55
|
+
# these are cross-cutting tags (e.g. Z-Wave, Zigbee) that should not
|
|
56
|
+
# override the tool's real domain group.
|
|
57
|
+
SECONDARY_TAGS = frozenset({"Z-Wave", "Zigbee"})
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def primary_tag(tags: Iterable[str]) -> str:
|
|
61
|
+
"""Return the group heading the settings UI files a tool under.
|
|
62
|
+
|
|
63
|
+
The first tag that is not cross-cutting wins, in sorted order; a tool
|
|
64
|
+
tagged only with cross-cutting tags falls back to its first tag, and an
|
|
65
|
+
untagged tool to ``Other``. Exported so the locale check in
|
|
66
|
+
tests/src/unit/test_locale_parity.py derives the set of reachable group
|
|
67
|
+
names from this rule itself — a copy of the rule drifts even when the
|
|
68
|
+
set it reads cannot.
|
|
69
|
+
"""
|
|
70
|
+
ordered = sorted(tags)
|
|
71
|
+
primary = [tag for tag in ordered if tag not in SECONDARY_TAGS]
|
|
72
|
+
if primary:
|
|
73
|
+
return primary[0]
|
|
74
|
+
return ordered[0] if ordered else "Other"
|
|
75
|
+
|
|
76
|
+
|
|
53
77
|
# Tools that are always enabled regardless of saved config — the server
|
|
54
|
-
# strips them out of any disable list before applying.
|
|
55
|
-
#
|
|
56
|
-
#
|
|
78
|
+
# strips them out of any disable list before applying. The settings UI
|
|
79
|
+
# additionally locks the pin toggle for mandatory tools, so the four
|
|
80
|
+
# that overlap with DEFAULT_PINNED_TOOLS in
|
|
81
|
+
# transforms/categorized_search.py
|
|
82
|
+
# (ha_search, ha_get_overview, ha_report_issue, ha_manage_backup)
|
|
83
|
+
# cannot be unpinned either — always pinned, not just always enabled
|
|
84
|
+
# (#2058);
|
|
57
85
|
# ha_get_state is mandatory but not pinned-by-default because it is
|
|
58
86
|
# reachable via the ha_call_read_tool proxy when tool search is on.
|
|
59
87
|
# ha_get_skill_guide is conditionally mandatory via BPS_MANDATORY_TOOLS
|
|
@@ -239,16 +267,11 @@ async def _get_tool_metadata(
|
|
|
239
267
|
list as of v3.2.0.
|
|
240
268
|
"""
|
|
241
269
|
tools: list[dict[str, Any]] = []
|
|
242
|
-
# Groups not considered "primary" when choosing a tool's canonical group —
|
|
243
|
-
# these are cross-cutting tags (e.g. Z-Wave, Zigbee) that should not
|
|
244
|
-
# override the tool's real domain group.
|
|
245
|
-
secondary_tags = {"Z-Wave", "Zigbee"}
|
|
246
270
|
|
|
247
271
|
registered = await server.mcp.local_provider._list_tools()
|
|
248
272
|
for tool in registered:
|
|
249
273
|
tags = sorted(tool.tags) if tool.tags else []
|
|
250
|
-
|
|
251
|
-
primary = primary_tags[0] if primary_tags else (tags[0] if tags else "Other")
|
|
274
|
+
primary = primary_tag(tags)
|
|
252
275
|
read_only = bool(
|
|
253
276
|
tool.annotations and getattr(tool.annotations, "readOnlyHint", None)
|
|
254
277
|
)
|