ha-mcp-dev 7.6.0.dev659__tar.gz → 7.6.0.dev660__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ha_mcp_dev-7.6.0.dev659/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.6.0.dev660}/PKG-INFO +1 -1
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/pyproject.toml +1 -1
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/errors.py +3 -3
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/server.py +10 -17
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/settings_ui.py +2 -2
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/smart_search/_deep.py +443 -77
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/smart_search/_fetch.py +28 -9
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/smart_search/_scenes.py +88 -21
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_calendar.py +6 -6
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_camera.py +13 -4
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_code.py +1 -1
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_config_automations.py +9 -9
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_config_dashboards.py +1 -2
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_config_helpers.py +2 -3
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_config_scenes.py +6 -6
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_config_scripts.py +9 -9
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_entities.py +9 -9
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_history.py +2 -2
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_integrations.py +53 -24
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_registry.py +1 -1
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_search.py +829 -63
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_service.py +2 -2
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_traces.py +1 -1
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_voice_assistant.py +1 -1
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/util_helpers.py +16 -8
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/transforms/categorized_search.py +1 -1
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/utils/fuzzy_search.py +1 -1
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/LICENSE +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/MANIFEST.in +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/README.md +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/setup.cfg +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/backup_manager.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/client/rest_client.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/settings.css +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/settings.js +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/auto_backup.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/enhanced.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_config_entry_flow.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/tests/__init__.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/tests/test_constants.py +0 -0
- {ha_mcp_dev-7.6.0.dev659 → ha_mcp_dev-7.6.0.dev660}/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.6.0.
|
|
7
|
+
version = "7.6.0.dev660"
|
|
8
8
|
description = "Home Assistant MCP Server - Complete control of Home Assistant through MCP"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.13,<3.14"
|
|
@@ -134,7 +134,7 @@ DEFAULT_SUGGESTIONS: dict[ErrorCode, list[str]] = {
|
|
|
134
134
|
"Create a new token with required permissions",
|
|
135
135
|
],
|
|
136
136
|
ErrorCode.ENTITY_NOT_FOUND: [
|
|
137
|
-
"Use
|
|
137
|
+
"Use ha_search() to find correct entity ID",
|
|
138
138
|
"Verify the entity exists in Home Assistant",
|
|
139
139
|
"Check for typos in the entity ID",
|
|
140
140
|
],
|
|
@@ -145,7 +145,7 @@ DEFAULT_SUGGESTIONS: dict[ErrorCode, list[str]] = {
|
|
|
145
145
|
],
|
|
146
146
|
ErrorCode.ENTITY_INVALID_ID: [
|
|
147
147
|
"Entity ID must be in format: domain.name",
|
|
148
|
-
"Use
|
|
148
|
+
"Use ha_search() to find valid entity IDs",
|
|
149
149
|
],
|
|
150
150
|
ErrorCode.ENTITY_DOMAIN_MISMATCH: [
|
|
151
151
|
"Cannot change entity to a different domain",
|
|
@@ -241,7 +241,7 @@ def create_error_response(
|
|
|
241
241
|
"code": "ENTITY_NOT_FOUND",
|
|
242
242
|
"message": "Entity light.nonexistent not found",
|
|
243
243
|
"details": "No entity with this ID exists in Home Assistant",
|
|
244
|
-
"suggestion": "Use
|
|
244
|
+
"suggestion": "Use ha_search() to find correct entity ID"
|
|
245
245
|
},
|
|
246
246
|
"entity_id": "light.nonexistent"
|
|
247
247
|
}
|
|
@@ -453,7 +453,7 @@ class HomeAssistantSmartMCPServer(EnhancedToolsMixin):
|
|
|
453
453
|
"Once you know a tool name, call it directly \u2014 no need to search "
|
|
454
454
|
"again.\n\n"
|
|
455
455
|
"If using proxies, call with TWO top-level params:\n"
|
|
456
|
-
' ha_call_read_tool(name="
|
|
456
|
+
' ha_call_read_tool(name="ha_search", arguments={"query": "..."})\n'
|
|
457
457
|
" Do NOT nest name/arguments inside the arguments param.\n"
|
|
458
458
|
" Call proxy tools SEQUENTIALLY, not in parallel.\n\n"
|
|
459
459
|
"ALWAYS search before assuming a capability is unavailable. "
|
|
@@ -467,11 +467,12 @@ class HomeAssistantSmartMCPServer(EnhancedToolsMixin):
|
|
|
467
467
|
# (no semantic matching). Original tool docstrings stay unchanged;
|
|
468
468
|
# these keywords are appended by the transform at list-tools time.
|
|
469
469
|
_SEARCH_KEYWORDS: ClassVar[dict[str, str]] = {
|
|
470
|
-
# s02: "find entities" →
|
|
471
|
-
"
|
|
472
|
-
"find entities lookup discover search lights sensors switches "
|
|
470
|
+
# s02: "find entities or configs" → ha_search outranks more specific tools
|
|
471
|
+
"ha_search": (
|
|
472
|
+
"find entities configs lookup discover search lights sensors switches "
|
|
473
473
|
"covers climate fans media_player binary_sensor device_tracker "
|
|
474
|
-
"person weather automation script helper input_boolean input_number"
|
|
474
|
+
"person weather automation script helper input_boolean input_number "
|
|
475
|
+
"automations scripts scenes helpers dashboards"
|
|
475
476
|
),
|
|
476
477
|
# s07: "get/read automation" → ha_config_get_automation should outrank set
|
|
477
478
|
"ha_config_get_automation": (
|
|
@@ -488,7 +489,7 @@ class HomeAssistantSmartMCPServer(EnhancedToolsMixin):
|
|
|
488
489
|
"integration statistics trend random filter tod "
|
|
489
490
|
"generic_thermostat switch_as_x generic_hygrostat"
|
|
490
491
|
),
|
|
491
|
-
# Boost tools that compete with
|
|
492
|
+
# Boost tools that compete with ha_search for common queries
|
|
492
493
|
"ha_config_get_script": (
|
|
493
494
|
"read inspect fetch view existing script config sequence "
|
|
494
495
|
"actions get show detail"
|
|
@@ -607,7 +608,7 @@ class HomeAssistantSmartMCPServer(EnhancedToolsMixin):
|
|
|
607
608
|
"zone, person, tag. Flow-based helpers (template, group, "
|
|
608
609
|
"utility_meter, derivative, statistics, trend, threshold, "
|
|
609
610
|
"filter, switch_as_x, etc.) cannot be listed through this "
|
|
610
|
-
"tool — use
|
|
611
|
+
"tool — use ha_search.\n\n"
|
|
611
612
|
"For per-type schemas and decision guidance, see "
|
|
612
613
|
"ha_get_skill_guide."
|
|
613
614
|
),
|
|
@@ -655,7 +656,7 @@ class HomeAssistantSmartMCPServer(EnhancedToolsMixin):
|
|
|
655
656
|
"Execute a Home Assistant service to control entities or "
|
|
656
657
|
"trigger automations. Calls `<domain>.<service>` "
|
|
657
658
|
"(e.g., light.turn_on, climate.set_temperature). Use "
|
|
658
|
-
"
|
|
659
|
+
"ha_search to find entity IDs and ha_get_state "
|
|
659
660
|
"to read current values before changing them.\n\n"
|
|
660
661
|
"For service-parameter details and per-domain guidance, "
|
|
661
662
|
"see ha_get_skill_guide."
|
|
@@ -685,15 +686,7 @@ class HomeAssistantSmartMCPServer(EnhancedToolsMixin):
|
|
|
685
686
|
# enable_tool_search=True, because they are tuned specifically for the
|
|
686
687
|
# categorized search transform and replacing the base description would
|
|
687
688
|
# unnecessarily trim context for other clients.
|
|
688
|
-
_SEARCH_DESCRIPTION_OVERRIDES: ClassVar[dict[str, str]] = {
|
|
689
|
-
"ha_deep_search": (
|
|
690
|
-
"Search INSIDE automation, script, and helper YAML configurations. "
|
|
691
|
-
"Use ONLY when you need to find where a specific service call, "
|
|
692
|
-
"entity reference, or config field appears within existing "
|
|
693
|
-
"automation/script/helper definitions. "
|
|
694
|
-
"NOT for finding entities or discovering tools."
|
|
695
|
-
),
|
|
696
|
-
}
|
|
689
|
+
_SEARCH_DESCRIPTION_OVERRIDES: ClassVar[dict[str, str]] = {}
|
|
697
690
|
|
|
698
691
|
def _apply_lite_docstrings(self) -> None:
|
|
699
692
|
"""Swap heavy tool descriptions for shorter variants if enabled.
|
|
@@ -83,12 +83,12 @@ logger = logging.getLogger(__name__)
|
|
|
83
83
|
# Tools that are always enabled regardless of saved config — the server
|
|
84
84
|
# strips them out of any disable list before applying. Three of these
|
|
85
85
|
# overlap with DEFAULT_PINNED_TOOLS in transforms/categorized_search.py
|
|
86
|
-
# (
|
|
86
|
+
# (ha_search, ha_get_overview, ha_report_issue); ha_get_state
|
|
87
87
|
# is mandatory but not pinned-by-default because it is reachable via the
|
|
88
88
|
# ha_call_read_tool proxy when tool search is on. Keep these lists in
|
|
89
89
|
# sync where it matters and divergent where it matters — don't merge them.
|
|
90
90
|
MANDATORY_TOOLS: set[str] = {
|
|
91
|
-
"
|
|
91
|
+
"ha_search",
|
|
92
92
|
"ha_get_overview",
|
|
93
93
|
"ha_get_state",
|
|
94
94
|
"ha_report_issue",
|