ha-mcp-dev 8.7.0.dev3045__tar.gz → 8.7.0.dev3050__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-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/PKG-INFO +1 -1
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/pyproject.toml +1 -1
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/pyproject.toml.orig +1 -1
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/config_meta.py +2 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/config_registry.py +6 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/config_settings.py +14 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/server.py +10 -168
- ha_mcp_dev-8.7.0.dev3050/src/ha_mcp/server_instructions.py +141 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/server_tool_text.py +9 -2
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/_handlers_advanced.py +3 -1
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/_tools_meta.py +2 -1
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/locales/de.json +2 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/locales/en.json +2 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/settings_js/08_advanced.js +2 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/bug_report_config.py +6 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_dev.py +35 -36
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/transforms/categorized_search.py +2 -1
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/utils/skill_loader.py +26 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/LICENSE +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/README.md +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_rich_compat.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/LICENSE +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/REQUIRES.txt +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/VENDORED +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/_compat.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/_install_hints.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/_warnings.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/apps/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/apps/app.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/apps/approval.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/apps/choice.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/apps/config.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/apps/file_upload.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/apps/form.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/apps/generative.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/__main__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev_security.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/auth.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/cimd.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/cli.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/client.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/deploy/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/deploy/authentication.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/deploy/command.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/deploy/configuration.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/deploy/credentials.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/deploy/horizon_client.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/deploy/output.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/deploy/state.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/discovery.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/generate.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/install/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_code.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_desktop.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/install/cursor.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/install/gemini_cli.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/install/goose.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/install/mcp_json.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/install/shared.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/install/stdio.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/cli/run.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/_sdk_context_shim.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/auth/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/auth/bearer.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/auth/client_credentials.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/auth/oauth.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/caching.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/client.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/dependencies.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/elicitation.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/extension_hooks.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/group.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/logging.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/messages.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/mixins/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/mixins/prompts.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/mixins/resources.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/mixins/tools.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/oauth_callback.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/progress.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/roots.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/sampling/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/anthropic.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/google_genai.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/openai.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/telemetry.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/transports/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/transports/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/transports/config.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/transports/http.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/transports/inference.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/transports/memory.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/transports/sse.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/client/transports/stdio.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/contrib/README.md +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/README.md +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/bulk_tool_caller.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/example.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/README.md +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/component_manager.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/example.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/README.md +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/example.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/mcp_mixin.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/decorators.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/dependencies.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/exceptions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/experimental/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/code_mode.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/jev_search.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/mcp_config.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/prompts/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/prompts/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/prompts/function_prompt.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/py.typed +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/resources/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/resources/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/resources/function_resource.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/resources/security.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/resources/template.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/resources/types.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/auth.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/cimd.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/authorize.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/identity_assertion.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/jwt_issuer.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/middleware.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/consent.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/models.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/proxy.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/ui.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/upstream.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/oidc_proxy.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/auth0.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/aws.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/azure.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/clerk.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/debug.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/descope.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/discord.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/github.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/google.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/huggingface.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/in_memory.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/introspection.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/jwt.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/keycloak.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/oci.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/propelauth.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/scalekit.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/supabase.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/workos.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/redirect_validation.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/auth/ssrf.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/caching.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/completions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/context.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/dependencies.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/elicitation.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/event_store.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/extensions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/http.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/lifespan.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/low_level.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/middleware/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/middleware/authorization.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/middleware/caching.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/middleware/dereference.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/middleware/error_handling.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/middleware/logging.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/middleware/middleware.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/middleware/ping.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/middleware/rate_limiting.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/middleware/response_limiting.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/middleware/timing.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/middleware/tool_injection.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/mixins/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/mixins/extensions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/mixins/lifespan.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/mixins/mcp_operations.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/mixins/transport.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/addressing.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/aggregate.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/fastmcp_provider.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem_discovery.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/prompts.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/resources.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/tools.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/local_provider.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/README.md +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/components.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/provider.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/routing.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_payload.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_synthesis.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/proxy.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/_common.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/claude_provider.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/directory_provider.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/skill_provider.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/vendor_providers.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/providers/wrapped_provider.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/server.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/session_scoped_event_store.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/sessions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/telemetry.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/transforms/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/transforms/catalog.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/transforms/namespace.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/transforms/prompts_as_tools.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/transforms/resources_as_tools.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/bm25.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/regex.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/transforms/tool_transform.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/transforms/version_filter.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/server/transforms/visibility.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/settings.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/telemetry.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/tools/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/tools/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/tools/function_parsing.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/tools/function_tool.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/tools/tool_transform.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/types.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/asgi_transport.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/async_utils.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/auth.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/authorization.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/cli.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/components.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/docstring_parsing.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/exceptions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/http.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/inspect.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema_type.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/lifespan.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/logging.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/uv.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/mcp_server_config.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/schema.json +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/filesystem.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/mime.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/README.md +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/director.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/formatters.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/json_schema_converter.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/models.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/parser.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/schemas.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/pagination.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/prefab.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/skills.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/tasks.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/tests.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/timeout.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/token_cache.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/types.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/ui.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/version_check.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/fastmcp/utilities/versions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/LICENSE +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/REQUIRES.txt +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/VENDORED +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/cli/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/cli/claude.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/cli/cli.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/__main__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/_input_required.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/_memory.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/_probe.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/_transport.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/auth/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/auth/exceptions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/auth/extensions/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/auth/extensions/client_credentials.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/auth/extensions/identity_assertion.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/auth/oauth2.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/auth/utils.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/caching.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/client.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/context.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/extension.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/session.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/session_group.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/sse.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/stdio.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/streamable_http.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/client/subscriptions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/os/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/os/posix/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/os/posix/utilities.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/os/win32/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/os/win32/utilities.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/py.typed +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/__main__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/_otel.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/_streamable_http_modern.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/apps.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/auth/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/auth/errors.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/auth/handlers/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/auth/handlers/authorize.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/auth/handlers/metadata.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/auth/handlers/register.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/auth/handlers/revoke.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/auth/handlers/token.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/auth/json_response.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/auth/middleware/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/auth/middleware/auth_context.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/auth/middleware/bearer_auth.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/auth/middleware/client_auth.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/auth/provider.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/auth/routes.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/auth/settings.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/caching.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/connection.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/context.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/elicitation.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/extension.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/fastmcp.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/lowlevel/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/lowlevel/helper_types.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/lowlevel/server.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/context.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/exceptions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/manager.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/resolve.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/resource_manager.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/templates.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/types.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/server.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/tool_manager.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/context_injection.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/func_metadata.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/logging.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/types.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/models.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/request_state.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/runner.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/session.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/sse.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/stdio.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/streamable_http.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/streamable_http_manager.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/subscriptions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/transport_security.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/server/validation.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/_callable_inspection.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/_compat.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/_context_streams.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/_httpx_utils.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/_otel.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/_request_clock.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/_stream_protocols.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/auth.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/auth_utils.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/context.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/direct_dispatcher.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/dispatcher.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/exceptions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/extension.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/inbound.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/jsonrpc_dispatcher.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/memory.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/message.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/metadata_utils.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/path_security.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/peer.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/subscriptions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/tool_name_validation.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/transport_context.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/shared/uri_template.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/types/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/types/jsonrpc.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/types/methods.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp/types/version.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp_types/LICENSE +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp_types/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp_types/REQUIRES.txt +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp_types/VENDORED +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp_types/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp_types/_types.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp_types/_v2025_11_25/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp_types/_v2026_07_28/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp_types/_wire_base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp_types/jsonrpc.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp_types/methods.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp_types/py.typed +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/mcp_types/version.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/requirements.txt +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/client.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/server.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_vendor/websockets/version.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/app_discovery.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/auth/oidc_compat.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/backup_diff.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/backup_entity_ids.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/backup_integrations.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/backup_manager.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/backup_tags.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/browser_landing.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/client/admin_routes.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/client/rest_client.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/config_backup.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/config_overrides.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/ha_request_queue.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/hacs_auto_refresh.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/http_transport.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/image_info.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/llm_exposure.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/log_filters.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/policy/decision_pin.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/policy/decisions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/policy/editing.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/policy/events.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/policy/mrtr.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/policy/server_channels.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/read_only.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/redaction.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/renamed_tools.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-actions.md +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/triggers-and-conditions.md +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/server_lifespan.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/_i18n.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/_persistence.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/_theme.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/locales/README.md +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/locales/az.json +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/locales/es.json +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/locales/it.json +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/locales/zh-Hant.json +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/settings.css +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/settings.html +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/settings_js/01_i18n_state.js +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/settings_js/02_tools_restart.js +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/settings_js/03_render_save.js +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/settings_js/04_backups.js +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/settings_js/05_feature_flags.js +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/settings_js/06_policy_cards.js +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/settings_js/07_policy_actions.js +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/settings_js/09_prefs_visibility.js +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/strict_bps.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tool_dispatch.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/area_messages.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/auto_backup.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/backup_access.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/backup_on_demand.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/best_practice_result.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/best_practice_variables.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/blueprint_sources.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/blueprint_write.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/bug_report_templates.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/bulk_selector.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/coercion.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/component_api.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/component_config_entries.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/component_config_reads.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/component_dashboard_edit.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/component_devices.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/component_helper_collections.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/component_registries.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_entry_backup.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_entry_flow.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_entry_flow_introspect.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_entry_identity.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_helpers/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_helpers/core_payload.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_helpers/create.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_helpers/describe.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_helpers/flow.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_helpers/listing.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_helpers/registry.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_helpers/schemas.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_helpers/typed_config.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_helpers/update.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_helpers/validation.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_subentry_restore.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_write_errors.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/config_write_helpers.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/core_contract.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/dashboard_card_describe.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/dashboard_edit_errors.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/dashboard_list_checks.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/dev_backup.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/device_enrichment.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/diagnostics_helpers.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/energy_preferences.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/entity_param_parsing.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/entity_registration.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/entity_update_fields.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/error_log_parsing.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/flow_helper_lookup.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/hacs_registration.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/helper_flows.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/history_response.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/log_common.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/log_sources.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/log_sources_fault.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/radio/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/radio/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/radio/matter.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/radio/thread.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/radio/zigbee.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/radio/zwave.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/radio/zwave_parameters.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/recorder_errors.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/response_helpers.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/scene_discovery.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/search/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/search/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/search/component.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/search/entities.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/search/legacy.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/search/modes.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/search/overview.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/search/response.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/search/state.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/statistics_helpers.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/statistics_resets.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/system_restart.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tool_hints.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_config_automations.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_integrations.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_logs.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_radio.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_security_policy.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_themes.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/tools/ws_waiters.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/transforms/compact_params.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/transforms/component_helpers.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/transforms/component_search.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/transforms/write_tool_note.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/transport_security.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/update_check.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/utils/config_write_lock.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/utils/dashboard_patch.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/utils/entity_membership.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/utils/mcp_client_host.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/utils/registry_update_lock.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/visibility/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/visibility/enforcement.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/visibility/model.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/visibility/persistence.py +0 -0
- {ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/visibility/resolver.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "uv_build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ha-mcp-dev"
|
|
7
|
-
version = "8.7.0.
|
|
7
|
+
version = "8.7.0.dev3050"
|
|
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.15"
|
|
@@ -4,7 +4,7 @@ build-backend = "uv_build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ha-mcp-dev"
|
|
7
|
-
version = "8.7.0.
|
|
7
|
+
version = "8.7.0.dev3050"
|
|
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
|
|
@@ -75,6 +75,8 @@ class Setting:
|
|
|
75
75
|
range: tuple[float, float] | None = None
|
|
76
76
|
off_value: int | None = None
|
|
77
77
|
choices: tuple[str, ...] | None = None
|
|
78
|
+
# Free text whose line breaks matter; the UI edits it in a textarea.
|
|
79
|
+
multiline: bool = False
|
|
78
80
|
# An env value that does not parse or is out of range logs a warning and
|
|
79
81
|
# gives the default, instead of failing the settings validation.
|
|
80
82
|
lenient: bool = False
|
|
@@ -19,6 +19,7 @@ from ha_mcp.config_settings import Settings
|
|
|
19
19
|
|
|
20
20
|
__all__ = [
|
|
21
21
|
"ADDON_SYNCED_ADVANCED_FIELDS",
|
|
22
|
+
"ADVANCED_MULTILINE",
|
|
22
23
|
"ADVANCED_RESTART_REQUIRED",
|
|
23
24
|
"ADVANCED_SETTINGS_FIELDS",
|
|
24
25
|
"BACKUP_OVERRIDE_FIELDS",
|
|
@@ -244,6 +245,11 @@ _ADVANCED_SETTINGS_CHOICES: dict[str, tuple[str, ...]] = {
|
|
|
244
245
|
if setting.choices is not None
|
|
245
246
|
}
|
|
246
247
|
|
|
248
|
+
# Advanced string fields edited as multi-line text (renders as <textarea>).
|
|
249
|
+
ADVANCED_MULTILINE: frozenset[str] = frozenset(
|
|
250
|
+
name for name, _field, setting in _settings_of("advanced") if setting.multiline
|
|
251
|
+
)
|
|
252
|
+
|
|
247
253
|
# Advanced fields that take effect only after a restart of the MCP server.
|
|
248
254
|
ADVANCED_RESTART_REQUIRED: frozenset[str] = frozenset(
|
|
249
255
|
name
|
|
@@ -280,6 +280,20 @@ class Settings(BaseSettings):
|
|
|
280
280
|
Setting(surface="advanced", section="tools_surface", restart_required=True),
|
|
281
281
|
] = Field("all", alias="ENABLED_TOOL_MODULES")
|
|
282
282
|
|
|
283
|
+
# Free text appended to the MCP server instructions, so every client
|
|
284
|
+
# connecting to this installation gets the same user-defined guidance
|
|
285
|
+
# (e.g. where household notes live). Empty adds nothing.
|
|
286
|
+
custom_instructions: Annotated[
|
|
287
|
+
str,
|
|
288
|
+
Setting(
|
|
289
|
+
surface="advanced",
|
|
290
|
+
section="tools_surface",
|
|
291
|
+
app=_ALL_FLAVORS,
|
|
292
|
+
restart_required=True,
|
|
293
|
+
multiline=True,
|
|
294
|
+
),
|
|
295
|
+
] = Field("", alias="HAMCP_CUSTOM_INSTRUCTIONS")
|
|
296
|
+
|
|
283
297
|
# Dashboard partial update tools (python_transform, find_card)
|
|
284
298
|
# These are token-efficient alternatives to full config replacement.
|
|
285
299
|
# Disable when using clients with programmatic tool use (future).
|
|
@@ -19,16 +19,19 @@ from pydantic import Field
|
|
|
19
19
|
from .config import _PACKAGE_VERSION, get_global_settings
|
|
20
20
|
from .errors import ErrorCode, create_error_response
|
|
21
21
|
from .http_transport import HttpTransportFastMCP as FastMCP
|
|
22
|
+
from .server_instructions import (
|
|
23
|
+
build_skills_instructions,
|
|
24
|
+
compose_instructions,
|
|
25
|
+
skill_tool_hidden,
|
|
26
|
+
)
|
|
22
27
|
from .server_lifespan import server_lifespan
|
|
23
28
|
from .server_tool_text import (
|
|
24
|
-
ISSUE_FILING_INSTRUCTIONS,
|
|
25
29
|
LITE_DOCSTRING_DESTINATIONS,
|
|
26
30
|
LITE_DOCSTRINGS,
|
|
27
|
-
READ_ONLY_INSTRUCTIONS,
|
|
28
31
|
SEARCH_KEYWORDS,
|
|
29
32
|
SEARCH_TOOL_DESCRIPTION,
|
|
33
|
+
SKILL_TOOL_NAME,
|
|
30
34
|
SKILL_USE_BEFORE_KEYWORDS,
|
|
31
|
-
TOOL_DISCOVERY_INSTRUCTIONS,
|
|
32
35
|
)
|
|
33
36
|
from .tools.helpers import raise_tool_error
|
|
34
37
|
from .tools.tool_hints import read_only_hints
|
|
@@ -46,12 +49,6 @@ if TYPE_CHECKING:
|
|
|
46
49
|
|
|
47
50
|
logger = logging.getLogger(__name__)
|
|
48
51
|
|
|
49
|
-
# Name of the consolidated skill tool. Defined as a module
|
|
50
|
-
# constant so settings UI, instructions, tests, and pinning all agree on
|
|
51
|
-
# one canonical string. 18 chars — well under the 40-char cap that
|
|
52
|
-
# Cloudflare's MCP portal enforces (#1121).
|
|
53
|
-
SKILL_TOOL_NAME = "ha_get_skill_guide"
|
|
54
|
-
|
|
55
52
|
# Names this tool replaced in #1134. Appended to the catalog description
|
|
56
53
|
# so agents trained on the prior catalog (or pasting old instructions)
|
|
57
54
|
# see the redirect inside the tool itself, not just via BM25 keyword
|
|
@@ -319,147 +316,18 @@ class HomeAssistantSmartMCPServer:
|
|
|
319
316
|
|
|
320
317
|
return get_skills_dir()
|
|
321
318
|
|
|
322
|
-
def _skill_tool_hidden(self) -> bool:
|
|
323
|
-
"""True when ha_get_skill_guide will be absent from the catalog.
|
|
324
|
-
|
|
325
|
-
The tool is user- or env-disableable only while strict-BPS mode
|
|
326
|
-
is off (#1886) — apply_tool_visibility strips the disable
|
|
327
|
-
otherwise. Consulted at instruction-build time so the skills
|
|
328
|
-
header doesn't direct clients to a tool that is not being
|
|
329
|
-
served. Fails toward False (mention the tool): a wrong mention
|
|
330
|
-
costs one unknown-tool error, a wrong omission hides the only
|
|
331
|
-
non-resource access path.
|
|
332
|
-
"""
|
|
333
|
-
try:
|
|
334
|
-
from .settings_ui._persistence import effective_tool_config
|
|
335
|
-
from .settings_ui._tools_meta import effective_mandatory_tools
|
|
336
|
-
|
|
337
|
-
states = effective_tool_config().get("tools", {})
|
|
338
|
-
return states.get(
|
|
339
|
-
SKILL_TOOL_NAME
|
|
340
|
-
) == "disabled" and SKILL_TOOL_NAME not in effective_mandatory_tools(
|
|
341
|
-
self.settings
|
|
342
|
-
)
|
|
343
|
-
except Exception:
|
|
344
|
-
logger.debug("skill-tool visibility lookup failed", exc_info=True)
|
|
345
|
-
return False
|
|
346
|
-
|
|
347
319
|
def _build_instructions(self) -> str:
|
|
348
320
|
"""Compose the server instructions sent in the MCP initialize response."""
|
|
349
|
-
|
|
350
|
-
skills = self._build_skills_instructions()
|
|
351
|
-
if skills:
|
|
352
|
-
sections.append(skills)
|
|
353
|
-
|
|
354
|
-
# Surface Read Only Mode in the startup instructions so clients
|
|
355
|
-
# that show server instructions warn the model up front. Startup
|
|
356
|
-
# state only — live flips are covered by the structured
|
|
357
|
-
# READ_ONLY_MODE call errors and the ha_get_overview field.
|
|
358
|
-
if self.settings.read_only_mode:
|
|
359
|
-
sections.append(READ_ONLY_INSTRUCTIONS)
|
|
360
|
-
sections.append(ISSUE_FILING_INSTRUCTIONS)
|
|
361
|
-
return "\n\n".join(sections)
|
|
321
|
+
return compose_instructions(self._build_skills_instructions(), self.settings)
|
|
362
322
|
|
|
363
323
|
def _build_skills_instructions(self) -> str | None:
|
|
364
|
-
"""
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
and includes it as-is in the server instructions. The description
|
|
368
|
-
is authored for LLM consumption and should not be parsed or
|
|
369
|
-
restructured by code.
|
|
370
|
-
|
|
371
|
-
Returns None when no skills directory or no parseable skills are
|
|
372
|
-
present, leaving instructions unchanged from the default (None).
|
|
373
|
-
"""
|
|
374
|
-
skills_dir = self._get_skills_dir()
|
|
375
|
-
if not skills_dir:
|
|
376
|
-
return None
|
|
377
|
-
|
|
378
|
-
try:
|
|
379
|
-
entries = sorted(skills_dir.iterdir())
|
|
380
|
-
except OSError as e:
|
|
381
|
-
logger.warning("Could not read skills directory %s: %s", skills_dir, e)
|
|
382
|
-
return None
|
|
383
|
-
|
|
384
|
-
skill_blocks: list[str] = []
|
|
385
|
-
for skill_dir in entries:
|
|
386
|
-
main_file = skill_dir / "SKILL.md"
|
|
387
|
-
if not skill_dir.is_dir() or not main_file.exists():
|
|
388
|
-
continue
|
|
389
|
-
|
|
390
|
-
block = self._build_skill_block(skill_dir.name, main_file)
|
|
391
|
-
if block:
|
|
392
|
-
skill_blocks.append(block)
|
|
393
|
-
|
|
394
|
-
if not skill_blocks:
|
|
395
|
-
return None
|
|
396
|
-
|
|
397
|
-
if self._skill_tool_hidden():
|
|
398
|
-
# The user disabled the skill tool (possible only outside
|
|
399
|
-
# strict-BPS mode, #1886) — directing clients to it would
|
|
400
|
-
# steer them into a tool that is not in the catalog. Their
|
|
401
|
-
# stated fallback is a local skills install.
|
|
402
|
-
access_method = (
|
|
403
|
-
"Read the skill via MCP resources (resources/read with the "
|
|
404
|
-
"skill:// URI) — if you can read these instructions, you "
|
|
405
|
-
"should be able to access resources as well. If for any "
|
|
406
|
-
"reason you cannot access MCP resources, refer to your "
|
|
407
|
-
"locally installed copy of these skills instead (the "
|
|
408
|
-
f"{SKILL_TOOL_NAME} fallback tool is disabled on this "
|
|
409
|
-
"server)."
|
|
410
|
-
)
|
|
411
|
-
else:
|
|
412
|
-
access_method = (
|
|
413
|
-
"Read the skill via MCP resources (resources/read with the "
|
|
414
|
-
"skill:// URI) — if you can read these instructions, you "
|
|
415
|
-
"should be able to access resources as well. If for any "
|
|
416
|
-
f"reason you cannot access MCP resources, call {SKILL_TOOL_NAME}() "
|
|
417
|
-
"with no arguments as a fallback: it returns SKILL.md, then "
|
|
418
|
-
"pass file='<path>' for a reference file. If you can access "
|
|
419
|
-
"resources normally, do "
|
|
420
|
-
"not waste time or tokens on that tool."
|
|
421
|
-
)
|
|
422
|
-
|
|
423
|
-
header = (
|
|
424
|
-
"IMPORTANT: This server provides best-practice skills that MUST "
|
|
425
|
-
"be consulted before performing matching actions. "
|
|
426
|
-
"Read the SKILL.md for the matching skill "
|
|
427
|
-
"\u2014 it contains a Reference Files table that maps tasks to "
|
|
428
|
-
"specific reference files. You MUST read the referenced files "
|
|
429
|
-
"that match your current task before proceeding. "
|
|
430
|
-
"Do NOT load all reference files upfront "
|
|
431
|
-
"\u2014 only the ones the table directs you to.\n\n"
|
|
432
|
-
f"How to access: {access_method}\n"
|
|
324
|
+
"""The skills section of the instructions, or None without skills."""
|
|
325
|
+
return build_skills_instructions(
|
|
326
|
+
self._get_skills_dir(), self.settings, skill_tool_hidden(self.settings)
|
|
433
327
|
)
|
|
434
328
|
|
|
435
|
-
instructions = header + "\n".join(skill_blocks)
|
|
436
|
-
|
|
437
|
-
# Append tool search instructions when enabled
|
|
438
|
-
if self.settings.enable_tool_search:
|
|
439
|
-
instructions += TOOL_DISCOVERY_INSTRUCTIONS.format(
|
|
440
|
-
pinned=", ".join(DEFAULT_PINNED_TOOLS)
|
|
441
|
-
)
|
|
442
|
-
|
|
443
|
-
return instructions
|
|
444
|
-
|
|
445
329
|
_parse_skill_frontmatter = staticmethod(parse_skill_frontmatter)
|
|
446
330
|
|
|
447
|
-
def _build_skill_block(self, skill_name: str, main_file: Path) -> str | None:
|
|
448
|
-
"""Build an instruction block for a single skill.
|
|
449
|
-
|
|
450
|
-
Reads the description field from YAML frontmatter and includes it
|
|
451
|
-
verbatim. The description is designed for LLM consumption and
|
|
452
|
-
contains its own trigger conditions and symptom indicators.
|
|
453
|
-
"""
|
|
454
|
-
frontmatter = self._parse_skill_frontmatter(main_file)
|
|
455
|
-
if not frontmatter:
|
|
456
|
-
return None
|
|
457
|
-
|
|
458
|
-
description = frontmatter["description"]
|
|
459
|
-
uri = f"skill://{skill_name}/SKILL.md"
|
|
460
|
-
|
|
461
|
-
return f"\n### Skill: {skill_name} ({uri})\n{description.strip()}"
|
|
462
|
-
|
|
463
331
|
def _apply_settings_visibility(self) -> None:
|
|
464
332
|
"""Apply persisted tool visibility from ``tool_config.json``.
|
|
465
333
|
|
|
@@ -1089,32 +957,6 @@ class HomeAssistantSmartMCPServer:
|
|
|
1089
957
|
else:
|
|
1090
958
|
logger.warning(message, *args)
|
|
1091
959
|
|
|
1092
|
-
def _list_bundled_skills(
|
|
1093
|
-
self, skills_dir: Path
|
|
1094
|
-
) -> list[tuple[str, Path, dict[str, Any]]]:
|
|
1095
|
-
"""Return parsed (name, dir, frontmatter) triples for valid bundled skills.
|
|
1096
|
-
|
|
1097
|
-
Skips entries that aren't directories, lack ``SKILL.md``, or whose
|
|
1098
|
-
frontmatter doesn't parse. Sorted by directory name for stable
|
|
1099
|
-
ordering across clients.
|
|
1100
|
-
"""
|
|
1101
|
-
try:
|
|
1102
|
-
entries = sorted(skills_dir.iterdir())
|
|
1103
|
-
except OSError as e:
|
|
1104
|
-
logger.warning("Could not read skills directory %s: %s", skills_dir, e)
|
|
1105
|
-
return []
|
|
1106
|
-
|
|
1107
|
-
skills: list[tuple[str, Path, dict[str, Any]]] = []
|
|
1108
|
-
for skill_dir in entries:
|
|
1109
|
-
main_file = skill_dir / "SKILL.md"
|
|
1110
|
-
if not skill_dir.is_dir() or not main_file.exists():
|
|
1111
|
-
continue
|
|
1112
|
-
frontmatter = self._parse_skill_frontmatter(main_file)
|
|
1113
|
-
if not frontmatter:
|
|
1114
|
-
continue
|
|
1115
|
-
skills.append((skill_dir.name, skill_dir, frontmatter))
|
|
1116
|
-
return skills
|
|
1117
|
-
|
|
1118
960
|
def _register_skill_guide_tool(self, skills_dir: Path | None) -> int:
|
|
1119
961
|
"""Register the ``ha_get_skill_guide`` tool unconditionally.
|
|
1120
962
|
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"""The instructions the server sends in the MCP initialize response.
|
|
2
|
+
|
|
3
|
+
Sections, in order: the bundled best-practice skills with how to read them
|
|
4
|
+
(plus the tool-search note when that mode is on), the Read Only Mode
|
|
5
|
+
warning, the issue-filing rule, and the installation owner's
|
|
6
|
+
``custom_instructions``. The skills header and access fallbacks are
|
|
7
|
+
defined here; the notices come from ``server_tool_text``.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import logging
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from typing import TYPE_CHECKING
|
|
15
|
+
|
|
16
|
+
from .server_tool_text import (
|
|
17
|
+
ISSUE_FILING_INSTRUCTIONS,
|
|
18
|
+
READ_ONLY_INSTRUCTIONS,
|
|
19
|
+
SKILL_TOOL_NAME,
|
|
20
|
+
TOOL_DISCOVERY_INSTRUCTIONS,
|
|
21
|
+
)
|
|
22
|
+
from .transforms import DEFAULT_PINNED_TOOLS
|
|
23
|
+
from .utils.skill_loader import list_skills
|
|
24
|
+
|
|
25
|
+
if TYPE_CHECKING:
|
|
26
|
+
from .config_settings import Settings
|
|
27
|
+
|
|
28
|
+
logger = logging.getLogger(__name__)
|
|
29
|
+
|
|
30
|
+
OWNER_HEADING = "## Instructions from this installation's owner"
|
|
31
|
+
|
|
32
|
+
_SKILLS_HEADER = (
|
|
33
|
+
"IMPORTANT: This server provides best-practice skills that MUST "
|
|
34
|
+
"be consulted before performing matching actions. "
|
|
35
|
+
"Read the SKILL.md for the matching skill "
|
|
36
|
+
"— it contains a Reference Files table that maps tasks to "
|
|
37
|
+
"specific reference files. You MUST read the referenced files "
|
|
38
|
+
"that match your current task before proceeding. "
|
|
39
|
+
"Do NOT load all reference files upfront "
|
|
40
|
+
"— only the ones the table directs you to.\n\n"
|
|
41
|
+
"How to access: {access_method}\n"
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
_RESOURCE_ACCESS = (
|
|
45
|
+
"Read the skill via MCP resources (resources/read with the "
|
|
46
|
+
"skill:// URI) — if you can read these instructions, you "
|
|
47
|
+
"should be able to access resources as well. "
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
# The user disabled the skill tool (possible only outside strict-BPS mode,
|
|
51
|
+
# #1886) — directing clients to it would steer them into a tool that is not
|
|
52
|
+
# in the catalog. Their stated fallback is a local skills install.
|
|
53
|
+
_LOCAL_SKILLS_FALLBACK = (
|
|
54
|
+
"If for any reason you cannot access MCP resources, refer to your "
|
|
55
|
+
"locally installed copy of these skills instead (the "
|
|
56
|
+
f"{SKILL_TOOL_NAME} fallback tool is disabled on this server)."
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
_SKILL_TOOL_FALLBACK = (
|
|
60
|
+
f"If for any reason you cannot access MCP resources, call {SKILL_TOOL_NAME}() "
|
|
61
|
+
"with no arguments as a fallback: it returns SKILL.md, then "
|
|
62
|
+
"pass file='<path>' for a reference file. If you can access "
|
|
63
|
+
"resources normally, do not waste time or tokens on that tool."
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def skill_tool_hidden(settings: Settings) -> bool:
|
|
68
|
+
"""True when ha_get_skill_guide will be absent from the catalog.
|
|
69
|
+
|
|
70
|
+
The tool is user- or env-disableable only while strict-BPS mode
|
|
71
|
+
is off (#1886) — apply_tool_visibility strips the disable
|
|
72
|
+
otherwise. Consulted at instruction-build time so the skills
|
|
73
|
+
header doesn't direct clients to a tool that is not being
|
|
74
|
+
served. Fails toward False (mention the tool): a wrong mention
|
|
75
|
+
costs one unknown-tool error, a wrong omission hides the only
|
|
76
|
+
non-resource access path.
|
|
77
|
+
"""
|
|
78
|
+
try:
|
|
79
|
+
from .settings_ui._persistence import effective_tool_config
|
|
80
|
+
from .settings_ui._tools_meta import effective_mandatory_tools
|
|
81
|
+
|
|
82
|
+
states = effective_tool_config(settings).get("tools", {})
|
|
83
|
+
return states.get(
|
|
84
|
+
SKILL_TOOL_NAME
|
|
85
|
+
) == "disabled" and SKILL_TOOL_NAME not in effective_mandatory_tools(settings)
|
|
86
|
+
except Exception:
|
|
87
|
+
logger.debug("skill-tool visibility lookup failed", exc_info=True)
|
|
88
|
+
return False
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def skill_block(skill_name: str, description: str) -> str:
|
|
92
|
+
"""One skill's entry: its resource URI and its LLM-authored description."""
|
|
93
|
+
uri = f"skill://{skill_name}/SKILL.md"
|
|
94
|
+
return f"\n### Skill: {skill_name} ({uri})\n{description.strip()}"
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def build_skills_instructions(
|
|
98
|
+
skills_dir: Path | None, settings: Settings, tool_hidden: bool
|
|
99
|
+
) -> str | None:
|
|
100
|
+
"""Build the skills section from each bundled SKILL.md's frontmatter.
|
|
101
|
+
|
|
102
|
+
The description field is authored for LLM consumption and included
|
|
103
|
+
as-is, never parsed or restructured by code. Returns None when there is
|
|
104
|
+
no skills directory or no parseable skill; the instructions then start
|
|
105
|
+
with the notices.
|
|
106
|
+
"""
|
|
107
|
+
skills = list_skills(skills_dir) if skills_dir else []
|
|
108
|
+
if not skills:
|
|
109
|
+
return None
|
|
110
|
+
|
|
111
|
+
fallback = _LOCAL_SKILLS_FALLBACK if tool_hidden else _SKILL_TOOL_FALLBACK
|
|
112
|
+
header = _SKILLS_HEADER.format(access_method=_RESOURCE_ACCESS + fallback)
|
|
113
|
+
instructions = header + "\n".join(
|
|
114
|
+
skill_block(name, frontmatter["description"])
|
|
115
|
+
for name, _dir, frontmatter in skills
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
if settings.enable_tool_search:
|
|
119
|
+
instructions += TOOL_DISCOVERY_INSTRUCTIONS.format(
|
|
120
|
+
pinned=", ".join(DEFAULT_PINNED_TOOLS)
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
return instructions
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def compose_instructions(skills: str | None, settings: Settings) -> str:
|
|
127
|
+
"""Join the skills section with the startup notices and the owner's text."""
|
|
128
|
+
sections = [skills] if skills else []
|
|
129
|
+
# Surface Read Only Mode in the startup instructions so clients
|
|
130
|
+
# that show server instructions warn the model up front. Startup
|
|
131
|
+
# state only — live flips are covered by the structured
|
|
132
|
+
# READ_ONLY_MODE call errors and the ha_get_overview field.
|
|
133
|
+
if settings.read_only_mode:
|
|
134
|
+
sections.append(READ_ONLY_INSTRUCTIONS)
|
|
135
|
+
sections.append(ISSUE_FILING_INSTRUCTIONS)
|
|
136
|
+
custom = settings.custom_instructions.strip()
|
|
137
|
+
if custom:
|
|
138
|
+
# Length only: the text itself is the owner's and may be personal.
|
|
139
|
+
logger.info("custom_instructions active (%d characters)", len(custom))
|
|
140
|
+
sections.append(f"{OWNER_HEADING}\n{custom}")
|
|
141
|
+
return "\n\n".join(sections)
|
|
@@ -1,12 +1,19 @@
|
|
|
1
1
|
"""Static text the server publishes about its tools.
|
|
2
2
|
|
|
3
3
|
Holds the search tool description, the BM25 keyword boosts, the lite
|
|
4
|
-
docstring variants with their destinations
|
|
5
|
-
``HomeAssistantSmartMCPServer`` exposes
|
|
4
|
+
docstring variants with their destinations and the skill keyword block,
|
|
5
|
+
which ``HomeAssistantSmartMCPServer`` exposes as class attributes, plus the
|
|
6
|
+
skill tool's name and the instruction notices ``server_instructions`` uses.
|
|
6
7
|
"""
|
|
7
8
|
|
|
8
9
|
from __future__ import annotations
|
|
9
10
|
|
|
11
|
+
# Name of the consolidated skill tool. Defined as a module constant so the
|
|
12
|
+
# tool registration, the instructions, the mandatory-tool set, the default
|
|
13
|
+
# pins and the tests agree on one canonical string. 18 chars — well under
|
|
14
|
+
# the 40-char cap that Cloudflare's MCP portal enforces (#1121).
|
|
15
|
+
SKILL_TOOL_NAME = "ha_get_skill_guide"
|
|
16
|
+
|
|
10
17
|
# Description for the unified search tool
|
|
11
18
|
SEARCH_TOOL_DESCRIPTION = (
|
|
12
19
|
"Search ALL Home Assistant tools by ENGLISH keyword. Each hit is "
|
{ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/_handlers_advanced.py
RENAMED
|
@@ -88,7 +88,7 @@ def _advanced_field_row(
|
|
|
88
88
|
_ADVANCED_SETTINGS_SENTINELS,
|
|
89
89
|
OAUTH_MODE_TOKEN,
|
|
90
90
|
)
|
|
91
|
-
from ..config_registry import ADVANCED_RESTART_REQUIRED
|
|
91
|
+
from ..config_registry import ADVANCED_MULTILINE, ADVANCED_RESTART_REQUIRED
|
|
92
92
|
|
|
93
93
|
origin = _origin_for_advanced_field(env_name, overrides=overrides)
|
|
94
94
|
value: Any = getattr(settings, fname, None)
|
|
@@ -122,6 +122,8 @@ def _advanced_field_row(
|
|
|
122
122
|
choices = _ADVANCED_SETTINGS_CHOICES.get(fname)
|
|
123
123
|
if choices is not None:
|
|
124
124
|
row["choices"] = list(choices)
|
|
125
|
+
if fname in ADVANCED_MULTILINE:
|
|
126
|
+
row["multiline"] = True
|
|
125
127
|
return row
|
|
126
128
|
|
|
127
129
|
|
|
@@ -18,6 +18,7 @@ import logging
|
|
|
18
18
|
from collections.abc import Iterable
|
|
19
19
|
from typing import TYPE_CHECKING, Any, NamedTuple, NotRequired, TypedDict
|
|
20
20
|
|
|
21
|
+
from ..server_tool_text import SKILL_TOOL_NAME
|
|
21
22
|
from ..transforms import categorize_capability
|
|
22
23
|
|
|
23
24
|
if TYPE_CHECKING:
|
|
@@ -116,7 +117,7 @@ MANDATORY_TOOLS: set[str] = {
|
|
|
116
117
|
# _save_feature_flags) so each direction of the conflict gets an
|
|
117
118
|
# actionable error.
|
|
118
119
|
BPS_MANDATORY_TOOLS: set[str] = {
|
|
119
|
-
|
|
120
|
+
SKILL_TOOL_NAME,
|
|
120
121
|
}
|
|
121
122
|
|
|
122
123
|
|
{ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/locales/de.json
RENAMED
|
@@ -472,6 +472,8 @@
|
|
|
472
472
|
"advanced.dashboard_screenshot_engine_url.help": "Basis-URL der Screenshot-Engine. Lasse leer für Supervisor-Auto-Discovery. Wirkt sofort.",
|
|
473
473
|
"advanced.enable_websocket.label": "WebSocket aktivieren",
|
|
474
474
|
"advanced.enable_websocket.help": "WebSocket-Zustandsüberwachung. Das Deaktivieren fällt auf Polling zurück und beeinträchtigt viele Tools.",
|
|
475
|
+
"advanced.custom_instructions.label": "Eigene Server-Anweisungen",
|
|
476
|
+
"advanced.custom_instructions.help": "Text, den jeder verbundene KI-Assistent als Teil der MCP-Server-Anweisungen erhält – zum Beispiel, wo Notizen zum Haushalt liegen und wann sie gelesen oder aktualisiert werden sollen. Auch Teil des Prompts von Home-Assistant-Sprachassistenten (Assist), die dieses Toolset nutzen. Gedacht für Hinweise, die alle deine Clients auf einmal erreichen sollen; halte ihn kurz und ohne Geheimnisse. Leer lassen, um nichts hinzuzufügen. Erfordert einen Neustart; Clients sehen die Änderung nach dem erneuten Verbinden.",
|
|
475
477
|
"advanced.enabled_tool_modules.label": "Aktivierte Tool-Module",
|
|
476
478
|
"advanced.enabled_tool_modules.help": "Kommagetrennte Modulnamen oder 'all'.",
|
|
477
479
|
"advanced.enable_dashboard_partial_tools.label": "Dashboard-Partial-Update-Tools",
|
{ha_mcp_dev-8.7.0.dev3045 → ha_mcp_dev-8.7.0.dev3050}/src/ha_mcp/settings_ui/locales/en.json
RENAMED
|
@@ -472,6 +472,8 @@
|
|
|
472
472
|
"advanced.dashboard_screenshot_engine_url.help": "Base URL of the screenshot engine. Leave blank for Supervisor auto-discovery. Applies immediately.",
|
|
473
473
|
"advanced.enable_websocket.label": "Enable WebSocket",
|
|
474
474
|
"advanced.enable_websocket.help": "WebSocket state monitoring. Disabling falls back to polling and degrades many tools.",
|
|
475
|
+
"advanced.custom_instructions.label": "Custom server instructions",
|
|
476
|
+
"advanced.custom_instructions.help": "Text sent to every AI assistant that connects, as part of the MCP server instructions — for example where household notes are kept and when to read or update them. Also part of the prompt of Home Assistant conversation agents (Assist) that use this toolset. Use it for guidance that should reach all your clients at once; keep it short and free of secrets. Leave empty to add nothing. Requires restart; clients see the change when they reconnect.",
|
|
475
477
|
"advanced.enabled_tool_modules.label": "Enabled tool modules",
|
|
476
478
|
"advanced.enabled_tool_modules.help": "Comma-separated module names, or 'all'.",
|
|
477
479
|
"advanced.enable_dashboard_partial_tools.label": "Dashboard partial-update tools",
|
|
@@ -136,6 +136,8 @@ function renderAdvancedSection(containerId, fields) {
|
|
|
136
136
|
(f.max !== undefined ? `max="${f.max}" ` : '') +
|
|
137
137
|
(f.type === 'float' ? 'step="0.1" ' : '') +
|
|
138
138
|
(f.editable ? '' : 'disabled') + '>';
|
|
139
|
+
} else if (f.multiline) {
|
|
140
|
+
controlHtml = `<textarea rows="4" name="adv:${escapeHtml(f.field)}" data-adv-field="${escapeHtml(f.field)}" aria-labelledby="label-adv-${escapeHtml(f.field)}" ${f.editable ? '' : 'disabled'}>${escapeHtml(String(f.value ?? ''))}</textarea>`;
|
|
139
141
|
} else {
|
|
140
142
|
// str
|
|
141
143
|
controlHtml = `<input type="text" name="adv:${escapeHtml(f.field)}" data-adv-field="${escapeHtml(f.field)}" aria-labelledby="label-adv-${escapeHtml(f.field)}" value="${escapeHtml(String(f.value ?? ''))}" ${f.editable ? '' : 'disabled'}>`;
|
|
@@ -40,6 +40,12 @@ def collect_config_toggles(settings: Settings) -> dict[str, Any]:
|
|
|
40
40
|
[item for item in raw.split(",") if item.strip()]
|
|
41
41
|
)
|
|
42
42
|
|
|
43
|
+
# Presence only: the text is the owner's and may be personal.
|
|
44
|
+
custom = getattr(settings, "custom_instructions", "")
|
|
45
|
+
toggles["custom_instructions_set"] = bool(
|
|
46
|
+
isinstance(custom, str) and custom.strip()
|
|
47
|
+
)
|
|
48
|
+
|
|
43
49
|
toggles.update(_tool_config_diagnostics(settings))
|
|
44
50
|
return toggles
|
|
45
51
|
|
|
@@ -164,7 +164,8 @@ def _apply_policy_guard_row_locks(fname: str, row: dict[str, Any]) -> None:
|
|
|
164
164
|
see ``editable: true`` on rows whose set/reset the guards refuse:
|
|
165
165
|
``enable_tool_security_policies`` while access is off, and
|
|
166
166
|
``dev_tools_security_policy_access`` plus
|
|
167
|
-
``enable_security_policy_tool``
|
|
167
|
+
``enable_security_policy_tool`` and ``custom_instructions`` always
|
|
168
|
+
(web UI / env var only).
|
|
168
169
|
A row that is ALREADY non-editable (env-pinned) keeps its plain env
|
|
169
170
|
story: the pin refuses the write before these guards would, and
|
|
170
171
|
stamping a policy reason there would misdirect the fix toward the
|
|
@@ -181,7 +182,7 @@ def _apply_policy_guard_row_locks(fname: str, row: dict[str, Any]) -> None:
|
|
|
181
182
|
row["editable"] = False
|
|
182
183
|
row["locked_reason"] = "web_ui_or_env_only"
|
|
183
184
|
row["value"] = _security_policy_access_enabled()
|
|
184
|
-
elif fname
|
|
185
|
+
elif fname in _HUMAN_ONLY_SETTINGS:
|
|
185
186
|
if row["editable"]:
|
|
186
187
|
row["editable"] = False
|
|
187
188
|
row["locked_reason"] = "web_ui_or_env_only"
|
|
@@ -215,48 +216,46 @@ def _require_security_policy_access(operation: str) -> None:
|
|
|
215
216
|
)
|
|
216
217
|
|
|
217
218
|
|
|
219
|
+
# Settings dev tools may never write, in either direction, with the refusal
|
|
220
|
+
# message and where a human changes them instead.
|
|
221
|
+
_HUMAN_ONLY_SETTINGS: dict[str, tuple[str, str]] = {
|
|
222
|
+
"enable_security_policy_tool": (
|
|
223
|
+
"it registers ha_manage_security_policy, which can rewrite the tool "
|
|
224
|
+
"security policies gating the agent.",
|
|
225
|
+
"Change it in the web settings UI (Tool Security Policies tab) or via "
|
|
226
|
+
"the ENABLE_SECURITY_POLICY_TOOL env var.",
|
|
227
|
+
),
|
|
228
|
+
"dev_tools_security_policy_access": (
|
|
229
|
+
"it is the toggle governing their own access to tool security policies.",
|
|
230
|
+
"Change it in the web settings UI (Server Settings tab, Developer "
|
|
231
|
+
"section) or via the HAMCP_DEV_SECURITY_POLICY_ACCESS env var.",
|
|
232
|
+
),
|
|
233
|
+
"custom_instructions": (
|
|
234
|
+
"its text is sent to every connected agent as server instructions.",
|
|
235
|
+
"Change it in the web settings UI (Server Settings tab, Advanced) or "
|
|
236
|
+
"via the HAMCP_CUSTOM_INSTRUCTIONS env var.",
|
|
237
|
+
),
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
|
|
218
241
|
def _guard_security_policy_setting(setting: str) -> None:
|
|
219
242
|
"""Gate set/reset of the settings that define the dev tools' leash.
|
|
220
243
|
|
|
221
|
-
``
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
Policies tab (issue #2148) — a dev-tools write would reach the same
|
|
228
|
-
end state as unbuckling the leash, one restart later.
|
|
229
|
-
``enable_tool_security_policies`` is the whole gating engine's master
|
|
230
|
-
switch, so writing it needs access.
|
|
244
|
+
``_HUMAN_ONLY_SETTINGS`` are refused even with access ON: the agent may
|
|
245
|
+
neither grant nor revoke its own policy access, nor register
|
|
246
|
+
ha_manage_security_policy (#2148; the same end state as unbuckling the
|
|
247
|
+
leash, one restart later), nor rewrite the text steering every agent.
|
|
248
|
+
``enable_tool_security_policies`` is the gating engine's master switch,
|
|
249
|
+
so writing it needs access.
|
|
231
250
|
"""
|
|
232
|
-
if setting
|
|
233
|
-
|
|
234
|
-
create_error_response(
|
|
235
|
-
ErrorCode.AUTH_INSUFFICIENT_PERMISSIONS,
|
|
236
|
-
"'enable_security_policy_tool' cannot be changed by dev "
|
|
237
|
-
"tools: it registers ha_manage_security_policy, which can "
|
|
238
|
-
"rewrite the tool security policies gating the agent.",
|
|
239
|
-
context={"setting": setting},
|
|
240
|
-
suggestions=[
|
|
241
|
-
"Change it in the web settings UI (Tool Security "
|
|
242
|
-
"Policies tab) or via the ENABLE_SECURITY_POLICY_TOOL "
|
|
243
|
-
"env var.",
|
|
244
|
-
],
|
|
245
|
-
)
|
|
246
|
-
)
|
|
247
|
-
if setting == "dev_tools_security_policy_access":
|
|
251
|
+
if setting in _HUMAN_ONLY_SETTINGS:
|
|
252
|
+
reason, where = _HUMAN_ONLY_SETTINGS[setting]
|
|
248
253
|
raise_tool_error(
|
|
249
254
|
create_error_response(
|
|
250
255
|
ErrorCode.AUTH_INSUFFICIENT_PERMISSIONS,
|
|
251
|
-
"'
|
|
252
|
-
"tools: it is the toggle governing their own access to tool "
|
|
253
|
-
"security policies.",
|
|
256
|
+
f"'{setting}' cannot be changed by dev tools: {reason}",
|
|
254
257
|
context={"setting": setting},
|
|
255
|
-
suggestions=[
|
|
256
|
-
"Change it in the web settings UI (Server Settings tab, "
|
|
257
|
-
"Developer section) or via the "
|
|
258
|
-
"HAMCP_DEV_SECURITY_POLICY_ACCESS env var.",
|
|
259
|
-
],
|
|
258
|
+
suggestions=[where],
|
|
260
259
|
)
|
|
261
260
|
)
|
|
262
261
|
if setting == "enable_tool_security_policies":
|