ha-mcp-dev 8.7.0.dev3080__tar.gz → 9.0.0.dev3096__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.dev3080 → ha_mcp_dev-9.0.0.dev3096}/PKG-INFO +10 -9
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/README.md +7 -6
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/pyproject.toml +10 -5
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/pyproject.toml.orig +13 -5
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/browser_landing.py +2 -2
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/config.py +1 -1
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/errors.py +16 -2
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/hacs_auto_refresh.py +5 -9
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/policy/events.py +2 -2
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/server_lifespan.py +2 -2
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/__init__.py +59 -53
- ha_mcp_dev-9.0.0.dev3096/src/ha_mcp/settings_ui/_handlers_oauth_callbacks.py +198 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/locales/en.json +12 -1
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/settings.css +14 -7
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/settings.html +8 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/settings_js/05_feature_flags.js +1 -1
- ha_mcp_dev-9.0.0.dev3096/src/ha_mcp/settings_ui/settings_js/10_oauth_callbacks.js +154 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/stdio_settings_sidecar.py +11 -189
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/bug_report_templates.py +7 -5
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/registry.py +4 -3
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_dev.py +32 -66
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/update_check.py +3 -5
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/LICENSE +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_rich_compat.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/LICENSE +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/REQUIRES.txt +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/VENDORED +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/_compat.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/_install_hints.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/_warnings.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/apps/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/apps/app.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/apps/approval.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/apps/choice.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/apps/config.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/apps/file_upload.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/apps/form.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/apps/generative.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/cli/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/cli/__main__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev_security.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/cli/auth.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/cli/cimd.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/cli/cli.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/cli/client.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/cli/deploy/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/cli/deploy/authentication.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/cli/deploy/command.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/cli/deploy/configuration.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/cli/deploy/credentials.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/cli/deploy/horizon_client.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/cli/deploy/output.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/cli/deploy/state.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/cli/discovery.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/cli/generate.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/cli/install/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_code.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_desktop.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/cli/install/cursor.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/cli/install/gemini_cli.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/cli/install/goose.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/cli/install/mcp_json.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/cli/install/shared.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/cli/install/stdio.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/cli/run.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/client/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/client/_sdk_context_shim.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/client/auth/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/client/auth/bearer.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/client/auth/client_credentials.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/client/auth/oauth.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/client/caching.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/client/client.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/client/dependencies.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/client/elicitation.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/client/extension_hooks.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/client/group.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/client/logging.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/client/messages.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/client/mixins/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/client/mixins/prompts.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/client/mixins/resources.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/client/mixins/tools.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/client/oauth_callback.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/client/progress.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/client/roots.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/client/sampling/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/anthropic.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/google_genai.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/openai.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/client/telemetry.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/client/transports/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/client/transports/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/client/transports/config.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/client/transports/http.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/client/transports/inference.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/client/transports/memory.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/client/transports/sse.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/client/transports/stdio.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/contrib/README.md +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/README.md +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/bulk_tool_caller.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/example.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/README.md +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/component_manager.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/example.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/README.md +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/example.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/mcp_mixin.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/decorators.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/dependencies.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/exceptions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/experimental/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/code_mode.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/jev_search.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/mcp_config.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/prompts/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/prompts/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/prompts/function_prompt.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/py.typed +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/resources/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/resources/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/resources/function_resource.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/resources/security.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/resources/template.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/resources/types.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/auth.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/cimd.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/authorize.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/identity_assertion.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/jwt_issuer.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/middleware.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/consent.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/models.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/proxy.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/ui.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/upstream.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/oidc_proxy.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/auth0.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/aws.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/azure.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/clerk.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/debug.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/descope.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/discord.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/github.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/google.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/huggingface.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/in_memory.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/introspection.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/jwt.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/keycloak.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/oci.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/propelauth.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/scalekit.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/supabase.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/workos.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/redirect_validation.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/auth/ssrf.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/caching.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/completions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/context.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/dependencies.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/elicitation.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/event_store.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/extensions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/http.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/lifespan.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/low_level.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/middleware/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/middleware/authorization.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/middleware/caching.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/middleware/dereference.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/middleware/error_handling.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/middleware/logging.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/middleware/middleware.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/middleware/ping.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/middleware/rate_limiting.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/middleware/response_limiting.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/middleware/timing.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/middleware/tool_injection.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/mixins/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/mixins/extensions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/mixins/lifespan.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/mixins/mcp_operations.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/mixins/transport.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/providers/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/providers/addressing.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/providers/aggregate.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/providers/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/providers/fastmcp_provider.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem_discovery.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/prompts.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/resources.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/tools.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/local_provider.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/README.md +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/components.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/provider.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/routing.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_payload.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_synthesis.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/providers/proxy.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/_common.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/claude_provider.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/directory_provider.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/skill_provider.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/vendor_providers.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/providers/wrapped_provider.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/server.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/session_scoped_event_store.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/sessions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/telemetry.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/transforms/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/transforms/catalog.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/transforms/namespace.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/transforms/prompts_as_tools.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/transforms/resources_as_tools.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/bm25.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/regex.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/transforms/tool_transform.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/transforms/version_filter.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/server/transforms/visibility.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/settings.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/telemetry.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/tools/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/tools/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/tools/function_parsing.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/tools/function_tool.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/tools/tool_transform.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/types.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/asgi_transport.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/async_utils.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/auth.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/authorization.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/cli.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/components.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/docstring_parsing.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/exceptions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/http.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/inspect.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema_type.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/lifespan.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/logging.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/uv.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/mcp_server_config.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/schema.json +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/filesystem.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/mime.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/README.md +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/director.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/formatters.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/json_schema_converter.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/models.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/parser.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/schemas.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/pagination.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/prefab.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/skills.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/tasks.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/tests.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/timeout.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/token_cache.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/types.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/ui.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/version_check.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/fastmcp/utilities/versions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/LICENSE +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/REQUIRES.txt +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/VENDORED +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/cli/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/cli/claude.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/cli/cli.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/client/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/client/__main__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/client/_input_required.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/client/_memory.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/client/_probe.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/client/_transport.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/client/auth/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/client/auth/exceptions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/client/auth/extensions/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/client/auth/extensions/client_credentials.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/client/auth/extensions/identity_assertion.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/client/auth/oauth2.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/client/auth/utils.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/client/caching.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/client/client.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/client/context.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/client/extension.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/client/session.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/client/session_group.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/client/sse.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/client/stdio.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/client/streamable_http.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/client/subscriptions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/os/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/os/posix/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/os/posix/utilities.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/os/win32/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/os/win32/utilities.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/py.typed +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/__main__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/_otel.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/_streamable_http_modern.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/apps.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/auth/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/auth/errors.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/auth/handlers/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/auth/handlers/authorize.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/auth/handlers/metadata.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/auth/handlers/register.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/auth/handlers/revoke.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/auth/handlers/token.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/auth/json_response.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/auth/middleware/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/auth/middleware/auth_context.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/auth/middleware/bearer_auth.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/auth/middleware/client_auth.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/auth/provider.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/auth/routes.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/auth/settings.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/caching.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/connection.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/context.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/elicitation.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/extension.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/fastmcp.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/lowlevel/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/lowlevel/helper_types.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/lowlevel/server.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/mcpserver/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/mcpserver/context.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/mcpserver/exceptions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/manager.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/mcpserver/resolve.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/resource_manager.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/templates.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/types.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/mcpserver/server.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/tool_manager.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/context_injection.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/func_metadata.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/logging.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/types.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/models.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/request_state.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/runner.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/session.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/sse.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/stdio.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/streamable_http.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/streamable_http_manager.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/subscriptions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/transport_security.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/server/validation.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/shared/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/shared/_callable_inspection.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/shared/_compat.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/shared/_context_streams.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/shared/_httpx_utils.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/shared/_otel.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/shared/_request_clock.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/shared/_stream_protocols.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/shared/auth.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/shared/auth_utils.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/shared/context.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/shared/direct_dispatcher.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/shared/dispatcher.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/shared/exceptions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/shared/extension.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/shared/inbound.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/shared/jsonrpc_dispatcher.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/shared/memory.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/shared/message.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/shared/metadata_utils.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/shared/path_security.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/shared/peer.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/shared/subscriptions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/shared/tool_name_validation.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/shared/transport_context.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/shared/uri_template.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/types/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/types/jsonrpc.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/types/methods.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp/types/version.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp_types/LICENSE +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp_types/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp_types/REQUIRES.txt +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp_types/VENDORED +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp_types/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp_types/_types.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp_types/_v2025_11_25/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp_types/_v2026_07_28/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp_types/_wire_base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp_types/jsonrpc.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp_types/methods.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp_types/py.typed +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/mcp_types/version.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/requirements.txt +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/client.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/server.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_vendor/websockets/version.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/app_discovery.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/auth/oidc_compat.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/backup_dashboards.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/backup_diff.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/backup_entity_ids.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/backup_helper_target.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/backup_integrations.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/backup_manager.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/backup_tags.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/backup_zones.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/client/admin_routes.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/client/rest_client.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/config_backup.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/config_meta.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/config_overrides.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/config_registry.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/config_settings.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/ha_request_queue.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/http_transport.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/image_info.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/llm_exposure.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/log_filters.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/policy/decision_pin.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/policy/decisions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/policy/editing.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/policy/mrtr.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/policy/server_channels.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/read_only.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/redaction.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/renamed_tools.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-actions.md +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/triggers-and-conditions.md +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/server.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/server_instructions.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/server_tool_text.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/_i18n.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/_persistence.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/_theme.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/locales/README.md +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/locales/az.json +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/locales/de.json +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/locales/es.json +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/locales/it.json +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/locales/zh-Hant.json +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/settings_js/01_i18n_state.js +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/settings_js/02_tools_restart.js +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/settings_js/03_render_save.js +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/settings_js/04_backups.js +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/settings_js/06_policy_cards.js +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/settings_js/07_policy_actions.js +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/settings_js/08_advanced.js +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/settings_ui/settings_js/09_prefs_visibility.js +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/strict_bps.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tool_dispatch.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/area_messages.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/auto_backup.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/backup_access.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/backup_on_demand.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/best_practice_result.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/best_practice_variables.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/blueprint_sources.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/blueprint_write.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/bug_report_config.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/bulk_selector.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/coercion.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/component_api.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/component_config_entries.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/component_config_reads.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/component_dashboard_edit.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/component_devices.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/component_helper_collections.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/component_registries.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/config_entry_backup.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/config_entry_flow.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/config_entry_flow_introspect.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/config_entry_identity.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/config_helpers/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/config_helpers/core_payload.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/config_helpers/create.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/config_helpers/describe.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/config_helpers/flow.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/config_helpers/icon_route.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/config_helpers/listing.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/config_helpers/registry.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/config_helpers/schemas.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/config_helpers/typed_config.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/config_helpers/update.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/config_helpers/validation.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/config_subentry_restore.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/config_write_errors.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/config_write_helpers.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/core_contract.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/dashboard_card_describe.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/dashboard_edit_errors.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/dashboard_list_checks.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/dev_backup.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/device_enrichment.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/diagnostics_helpers.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/energy_preferences.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/entity_param_parsing.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/entity_registration.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/entity_removal.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/entity_update_fields.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/error_log_parsing.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/flow_helper_lookup.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/hacs_registration.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/helper_flows.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/history_response.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/integration_entry_state.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/log_common.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/log_sources.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/log_sources_fault.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/radio/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/radio/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/radio/matter.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/radio/thread.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/radio/zigbee.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/radio/zwave.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/radio/zwave_parameters.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/recorder_errors.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/response_helpers.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/scene_discovery.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/search/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/search/base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/search/component.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/search/entities.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/search/legacy.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/search/modes.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/search/overview.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/search/response.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/search/state.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/statistics_calendar.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/statistics_helpers.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/statistics_resets.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/system_restart.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tool_hints.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_config_automations.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_integrations.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_logs.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_radio.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_security_policy.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_themes.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/tools/ws_waiters.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/transforms/compact_params.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/transforms/component_helpers.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/transforms/component_search.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/transforms/write_tool_note.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/transport_security.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/utils/config_write_lock.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/utils/dashboard_patch.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/utils/entity_membership.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/utils/mcp_client_host.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/utils/registry_update_lock.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/visibility/__init__.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/visibility/enforcement.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/visibility/model.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/visibility/persistence.py +0 -0
- {ha_mcp_dev-8.7.0.dev3080 → ha_mcp_dev-9.0.0.dev3096}/src/ha_mcp/visibility/resolver.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ha-mcp-dev
|
|
3
|
-
Version:
|
|
3
|
+
Version: 9.0.0.dev3096
|
|
4
4
|
Summary: Home Assistant MCP Server - Complete control of Home Assistant through MCP
|
|
5
5
|
Keywords: mcp,home-assistant,ai,automation,smart-home
|
|
6
6
|
Author: Julien
|
|
@@ -46,8 +46,8 @@ Requires-Dist: uvicorn>=0.35 ; sys_platform != 'emscripten'
|
|
|
46
46
|
Requires-Dist: watchfiles>=1.0.0
|
|
47
47
|
Requires-Dist: httpx[socks]>=0.28.1,<0.29
|
|
48
48
|
Requires-Dist: pydantic[email]>=2.13.4,<3
|
|
49
|
-
Requires-Dist: python-dotenv
|
|
50
|
-
Requires-Dist: truststore
|
|
49
|
+
Requires-Dist: python-dotenv>=1.2.4,<2
|
|
50
|
+
Requires-Dist: truststore>=0.10.4,<0.11
|
|
51
51
|
Requires-Dist: cryptography>=48.0.0,<51
|
|
52
52
|
Requires-Dist: pydantic-monty==0.0.18
|
|
53
53
|
Requires-Dist: tzdata>=2024.1
|
|
@@ -94,7 +94,7 @@ Description-Content-Type: text/markdown
|
|
|
94
94
|
|
|
95
95
|
## 🚀 Get Started
|
|
96
96
|
|
|
97
|
-
The recommended way to run ha-mcp is the **HA-MCP Custom Component**. It installs into Home Assistant through HACS, runs the full server **in-process**, and works on **every** Home Assistant installation type — Home Assistant OS, Supervised, Container, and Core — with full feature parity. It is the easiest setup in every case
|
|
97
|
+
The recommended way to run ha-mcp is the **HA-MCP Custom Component**. It installs into Home Assistant through HACS, runs the full server **in-process**, and works on **every** Home Assistant installation type — Home Assistant OS, Supervised, Container, and Core — with full feature parity. It is the easiest setup in every case: setup asks for an administrator access token and how clients may connect.
|
|
98
98
|
|
|
99
99
|
**Add it to Home Assistant via HACS (the preferred install):**
|
|
100
100
|
|
|
@@ -104,16 +104,17 @@ The recommended way to run ha-mcp is the **HA-MCP Custom Component**. It install
|
|
|
104
104
|
|
|
105
105
|
1. Install the **HA-MCP Custom Component** from HACS — click the badge above, or in HACS open **Integrations → ⋮ → Custom repositories**, add `https://github.com/homeassistant-ai/ha-mcp-integration` (category: **Integration**), then **Download**.
|
|
106
106
|
2. **Restart Home Assistant.**
|
|
107
|
-
3.
|
|
108
|
-
4.
|
|
109
|
-
5.
|
|
107
|
+
3. Decide which administrator account the server acts as. Either create a long-lived access token on your own account (your profile → **Security** → **Long-lived access tokens** → **Create token**; it works from anywhere if it leaks, and the server's changes show under your name), or, safer, create an account just for HA-MCP under **Settings → People → Add person** with **Allow login**, **Local access only** and **Administrator** on. Never use your own login for the second option.
|
|
108
|
+
4. Go to **Settings → Devices & Services → Add Integration**, search for **HA-MCP Custom Component** and choose **HA-MCP Server**. Paste your token, or enter the user name and password of the account you made for HA-MCP (HA-MCP creates its token), pick how clients may connect — **Remote access through Home Assistant** (start with **Secret URL**, the simplest; **Home Assistant sign-in** adds a login) and/or **Network access: Local network** — then click **Submit**. Both start disabled, so a client on another device needs one of them.
|
|
109
|
+
5. Copy the connect URL from the entry's **Configure** screen (**Settings → Devices & Services → HA-MCP Custom Component → HA-MCP Server → Configure**). A notification confirms the server started and points you there.
|
|
110
|
+
6. Paste that URL into your AI client — done.
|
|
110
111
|
|
|
111
112
|
**Connect URL.** The Configure screen gives you a Home Assistant webhook URL for remote clients — `https://<your-ha-domain>/api/webhook/<webhook-id>` through Nabu Casa or any reverse proxy already pointed at Home Assistant (locally, `http://<ha-host>:8123/api/webhook/<webhook-id>`). For clients on the same network, the server is also reachable directly at `http://<ha-ip>:9584/private_<random>`.
|
|
112
113
|
|
|
113
114
|
- **Replaces other install methods:** the in-process server is a complete, standalone ha-mcp install — it takes the place of the app (add-on), Docker, and uvx/PyPI (stdio) methods. Run only one; do not run the in-process server alongside another install.
|
|
114
|
-
- **Local only?**
|
|
115
|
+
- **Local only?** Leave remote access disabled at setup (or turn off **Remote access via webhook** in the entry options) — no webhook is registered at all, while the direct port and sidebar panel keep working.
|
|
115
116
|
- **Settings panel:** while the server runs, an admin-only **HA-MCP** panel appears in the Home Assistant sidebar for managing tools, feature flags, backups, and themes.
|
|
116
|
-
- **Optional authentication:** set **
|
|
117
|
+
- **Optional authentication:** set **Authentication mode** to `ha_auth` to require a Home Assistant account sign-in instead of using the secret URL as the credential.
|
|
117
118
|
- **Manual install (no HACS):** copy `custom_components/ha_mcp_tools/` from this repository into your Home Assistant `config/custom_components/` directory, then restart and add the integration as above.
|
|
118
119
|
|
|
119
120
|
The component's second entry type, the **File & YAML services entry** (**HA-MCP File & YAML Tools**), is only needed if you enable ha-mcp's opt-in file and YAML editing tools (feature flags, off by default) — skip it otherwise; you can add it later at any time. It works with any server type (in-process, app, Docker, or stdio).
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
|
|
35
35
|
## 🚀 Get Started
|
|
36
36
|
|
|
37
|
-
The recommended way to run ha-mcp is the **HA-MCP Custom Component**. It installs into Home Assistant through HACS, runs the full server **in-process**, and works on **every** Home Assistant installation type — Home Assistant OS, Supervised, Container, and Core — with full feature parity. It is the easiest setup in every case
|
|
37
|
+
The recommended way to run ha-mcp is the **HA-MCP Custom Component**. It installs into Home Assistant through HACS, runs the full server **in-process**, and works on **every** Home Assistant installation type — Home Assistant OS, Supervised, Container, and Core — with full feature parity. It is the easiest setup in every case: setup asks for an administrator access token and how clients may connect.
|
|
38
38
|
|
|
39
39
|
**Add it to Home Assistant via HACS (the preferred install):**
|
|
40
40
|
|
|
@@ -44,16 +44,17 @@ The recommended way to run ha-mcp is the **HA-MCP Custom Component**. It install
|
|
|
44
44
|
|
|
45
45
|
1. Install the **HA-MCP Custom Component** from HACS — click the badge above, or in HACS open **Integrations → ⋮ → Custom repositories**, add `https://github.com/homeassistant-ai/ha-mcp-integration` (category: **Integration**), then **Download**.
|
|
46
46
|
2. **Restart Home Assistant.**
|
|
47
|
-
3.
|
|
48
|
-
4.
|
|
49
|
-
5.
|
|
47
|
+
3. Decide which administrator account the server acts as. Either create a long-lived access token on your own account (your profile → **Security** → **Long-lived access tokens** → **Create token**; it works from anywhere if it leaks, and the server's changes show under your name), or, safer, create an account just for HA-MCP under **Settings → People → Add person** with **Allow login**, **Local access only** and **Administrator** on. Never use your own login for the second option.
|
|
48
|
+
4. Go to **Settings → Devices & Services → Add Integration**, search for **HA-MCP Custom Component** and choose **HA-MCP Server**. Paste your token, or enter the user name and password of the account you made for HA-MCP (HA-MCP creates its token), pick how clients may connect — **Remote access through Home Assistant** (start with **Secret URL**, the simplest; **Home Assistant sign-in** adds a login) and/or **Network access: Local network** — then click **Submit**. Both start disabled, so a client on another device needs one of them.
|
|
49
|
+
5. Copy the connect URL from the entry's **Configure** screen (**Settings → Devices & Services → HA-MCP Custom Component → HA-MCP Server → Configure**). A notification confirms the server started and points you there.
|
|
50
|
+
6. Paste that URL into your AI client — done.
|
|
50
51
|
|
|
51
52
|
**Connect URL.** The Configure screen gives you a Home Assistant webhook URL for remote clients — `https://<your-ha-domain>/api/webhook/<webhook-id>` through Nabu Casa or any reverse proxy already pointed at Home Assistant (locally, `http://<ha-host>:8123/api/webhook/<webhook-id>`). For clients on the same network, the server is also reachable directly at `http://<ha-ip>:9584/private_<random>`.
|
|
52
53
|
|
|
53
54
|
- **Replaces other install methods:** the in-process server is a complete, standalone ha-mcp install — it takes the place of the app (add-on), Docker, and uvx/PyPI (stdio) methods. Run only one; do not run the in-process server alongside another install.
|
|
54
|
-
- **Local only?**
|
|
55
|
+
- **Local only?** Leave remote access disabled at setup (or turn off **Remote access via webhook** in the entry options) — no webhook is registered at all, while the direct port and sidebar panel keep working.
|
|
55
56
|
- **Settings panel:** while the server runs, an admin-only **HA-MCP** panel appears in the Home Assistant sidebar for managing tools, feature flags, backups, and themes.
|
|
56
|
-
- **Optional authentication:** set **
|
|
57
|
+
- **Optional authentication:** set **Authentication mode** to `ha_auth` to require a Home Assistant account sign-in instead of using the secret URL as the credential.
|
|
57
58
|
- **Manual install (no HACS):** copy `custom_components/ha_mcp_tools/` from this repository into your Home Assistant `config/custom_components/` directory, then restart and add the integration as above.
|
|
58
59
|
|
|
59
60
|
The component's second entry type, the **File & YAML services entry** (**HA-MCP File & YAML Tools**), is only needed if you enable ha-mcp's opt-in file and YAML editing tools (feature flags, off by default) — skip it otherwise; you can add it later at any time. It works with any server type (in-process, app, Docker, or stdio).
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
[build-system]
|
|
2
|
-
requires = ["uv_build>=0.12.17,<0.
|
|
2
|
+
requires = ["uv_build>=0.12.17,<0.14"]
|
|
3
3
|
build-backend = "uv_build"
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ha-mcp-dev"
|
|
7
|
-
version = "
|
|
7
|
+
version = "9.0.0.dev3096"
|
|
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"
|
|
@@ -59,8 +59,8 @@ dependencies = [
|
|
|
59
59
|
"watchfiles>=1.0.0",
|
|
60
60
|
"httpx[socks]>=0.28.1,<0.29",
|
|
61
61
|
"pydantic[email]>=2.13.4,<3",
|
|
62
|
-
"python-dotenv
|
|
63
|
-
"truststore
|
|
62
|
+
"python-dotenv>=1.2.4,<2",
|
|
63
|
+
"truststore>=0.10.4,<0.11",
|
|
64
64
|
"cryptography>=48.0.0,<51",
|
|
65
65
|
"pydantic-monty==0.0.18",
|
|
66
66
|
"tzdata>=2024.1",
|
|
@@ -273,6 +273,11 @@ filterwarnings = [
|
|
|
273
273
|
|
|
274
274
|
[tool.semantic_release]
|
|
275
275
|
version_toml = ["pyproject.toml:project.version"]
|
|
276
|
+
version_variables = [
|
|
277
|
+
"custom_components/ha_mcp_tools/manifest.json:version",
|
|
278
|
+
"custom_components/ha_mcp_tools/manifest.json:ha-mcp",
|
|
279
|
+
"custom_components/ha_mcp_tools/const.py:COMPONENT_VERSION",
|
|
280
|
+
]
|
|
276
281
|
build_command = """
|
|
277
282
|
pip install uv && uv lock
|
|
278
283
|
git add uv.lock
|
|
@@ -319,6 +324,6 @@ dev = [
|
|
|
319
324
|
"ruff>=0.12.12",
|
|
320
325
|
"testcontainers>=4.13.0",
|
|
321
326
|
"ast-grep-cli>=0.42.0",
|
|
322
|
-
"python-semantic-release==10.
|
|
327
|
+
"python-semantic-release==10.7.0",
|
|
323
328
|
"hamcp-test-env",
|
|
324
329
|
]
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
[build-system]
|
|
2
|
-
requires = ["uv_build>=0.12.17,<0.
|
|
2
|
+
requires = ["uv_build>=0.12.17,<0.14"]
|
|
3
3
|
build-backend = "uv_build"
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ha-mcp-dev"
|
|
7
|
-
version = "
|
|
7
|
+
version = "9.0.0.dev3096"
|
|
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
|
|
@@ -67,8 +67,8 @@ dependencies = [
|
|
|
67
67
|
# before raising these floors; standalone lock updates can move independently.
|
|
68
68
|
"httpx[socks]>=0.28.1,<0.29",
|
|
69
69
|
"pydantic[email]>=2.13.4,<3",
|
|
70
|
-
"python-dotenv
|
|
71
|
-
"truststore
|
|
70
|
+
"python-dotenv>=1.2.4,<2",
|
|
71
|
+
"truststore>=0.10.4,<0.11",
|
|
72
72
|
# websockets is deliberately ABSENT from this list: ha-mcp ships its own
|
|
73
73
|
# private copy (src/ha_mcp/_vendor/websockets, pinned in the vendor
|
|
74
74
|
# requirements.txt and synced by scripts/vendor_websockets.py) and never
|
|
@@ -420,7 +420,7 @@ dev = [
|
|
|
420
420
|
# Renders templates/CHANGELOG.md.j2 in test_changelog_template.py. Keep the
|
|
421
421
|
# version equal to the action pinned in .github/workflows/semver-release.yml,
|
|
422
422
|
# so the test renders with the release that writes the real notes.
|
|
423
|
-
"python-semantic-release==10.
|
|
423
|
+
"python-semantic-release==10.7.0",
|
|
424
424
|
# Provides `uv run hamcp-test-env` without shipping it in the ha-mcp wheel.
|
|
425
425
|
"hamcp-test-env",
|
|
426
426
|
]
|
|
@@ -431,6 +431,14 @@ hamcp-test-env = { path = "tests/test-env", editable = true }
|
|
|
431
431
|
# Semantic versioning configuration
|
|
432
432
|
[tool.semantic_release]
|
|
433
433
|
version_toml = ["pyproject.toml:project.version"]
|
|
434
|
+
# The HACS component shares the server's version and pins the server build it
|
|
435
|
+
# ships with, so each release commit stamps all three below as well as
|
|
436
|
+
# project.version (#2427).
|
|
437
|
+
version_variables = [
|
|
438
|
+
"custom_components/ha_mcp_tools/manifest.json:version",
|
|
439
|
+
"custom_components/ha_mcp_tools/manifest.json:ha-mcp",
|
|
440
|
+
"custom_components/ha_mcp_tools/const.py:COMPONENT_VERSION",
|
|
441
|
+
]
|
|
434
442
|
build_command = """
|
|
435
443
|
pip install uv && uv lock
|
|
436
444
|
git add uv.lock
|
|
@@ -125,8 +125,8 @@ def register_browser_landing(mcp_instance: CustomRouteServer, path: str) -> bool
|
|
|
125
125
|
# Any GET here is a non-MCP caller (browser, health check, proxy, or a
|
|
126
126
|
# connector's SSE-style pre-flight) hitting this POST-only Streamable HTTP
|
|
127
127
|
# endpoint, which answers 405 by design. Log one annotated line so the 405
|
|
128
|
-
# reads as expected.
|
|
129
|
-
logger.info("GET
|
|
128
|
+
# reads as expected. The path is left out: it is the secret path.
|
|
129
|
+
logger.info("GET -> 405 (NORMAL for most non-SSE connections)")
|
|
130
130
|
return PlainTextResponse(
|
|
131
131
|
LANDING_MESSAGE,
|
|
132
132
|
status_code=405,
|
|
@@ -104,7 +104,7 @@ _settings: Settings | None = None
|
|
|
104
104
|
|
|
105
105
|
# In-process (embedded) HA connection, set only when ha-mcp runs inside Home
|
|
106
106
|
# Assistant core via the ha_mcp_tools custom component's in-process server entry.
|
|
107
|
-
# The component hands the loopback URL +
|
|
107
|
+
# The component hands the loopback URL + the administrator's token to ha-mcp
|
|
108
108
|
# THROUGH THIS DICT — never
|
|
109
109
|
# via os.environ — so the admin token can't be read from the shared HA process
|
|
110
110
|
# environment. Applied onto the Settings singleton in ``get_global_settings``.
|
|
@@ -347,6 +347,18 @@ def create_connection_error(
|
|
|
347
347
|
)
|
|
348
348
|
|
|
349
349
|
|
|
350
|
+
# The in-process server (HA-MCP integration) runs with an administrator token
|
|
351
|
+
# saved in its config entry (#2427), not a HOMEASSISTANT_TOKEN.
|
|
352
|
+
_EMBEDDED_AUTH_INVALID_SUGGESTIONS: list[str] = [
|
|
353
|
+
"Home Assistant no longer accepts the administrator access token saved in "
|
|
354
|
+
+ "the HA-MCP Server entry: it was revoked, or its account was deactivated "
|
|
355
|
+
+ "or is no longer an administrator",
|
|
356
|
+
"Replace it under Settings -> Devices & services -> HA-MCP Server -> "
|
|
357
|
+
+ "Configure -> Replace the administrator access token",
|
|
358
|
+
"Or reload the HA-MCP Server entry: it then stops the server and files a "
|
|
359
|
+
+ "repair that asks for a new token",
|
|
360
|
+
]
|
|
361
|
+
|
|
350
362
|
# Authentication-error suggestions for Home Assistant add-on installs. On the
|
|
351
363
|
# add-on the token is managed by the Supervisor, not a user-editable
|
|
352
364
|
# HOMEASSISTANT_TOKEN, so the default "verify your token / create a long-lived
|
|
@@ -388,9 +400,11 @@ def create_auth_error(
|
|
|
388
400
|
# Lazy import keeps this low-level module free of an import-time
|
|
389
401
|
# dependency on ._version; is_running_in_addon reads SUPERVISOR_TOKEN
|
|
390
402
|
# live so it reflects the current environment.
|
|
391
|
-
from ._version import is_running_in_addon
|
|
403
|
+
from ._version import is_embedded, is_running_in_addon
|
|
392
404
|
|
|
393
|
-
if
|
|
405
|
+
if is_embedded():
|
|
406
|
+
suggestions = _EMBEDDED_AUTH_INVALID_SUGGESTIONS
|
|
407
|
+
elif is_running_in_addon():
|
|
394
408
|
suggestions = _ADDON_AUTH_INVALID_SUGGESTIONS
|
|
395
409
|
|
|
396
410
|
return create_error_response(
|
|
@@ -3,10 +3,9 @@
|
|
|
3
3
|
HACS refreshes a *custom* repository's release data from GitHub only about
|
|
4
4
|
every 48 hours, and the ha_mcp_tools component ships in lockstep with each
|
|
5
5
|
server release — so a freshly updated server can sit for two days next to a
|
|
6
|
-
component update HACS has not noticed yet.
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
had no trigger at all. This module is that trigger, server-side.
|
|
6
|
+
component update HACS has not noticed yet. This module closes that gap for
|
|
7
|
+
add-on, Docker, pip and stdio installs. The embedded server is skipped: the
|
|
8
|
+
component manages its updates.
|
|
10
9
|
|
|
11
10
|
On startup, when the server version changed since the last recorded nudge (the
|
|
12
11
|
just-updated case) or a newer release is pending, it sends HACS's "Update
|
|
@@ -44,9 +43,7 @@ from .utils.data_paths import get_data_dir
|
|
|
44
43
|
logger = logging.getLogger(__name__)
|
|
45
44
|
|
|
46
45
|
# The repository full_names HACS may track the ha_mcp_tools component under —
|
|
47
|
-
# the dedicated mirror first, the legacy main-repo path second.
|
|
48
|
-
# duplicated from custom_components/ha_mcp_tools/const.py (HACS_MIRROR_ /
|
|
49
|
-
# HACS_LEGACY_REPO_FULL_NAME): the server package cannot import the component.
|
|
46
|
+
# the dedicated mirror first, the legacy main-repo path second.
|
|
50
47
|
CANDIDATE_REPO_FULL_NAMES = (
|
|
51
48
|
"homeassistant-ai/ha-mcp-integration",
|
|
52
49
|
"homeassistant-ai/ha-mcp",
|
|
@@ -205,8 +202,7 @@ async def maybe_refresh_hacs_after_update() -> None:
|
|
|
205
202
|
"""Nudge HACS once per startup when the update picture changed."""
|
|
206
203
|
try:
|
|
207
204
|
if is_embedded():
|
|
208
|
-
# The component
|
|
209
|
-
# running both would double HACS's GitHub fetches.
|
|
205
|
+
# The component manages the embedded server's updates.
|
|
210
206
|
return
|
|
211
207
|
if is_update_check_disabled():
|
|
212
208
|
return
|
|
@@ -218,8 +218,8 @@ async def emit_approval_requested(
|
|
|
218
218
|
approval signal needs the silence explained.
|
|
219
219
|
|
|
220
220
|
``POST /api/events/<type>`` works identically for every installation
|
|
221
|
-
method — the embedded component
|
|
222
|
-
|
|
221
|
+
method — the embedded component hands the server a loopback URL and an
|
|
222
|
+
administrator's token, so there is no component-only path here.
|
|
223
223
|
"""
|
|
224
224
|
try:
|
|
225
225
|
with anyio.move_on_after(EMIT_TIMEOUT_SECONDS) as scope:
|
|
@@ -18,8 +18,8 @@ logger = logging.getLogger(__name__)
|
|
|
18
18
|
async def warn_if_non_admin_token() -> None:
|
|
19
19
|
"""Ask Home Assistant about the configured token so a non-admin one is logged at startup (#2546)."""
|
|
20
20
|
try:
|
|
21
|
-
# The embedded
|
|
22
|
-
# no server-level token
|
|
21
|
+
# The embedded component checks its token belongs to an active
|
|
22
|
+
# administrator on every start; OAuth mode has no server-level token.
|
|
23
23
|
settings = get_global_settings()
|
|
24
24
|
if is_embedded() or settings.homeassistant_token == OAUTH_MODE_TOKEN:
|
|
25
25
|
return
|
|
@@ -26,6 +26,7 @@ from ..utils.data_paths import get_data_dir
|
|
|
26
26
|
from ._handlers_advanced import build_advanced_handlers
|
|
27
27
|
from ._handlers_backups import build_backups_handlers
|
|
28
28
|
from ._handlers_fs import build_fs_handlers
|
|
29
|
+
from ._handlers_oauth_callbacks import build_oauth_callback_handlers
|
|
29
30
|
from ._handlers_server import (
|
|
30
31
|
_PROCESS_INSTANCE_ID,
|
|
31
32
|
_PROCESS_STARTED_AT,
|
|
@@ -493,6 +494,7 @@ def build_settings_handlers(
|
|
|
493
494
|
handlers.update(build_backups_handlers(server))
|
|
494
495
|
handlers.update(build_server_handlers(server, is_sidecar=is_sidecar))
|
|
495
496
|
handlers.update(build_advanced_handlers(server))
|
|
497
|
+
handlers.update(build_oauth_callback_handlers(server))
|
|
496
498
|
|
|
497
499
|
return handlers
|
|
498
500
|
|
|
@@ -592,6 +594,62 @@ def is_http_settings_mounted() -> bool:
|
|
|
592
594
|
return _http_settings_mounted
|
|
593
595
|
|
|
594
596
|
|
|
597
|
+
# Every settings route except the add-on-only root mount is defined once in
|
|
598
|
+
# this table. register_settings_routes mounts it under each active prefix: at
|
|
599
|
+
# root in add-on mode (so HA ingress can proxy localhost:9583/), and under the
|
|
600
|
+
# secret path when one is set (Docker / standalone direct access); the stdio
|
|
601
|
+
# sidecar mounts it too. Deriving every mount from one table keeps them from
|
|
602
|
+
# drifting; the frontend uses relative fetches (./api/settings/...) so the
|
|
603
|
+
# handlers work at any prefix.
|
|
604
|
+
SETTINGS_ROUTES: tuple[tuple[str, list[str], str], ...] = (
|
|
605
|
+
("/settings", ["GET"], "settings_page"),
|
|
606
|
+
("/api/settings/tools", ["GET"], "get_tools"),
|
|
607
|
+
("/api/settings/tools", ["POST"], "save_tools"),
|
|
608
|
+
("/api/settings/restart", ["POST"], "restart_addon"),
|
|
609
|
+
("/api/settings/info", ["GET"], "settings_info"),
|
|
610
|
+
("/api/settings/features", ["GET"], "get_feature_flags"),
|
|
611
|
+
("/api/settings/features", ["POST"], "save_feature_flags"),
|
|
612
|
+
# Theme / accessibility prefs (#1574 review) — server-side copy so
|
|
613
|
+
# they survive a stdio sidecar origin change (stable by default
|
|
614
|
+
# since #2131, but fresh on first spawn / lost ui.state / pin
|
|
615
|
+
# change / taken remembered port)
|
|
616
|
+
("/api/settings/theme", ["GET"], "get_theme_prefs"),
|
|
617
|
+
("/api/settings/theme", ["POST"], "save_theme_prefs"),
|
|
618
|
+
# Advanced settings endpoints
|
|
619
|
+
("/api/settings/advanced", ["GET"], "get_advanced_settings"),
|
|
620
|
+
("/api/settings/advanced", ["POST"], "save_advanced_settings"),
|
|
621
|
+
# Auto-backup endpoints (#1288)
|
|
622
|
+
("/api/settings/backups", ["GET"], "list_backups"),
|
|
623
|
+
("/api/settings/backups", ["DELETE"], "delete_backups_bulk"),
|
|
624
|
+
("/api/settings/backups/{name}", ["GET"], "view_backup"),
|
|
625
|
+
("/api/settings/backups/{name}/diff", ["GET"], "diff_backup"),
|
|
626
|
+
("/api/settings/backups/{name}/restore", ["POST"], "restore_backup"),
|
|
627
|
+
("/api/settings/backups/{name}", ["DELETE"], "delete_backup"),
|
|
628
|
+
("/api/settings/backup-config", ["GET"], "get_backup_config"),
|
|
629
|
+
("/api/settings/backup-config", ["POST"], "save_backup_config"),
|
|
630
|
+
# Custom filesystem directories (issue #1567) — component-owned list
|
|
631
|
+
("/api/settings/fs-custom-paths", ["GET"], "get_fs_custom_paths"),
|
|
632
|
+
("/api/settings/fs-custom-paths", ["POST"], "save_fs_custom_paths"),
|
|
633
|
+
# None-mode OAuth callback allowlist (#2427) — component-owned list
|
|
634
|
+
("/api/settings/oauth-callbacks", ["GET"], "get_oauth_callbacks"),
|
|
635
|
+
("/api/settings/oauth-callbacks", ["POST"], "save_oauth_callbacks"),
|
|
636
|
+
# Tool security policies endpoints
|
|
637
|
+
("/api/policy/config", ["GET"], "policy_get_config"),
|
|
638
|
+
("/api/policy/config", ["PUT"], "policy_put_config"),
|
|
639
|
+
("/api/policy/pending", ["GET"], "policy_get_pending"),
|
|
640
|
+
("/api/policy/approve", ["POST"], "policy_post_approve"),
|
|
641
|
+
("/api/policy/deny", ["POST"], "policy_post_deny"),
|
|
642
|
+
("/api/policy/decision-pin", ["GET"], "policy_get_decision_pin"),
|
|
643
|
+
("/api/policy/decision-pin", ["POST"], "policy_post_decision_pin"),
|
|
644
|
+
("/api/policy/decision-pin", ["DELETE"], "policy_delete_decision_pin"),
|
|
645
|
+
("/api/policy/tool-schema", ["GET"], "policy_get_tool_schema"),
|
|
646
|
+
("/api/policy/value-source", ["GET"], "policy_get_value_source"),
|
|
647
|
+
# Entity visibility filter endpoints (issue #1728)
|
|
648
|
+
("/api/visibility/config", ["GET"], "visibility_get_config"),
|
|
649
|
+
("/api/visibility/config", ["PUT"], "visibility_put_config"),
|
|
650
|
+
)
|
|
651
|
+
|
|
652
|
+
|
|
595
653
|
def register_settings_routes(
|
|
596
654
|
mcp: FastMCP,
|
|
597
655
|
server: HomeAssistantSmartMCPServer,
|
|
@@ -668,63 +726,11 @@ def register_settings_routes(
|
|
|
668
726
|
# sidecar even when the prefix itself is not advertised (advertise_prefix=False).
|
|
669
727
|
_http_settings_mounted = True
|
|
670
728
|
|
|
671
|
-
# Every route this function mounts except the add-on-only root mount is defined
|
|
672
|
-
# once in this table and mounted under each active prefix below: at root
|
|
673
|
-
# in add-on mode (so HA ingress can proxy localhost:9583/), and under the
|
|
674
|
-
# secret path when one is set (Docker / standalone direct access). A
|
|
675
|
-
# deployment hits either, both, or — guarded above — neither. Deriving
|
|
676
|
-
# the mounts from one table keeps them from drifting; the frontend uses
|
|
677
|
-
# relative fetches (./api/settings/...) so the handlers work at any prefix.
|
|
678
|
-
routes: list[tuple[str, list[str], str]] = [
|
|
679
|
-
("/settings", ["GET"], "settings_page"),
|
|
680
|
-
("/api/settings/tools", ["GET"], "get_tools"),
|
|
681
|
-
("/api/settings/tools", ["POST"], "save_tools"),
|
|
682
|
-
("/api/settings/restart", ["POST"], "restart_addon"),
|
|
683
|
-
("/api/settings/info", ["GET"], "settings_info"),
|
|
684
|
-
("/api/settings/features", ["GET"], "get_feature_flags"),
|
|
685
|
-
("/api/settings/features", ["POST"], "save_feature_flags"),
|
|
686
|
-
# Theme / accessibility prefs (#1574 review) — server-side copy so
|
|
687
|
-
# they survive a stdio sidecar origin change (stable by default
|
|
688
|
-
# since #2131, but fresh on first spawn / lost ui.state / pin
|
|
689
|
-
# change / taken remembered port)
|
|
690
|
-
("/api/settings/theme", ["GET"], "get_theme_prefs"),
|
|
691
|
-
("/api/settings/theme", ["POST"], "save_theme_prefs"),
|
|
692
|
-
# Advanced settings endpoints
|
|
693
|
-
("/api/settings/advanced", ["GET"], "get_advanced_settings"),
|
|
694
|
-
("/api/settings/advanced", ["POST"], "save_advanced_settings"),
|
|
695
|
-
# Auto-backup endpoints (#1288)
|
|
696
|
-
("/api/settings/backups", ["GET"], "list_backups"),
|
|
697
|
-
("/api/settings/backups", ["DELETE"], "delete_backups_bulk"),
|
|
698
|
-
("/api/settings/backups/{name}", ["GET"], "view_backup"),
|
|
699
|
-
("/api/settings/backups/{name}/diff", ["GET"], "diff_backup"),
|
|
700
|
-
("/api/settings/backups/{name}/restore", ["POST"], "restore_backup"),
|
|
701
|
-
("/api/settings/backups/{name}", ["DELETE"], "delete_backup"),
|
|
702
|
-
("/api/settings/backup-config", ["GET"], "get_backup_config"),
|
|
703
|
-
("/api/settings/backup-config", ["POST"], "save_backup_config"),
|
|
704
|
-
# Custom filesystem directories (issue #1567) — component-owned list
|
|
705
|
-
("/api/settings/fs-custom-paths", ["GET"], "get_fs_custom_paths"),
|
|
706
|
-
("/api/settings/fs-custom-paths", ["POST"], "save_fs_custom_paths"),
|
|
707
|
-
# Tool security policies endpoints
|
|
708
|
-
("/api/policy/config", ["GET"], "policy_get_config"),
|
|
709
|
-
("/api/policy/config", ["PUT"], "policy_put_config"),
|
|
710
|
-
("/api/policy/pending", ["GET"], "policy_get_pending"),
|
|
711
|
-
("/api/policy/approve", ["POST"], "policy_post_approve"),
|
|
712
|
-
("/api/policy/deny", ["POST"], "policy_post_deny"),
|
|
713
|
-
("/api/policy/decision-pin", ["GET"], "policy_get_decision_pin"),
|
|
714
|
-
("/api/policy/decision-pin", ["POST"], "policy_post_decision_pin"),
|
|
715
|
-
("/api/policy/decision-pin", ["DELETE"], "policy_delete_decision_pin"),
|
|
716
|
-
("/api/policy/tool-schema", ["GET"], "policy_get_tool_schema"),
|
|
717
|
-
("/api/policy/value-source", ["GET"], "policy_get_value_source"),
|
|
718
|
-
# Entity visibility filter endpoints (issue #1728)
|
|
719
|
-
("/api/visibility/config", ["GET"], "visibility_get_config"),
|
|
720
|
-
("/api/visibility/config", ["PUT"], "visibility_put_config"),
|
|
721
|
-
]
|
|
722
|
-
|
|
723
729
|
def _mount(prefix: str, *, guard: bool = False) -> None:
|
|
724
730
|
# guard=True wraps each handler in _ingress_only so the route only
|
|
725
731
|
# answers HA ingress (the Supervisor) — used for the add-on root
|
|
726
732
|
# mount, whose port 9583 is reachable without the MCP secret.
|
|
727
|
-
for path, methods, handler_key in
|
|
733
|
+
for path, methods, handler_key in SETTINGS_ROUTES:
|
|
728
734
|
handler = handlers[handler_key]
|
|
729
735
|
if guard:
|
|
730
736
|
handler = _ingress_only(handler)
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
"""OAuth callback allowlist route handlers for the settings UI (#2427).
|
|
2
|
+
|
|
3
|
+
The in-process server's none-mode ``/authorize`` redirects only to callbacks
|
|
4
|
+
on an allowlist the ha_mcp_tools component stores on its server entry. These
|
|
5
|
+
handlers read and replace that list through the component's
|
|
6
|
+
``ha_mcp_tools/oauth_callbacks`` commands, so the panel and the entry's
|
|
7
|
+
Configure screen edit the same setting. Only the embedded server has the list;
|
|
8
|
+
every other deployment reports it unavailable and the page hides the section.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import logging
|
|
14
|
+
from typing import TYPE_CHECKING, Any
|
|
15
|
+
|
|
16
|
+
from starlette.requests import Request
|
|
17
|
+
from starlette.responses import JSONResponse
|
|
18
|
+
|
|
19
|
+
from .._version import is_embedded
|
|
20
|
+
from ..client.rest_client import HomeAssistantCommandError, HomeAssistantError
|
|
21
|
+
from ..errors import ErrorCode, create_error_response
|
|
22
|
+
|
|
23
|
+
if TYPE_CHECKING:
|
|
24
|
+
from ..server import HomeAssistantSmartMCPServer
|
|
25
|
+
|
|
26
|
+
logger = logging.getLogger(__name__)
|
|
27
|
+
|
|
28
|
+
WS_OAUTH_CALLBACKS = "ha_mcp_tools/oauth_callbacks"
|
|
29
|
+
WS_OAUTH_CALLBACKS_UPDATE = "ha_mcp_tools/oauth_callbacks_update"
|
|
30
|
+
CAPABILITY = "oauth_callbacks"
|
|
31
|
+
# Transport failures reaching the component; a command it ran and refused is
|
|
32
|
+
# a HomeAssistantCommandError, answered separately.
|
|
33
|
+
_REACH_ERRORS = (HomeAssistantError, OSError, TimeoutError)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class _Unavailable(Exception):
|
|
37
|
+
"""The list cannot be edited here; the message says why."""
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
async def _component_command(
|
|
41
|
+
server: HomeAssistantSmartMCPServer, command: str, **fields: Any
|
|
42
|
+
) -> dict[str, Any]:
|
|
43
|
+
"""Run one allowlist command on the component and return its result.
|
|
44
|
+
|
|
45
|
+
The capability probe is strict: one that failed because Home Assistant was
|
|
46
|
+
unreachable surfaces as a reachability error to retry, not as a component
|
|
47
|
+
that lacks the commands.
|
|
48
|
+
"""
|
|
49
|
+
from ..client.websocket_client import get_websocket_client
|
|
50
|
+
from ..tools.component_api import (
|
|
51
|
+
ComponentDiscoveryError,
|
|
52
|
+
component_supports,
|
|
53
|
+
get_component_caps,
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
client = server.client
|
|
57
|
+
try:
|
|
58
|
+
caps = await get_component_caps(client, strict=True)
|
|
59
|
+
except ComponentDiscoveryError as exc:
|
|
60
|
+
raise HomeAssistantError(str(exc)) from exc
|
|
61
|
+
if not component_supports(caps, CAPABILITY):
|
|
62
|
+
raise _Unavailable(
|
|
63
|
+
"This HA-MCP component cannot edit the callback list. Update the "
|
|
64
|
+
"HA-MCP integration in HACS."
|
|
65
|
+
)
|
|
66
|
+
ws = await get_websocket_client(
|
|
67
|
+
url=client.base_url,
|
|
68
|
+
token=client.token,
|
|
69
|
+
verify_ssl=getattr(client, "verify_ssl", None),
|
|
70
|
+
)
|
|
71
|
+
raw = await ws.send_command(command, **fields)
|
|
72
|
+
result = raw.get("result") if isinstance(raw, dict) else None
|
|
73
|
+
if not isinstance(result, dict):
|
|
74
|
+
raise _Unavailable("HA-MCP component returned an unexpected response.")
|
|
75
|
+
return result
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def _unavailable(reason: str | None) -> JSONResponse:
|
|
79
|
+
return JSONResponse({"success": True, "available": False, "reason": reason})
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
async def _get_oauth_callbacks(
|
|
83
|
+
server: HomeAssistantSmartMCPServer | None, _: Request
|
|
84
|
+
) -> JSONResponse:
|
|
85
|
+
"""The allowlist in force; always 200, with ``available`` False when absent."""
|
|
86
|
+
if server is None or not is_embedded():
|
|
87
|
+
return _unavailable(None)
|
|
88
|
+
try:
|
|
89
|
+
result = await _component_command(server, WS_OAUTH_CALLBACKS)
|
|
90
|
+
except _Unavailable as exc:
|
|
91
|
+
return _unavailable(str(exc))
|
|
92
|
+
except HomeAssistantCommandError as exc:
|
|
93
|
+
return _unavailable(f"The HA-MCP component refused the request: {exc}")
|
|
94
|
+
except _REACH_ERRORS as exc:
|
|
95
|
+
logger.warning(
|
|
96
|
+
"oauth-callbacks GET could not reach ha_mcp_tools", exc_info=True
|
|
97
|
+
)
|
|
98
|
+
return _unavailable(f"Could not reach the HA-MCP component: {exc}")
|
|
99
|
+
return JSONResponse({"success": True, "available": True, **result})
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def _parse_change(body: Any) -> dict[str, Any] | None:
|
|
103
|
+
if not isinstance(body, dict):
|
|
104
|
+
return None
|
|
105
|
+
if "reset" in body and "allowlist" in body:
|
|
106
|
+
# The component's schema makes these exclusive; a body carrying both
|
|
107
|
+
# must not silently let reset win over the list it also sent.
|
|
108
|
+
return None
|
|
109
|
+
if body.get("reset") is True:
|
|
110
|
+
return {"reset": True}
|
|
111
|
+
allowlist = body.get("allowlist")
|
|
112
|
+
# Counted and length-checked by the component after normalizing, the same
|
|
113
|
+
# order Configure uses, so both writers accept the same lists.
|
|
114
|
+
if isinstance(allowlist, list) and all(isinstance(i, str) for i in allowlist):
|
|
115
|
+
return {"allowlist": allowlist}
|
|
116
|
+
return None
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
async def _save_oauth_callbacks(
|
|
120
|
+
server: HomeAssistantSmartMCPServer | None, request: Request
|
|
121
|
+
) -> JSONResponse:
|
|
122
|
+
"""Replace the allowlist (``{"allowlist": [...]}``) or restore the default
|
|
123
|
+
(``{"reset": true}``). The change applies to the next sign-in."""
|
|
124
|
+
if server is None or not is_embedded():
|
|
125
|
+
return JSONResponse(
|
|
126
|
+
create_error_response(
|
|
127
|
+
ErrorCode.CONFIG_VALIDATION_FAILED,
|
|
128
|
+
"The OAuth callback list belongs to the server built into the "
|
|
129
|
+
"HA-MCP integration.",
|
|
130
|
+
),
|
|
131
|
+
status_code=409,
|
|
132
|
+
)
|
|
133
|
+
try:
|
|
134
|
+
change = _parse_change(await request.json())
|
|
135
|
+
except (ValueError, TypeError):
|
|
136
|
+
change = None
|
|
137
|
+
if change is None:
|
|
138
|
+
return JSONResponse(
|
|
139
|
+
create_error_response(
|
|
140
|
+
ErrorCode.VALIDATION_INVALID_PARAMETER,
|
|
141
|
+
"Send 'allowlist' as a list of URLs, or 'reset': true.",
|
|
142
|
+
),
|
|
143
|
+
status_code=400,
|
|
144
|
+
)
|
|
145
|
+
try:
|
|
146
|
+
result = await _component_command(server, WS_OAUTH_CALLBACKS_UPDATE, **change)
|
|
147
|
+
except _Unavailable as exc:
|
|
148
|
+
return JSONResponse(
|
|
149
|
+
create_error_response(ErrorCode.SERVICE_CALL_FAILED, str(exc)),
|
|
150
|
+
status_code=409,
|
|
151
|
+
)
|
|
152
|
+
except HomeAssistantCommandError as exc:
|
|
153
|
+
return JSONResponse(
|
|
154
|
+
create_error_response(ErrorCode.VALIDATION_INVALID_PARAMETER, str(exc)),
|
|
155
|
+
status_code=400,
|
|
156
|
+
)
|
|
157
|
+
except _REACH_ERRORS as exc:
|
|
158
|
+
logger.warning(
|
|
159
|
+
"oauth-callbacks POST could not reach ha_mcp_tools", exc_info=True
|
|
160
|
+
)
|
|
161
|
+
return JSONResponse(
|
|
162
|
+
create_error_response(
|
|
163
|
+
ErrorCode.SERVICE_CALL_FAILED,
|
|
164
|
+
f"Could not reach the HA-MCP component: {exc}",
|
|
165
|
+
),
|
|
166
|
+
status_code=502,
|
|
167
|
+
)
|
|
168
|
+
if not result.get("saved"):
|
|
169
|
+
return JSONResponse(
|
|
170
|
+
{
|
|
171
|
+
**create_error_response(
|
|
172
|
+
ErrorCode.VALIDATION_INVALID_PARAMETER,
|
|
173
|
+
"Nothing was saved. Each callback must be an https:// URL, "
|
|
174
|
+
"or an http:// URL on 127.0.0.1, [::1] or localhost, without "
|
|
175
|
+
"a user name, password or #fragment.",
|
|
176
|
+
),
|
|
177
|
+
"invalid": result.get("invalid", []),
|
|
178
|
+
},
|
|
179
|
+
status_code=400,
|
|
180
|
+
)
|
|
181
|
+
return JSONResponse({"success": True, **result})
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def build_oauth_callback_handlers(
|
|
185
|
+
server: HomeAssistantSmartMCPServer | None,
|
|
186
|
+
) -> dict[str, Any]:
|
|
187
|
+
"""Construct the OAuth callback allowlist route handlers."""
|
|
188
|
+
|
|
189
|
+
async def get_oauth_callbacks(request: Request) -> JSONResponse:
|
|
190
|
+
return await _get_oauth_callbacks(server, request)
|
|
191
|
+
|
|
192
|
+
async def save_oauth_callbacks(request: Request) -> JSONResponse:
|
|
193
|
+
return await _save_oauth_callbacks(server, request)
|
|
194
|
+
|
|
195
|
+
return {
|
|
196
|
+
"get_oauth_callbacks": get_oauth_callbacks,
|
|
197
|
+
"save_oauth_callbacks": save_oauth_callbacks,
|
|
198
|
+
}
|