ha-mcp-dev 7.7.0.dev693__tar.gz → 7.7.0.dev695__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.7.0.dev693/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.7.0.dev695}/PKG-INFO +3 -1
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/README.md +2 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/pyproject.toml +1 -1
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/server.py +7 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/settings_ui.py +8 -2
- ha_mcp_dev-7.7.0.dev695/src/ha_mcp/tools/tool_search_hint_middleware.py +99 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695/src/ha_mcp_dev.egg-info}/PKG-INFO +3 -1
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp_dev.egg-info/SOURCES.txt +1 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/LICENSE +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/MANIFEST.in +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/setup.cfg +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/backup_manager.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/client/rest_client.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/read_only.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/settings.css +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/settings.js +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/auto_backup.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/config_entry_flow.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/enhanced.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_config_automations.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_integrations.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_themes.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/tests/__init__.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/tests/test_constants.py +0 -0
- {ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/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.7.0.
|
|
3
|
+
Version: 7.7.0.dev695
|
|
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
|
|
@@ -349,6 +349,8 @@ The proxy split lets MCP clients apply different permission policies per categor
|
|
|
349
349
|
|
|
350
350
|
Leave it off when using Claude Sonnet/Opus or any client with deferred tool loading; the full catalog has no idle cost there and direct calls skip the search step. If you choose to use our toolsearch then you should disable the native Claude Opus/Sonnet toolsearch, which is called deferred tools in the settings.
|
|
351
351
|
|
|
352
|
+
> 🔄 **Refresh your client's tool list after changing this (or any) setting.** Toggling `ENABLE_TOOL_SEARCH` (or changing pinned/disabled tools, Read Only Mode, etc.) changes the tools the server exposes, but your AI client keeps serving its **cached** tool list until it re-fetches. Restarting the add-on or Home Assistant does **not** refresh the client — reconnect or refresh the MCP server in your client (e.g. re-add/refresh the connector in ChatGPT, or close and reopen Claude Desktop). If you skip this, tools shown as available will return `Unknown tool` when called.
|
|
353
|
+
|
|
352
354
|
For the HA add-on, the same option is documented in [`homeassistant-addon/DOCS.md`](homeassistant-addon/DOCS.md#enable_tool_search) along with the in-add-on settings UI for fine-grained tool enable/disable/pin.
|
|
353
355
|
|
|
354
356
|
---
|
|
@@ -319,6 +319,8 @@ The proxy split lets MCP clients apply different permission policies per categor
|
|
|
319
319
|
|
|
320
320
|
Leave it off when using Claude Sonnet/Opus or any client with deferred tool loading; the full catalog has no idle cost there and direct calls skip the search step. If you choose to use our toolsearch then you should disable the native Claude Opus/Sonnet toolsearch, which is called deferred tools in the settings.
|
|
321
321
|
|
|
322
|
+
> 🔄 **Refresh your client's tool list after changing this (or any) setting.** Toggling `ENABLE_TOOL_SEARCH` (or changing pinned/disabled tools, Read Only Mode, etc.) changes the tools the server exposes, but your AI client keeps serving its **cached** tool list until it re-fetches. Restarting the add-on or Home Assistant does **not** refresh the client — reconnect or refresh the MCP server in your client (e.g. re-add/refresh the connector in ChatGPT, or close and reopen Claude Desktop). If you skip this, tools shown as available will return `Unknown tool` when called.
|
|
323
|
+
|
|
322
324
|
For the HA add-on, the same option is documented in [`homeassistant-addon/DOCS.md`](homeassistant-addon/DOCS.md#enable_tool_search) along with the in-add-on settings UI for fine-grained tool enable/disable/pin.
|
|
323
325
|
|
|
324
326
|
---
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ha-mcp-dev"
|
|
7
|
-
version = "7.7.0.
|
|
7
|
+
version = "7.7.0.dev695"
|
|
8
8
|
description = "Home Assistant MCP Server - Complete control of Home Assistant through MCP"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.13,<3.14"
|
|
@@ -236,6 +236,13 @@ class HomeAssistantSmartMCPServer(EnhancedToolsMixin):
|
|
|
236
236
|
|
|
237
237
|
self.mcp.add_middleware(ValidationErrorMiddleware())
|
|
238
238
|
|
|
239
|
+
# Replace the opaque "Unknown tool" FastMCP raises when a client calls
|
|
240
|
+
# ha_search_tools / the ha_call_* proxies while Tool Search is off
|
|
241
|
+
# (stale client tool-list cache) with an actionable refresh hint.
|
|
242
|
+
from .tools.tool_search_hint_middleware import ToolSearchHintMiddleware
|
|
243
|
+
|
|
244
|
+
self.mcp.add_middleware(ToolSearchHintMiddleware())
|
|
245
|
+
|
|
239
246
|
# Read Only Mode write blocker (discussion #1569) — always
|
|
240
247
|
# installed, consults the live flag per call. Before
|
|
241
248
|
# PolicyMiddleware so a write blocked by Read Only Mode never
|
|
@@ -812,6 +812,10 @@ _SETTINGS_HTML = (
|
|
|
812
812
|
<span class="restart-notice-text" id="restartNoticeText">
|
|
813
813
|
⚠ Changes saved. Restart ha-mcp for them to take effect — disabled
|
|
814
814
|
tools will be fully removed from the MCP tool list on next startup.
|
|
815
|
+
Then reconnect or refresh the MCP server in your AI client (e.g.
|
|
816
|
+
re-add/refresh the connector in ChatGPT, or close and reopen Claude
|
|
817
|
+
Desktop) so it reloads the tool list — restarting the add-on or Home
|
|
818
|
+
Assistant does NOT refresh your client's cached tool list.
|
|
815
819
|
</span>
|
|
816
820
|
<button class="restart-btn" id="restartBtn" style="display:none">Restart Add-on</button>
|
|
817
821
|
</div>
|
|
@@ -857,8 +861,10 @@ _SETTINGS_HTML = (
|
|
|
857
861
|
</div>
|
|
858
862
|
<div class="panel" id="panel-server">
|
|
859
863
|
<div class="features-sub">
|
|
860
|
-
Tool Search, advanced settings. Changes
|
|
861
|
-
|
|
864
|
+
Tool Search, advanced settings. Changes take effect only after you
|
|
865
|
+
restart the add-on (applies the change server-side) AND reconnect or
|
|
866
|
+
refresh the MCP server in your AI client (reloads the tool list) — e.g.
|
|
867
|
+
re-add/refresh the connector in ChatGPT, or close + reopen Claude Desktop.
|
|
862
868
|
</div>
|
|
863
869
|
|
|
864
870
|
<!-- Two-step note + top Save button. The Save +
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"""FastMCP middleware: actionable error for stale tool-search proxy/search calls.
|
|
2
|
+
|
|
3
|
+
When ``enable_tool_search`` is off, the synthetic tool-search tools —
|
|
4
|
+
``ha_search_tools`` and the ``ha_call_{read,write,delete}_tool`` proxies — are
|
|
5
|
+
never registered (the ``CategorizedSearchTransform`` is not installed). If a
|
|
6
|
+
client calls one of them anyway, FastMCP raises a bare ``NotFoundError``
|
|
7
|
+
("Unknown tool: 'ha_search_tools'") with no recovery guidance.
|
|
8
|
+
|
|
9
|
+
That is exactly what happens when an MCP client that caches its tool list is
|
|
10
|
+
still advertising one captured from a previous session when Tool Search was on:
|
|
11
|
+
the client shows ``ha_search_tools`` as available, calls it, and the live
|
|
12
|
+
server — now in Tool-Search-off mode — rejects it. Restarting the add-on or
|
|
13
|
+
Home Assistant does not help because the stale list lives in the client, not
|
|
14
|
+
the server.
|
|
15
|
+
|
|
16
|
+
This middleware intercepts that one case and replaces the opaque "Unknown tool"
|
|
17
|
+
with a structured error that tells the user their tool list is stale and to
|
|
18
|
+
reconnect/refresh the MCP server. It only acts on a *top-level* resolution miss
|
|
19
|
+
for one of those four names while Tool Search is off; in every other case —
|
|
20
|
+
including a ``NotFoundError`` bubbling up from inside an executing tool — the
|
|
21
|
+
original error propagates unchanged.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
from __future__ import annotations
|
|
25
|
+
|
|
26
|
+
import logging
|
|
27
|
+
from typing import Any
|
|
28
|
+
|
|
29
|
+
from fastmcp.exceptions import NotFoundError
|
|
30
|
+
from fastmcp.server.middleware.middleware import CallNext, Middleware, MiddlewareContext
|
|
31
|
+
|
|
32
|
+
from ..config import get_global_settings
|
|
33
|
+
from ..errors import ErrorCode, create_error_response
|
|
34
|
+
from ..policy.middleware import PROXY_META_TOOLS
|
|
35
|
+
from .helpers import raise_tool_error
|
|
36
|
+
|
|
37
|
+
logger = logging.getLogger(__name__)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class ToolSearchHintMiddleware(Middleware):
|
|
41
|
+
"""Turn the opaque "Unknown tool" for tool-search synthetic tools into a
|
|
42
|
+
stale-tool-list hint when Tool Search is disabled."""
|
|
43
|
+
|
|
44
|
+
async def on_call_tool(
|
|
45
|
+
self, context: MiddlewareContext, call_next: CallNext
|
|
46
|
+
) -> Any:
|
|
47
|
+
try:
|
|
48
|
+
return await call_next(context)
|
|
49
|
+
except NotFoundError as exc:
|
|
50
|
+
name = context.message.name
|
|
51
|
+
# Only rewrite a TOP-LEVEL "Unknown tool" miss for one of the four
|
|
52
|
+
# tool-search synthetic names while Tool Search is off:
|
|
53
|
+
# - match the dispatch-layer message so a NotFoundError bubbling up
|
|
54
|
+
# from INSIDE an executing tool (a different name) is never
|
|
55
|
+
# mislabeled as a stale cache; on any wording change this simply
|
|
56
|
+
# fails closed and re-raises the original error.
|
|
57
|
+
# - require Tool Search to be off (when on, the names resolve, so a
|
|
58
|
+
# miss would be a different, real problem we must not mask).
|
|
59
|
+
top_level_miss = str(exc) == f"Unknown tool: {name!r}"
|
|
60
|
+
if (
|
|
61
|
+
top_level_miss
|
|
62
|
+
and name in PROXY_META_TOOLS
|
|
63
|
+
and not get_global_settings().enable_tool_search
|
|
64
|
+
):
|
|
65
|
+
logger.info(
|
|
66
|
+
"Stale tool-search call for %r while enable_tool_search is off "
|
|
67
|
+
"- returning refresh-your-tool-list hint",
|
|
68
|
+
name,
|
|
69
|
+
)
|
|
70
|
+
raise_tool_error(
|
|
71
|
+
create_error_response(
|
|
72
|
+
code=ErrorCode.RESOURCE_NOT_FOUND,
|
|
73
|
+
message=(
|
|
74
|
+
f"'{name}' only exists when Tool Search is enabled, and "
|
|
75
|
+
"Tool Search is currently OFF on this ha-mcp server. Your "
|
|
76
|
+
"MCP client is showing a cached tool list from when Tool "
|
|
77
|
+
"Search was on. After changing any ha-mcp setting (Tool "
|
|
78
|
+
"Search, pinned/disabled tools, etc.) the client must "
|
|
79
|
+
"reconnect or refresh the MCP server to re-fetch the "
|
|
80
|
+
"current tools — restarting the add-on or Home Assistant "
|
|
81
|
+
"does not refresh the client's cached list. With Tool "
|
|
82
|
+
f"Search off, every tool is available directly by name, "
|
|
83
|
+
f"so {name} is not needed."
|
|
84
|
+
),
|
|
85
|
+
suggestions=[
|
|
86
|
+
(
|
|
87
|
+
"Reconnect or refresh the ha-mcp MCP server in your "
|
|
88
|
+
"client to reload the current tool list."
|
|
89
|
+
),
|
|
90
|
+
(
|
|
91
|
+
"Then call the tool you need directly by its name "
|
|
92
|
+
"(with Tool Search off, ha_search_tools and the "
|
|
93
|
+
"ha_call_* proxies do not exist)."
|
|
94
|
+
),
|
|
95
|
+
],
|
|
96
|
+
context={"tool_name": name, "enable_tool_search": False},
|
|
97
|
+
)
|
|
98
|
+
)
|
|
99
|
+
raise
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ha-mcp-dev
|
|
3
|
-
Version: 7.7.0.
|
|
3
|
+
Version: 7.7.0.dev695
|
|
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
|
|
@@ -349,6 +349,8 @@ The proxy split lets MCP clients apply different permission policies per categor
|
|
|
349
349
|
|
|
350
350
|
Leave it off when using Claude Sonnet/Opus or any client with deferred tool loading; the full catalog has no idle cost there and direct calls skip the search step. If you choose to use our toolsearch then you should disable the native Claude Opus/Sonnet toolsearch, which is called deferred tools in the settings.
|
|
351
351
|
|
|
352
|
+
> 🔄 **Refresh your client's tool list after changing this (or any) setting.** Toggling `ENABLE_TOOL_SEARCH` (or changing pinned/disabled tools, Read Only Mode, etc.) changes the tools the server exposes, but your AI client keeps serving its **cached** tool list until it re-fetches. Restarting the add-on or Home Assistant does **not** refresh the client — reconnect or refresh the MCP server in your client (e.g. re-add/refresh the connector in ChatGPT, or close and reopen Claude Desktop). If you skip this, tools shown as available will return `Unknown tool` when called.
|
|
353
|
+
|
|
352
354
|
For the HA add-on, the same option is documented in [`homeassistant-addon/DOCS.md`](homeassistant-addon/DOCS.md#enable_tool_search) along with the in-add-on settings UI for fine-grained tool enable/disable/pin.
|
|
353
355
|
|
|
354
356
|
---
|
|
@@ -68,6 +68,7 @@ src/ha_mcp/tools/enhanced.py
|
|
|
68
68
|
src/ha_mcp/tools/helpers.py
|
|
69
69
|
src/ha_mcp/tools/reference_validator.py
|
|
70
70
|
src/ha_mcp/tools/registry.py
|
|
71
|
+
src/ha_mcp/tools/tool_search_hint_middleware.py
|
|
71
72
|
src/ha_mcp/tools/tools_addons.py
|
|
72
73
|
src/ha_mcp/tools/tools_areas.py
|
|
73
74
|
src/ha_mcp/tools/tools_blueprints.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/dashboard_screenshot/__init__.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/dashboard_screenshot/capture.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/dashboard_screenshot/provision.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/AGENTS.md
RENAMED
|
File without changes
|
{ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/CLAUDE.md
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/LICENSE
RENAMED
|
File without changes
|
{ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/README.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/best_practice_checker.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/smart_search/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/smart_search/_config.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/smart_search/_entities.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/smart_search/_overview.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/smart_search/_scenes.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/smart_search/_scoring.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_config_automations.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_config_dashboards.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_config_helpers.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_config_scripts.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_dashboard_screenshot.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_voice_assistant.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/validation_middleware.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/transforms/categorized_search.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/transforms/lite_docstrings.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/utils/kill_signal_diagnostics.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp_dev.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{ha_mcp_dev-7.7.0.dev693 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp_dev.egg-info/entry_points.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|