ha-mcp-dev 9.1.0.dev3348__tar.gz → 9.1.0.dev3352__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-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/PKG-INFO +14 -1
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/README.md +13 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/pyproject.toml +1 -1
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/pyproject.toml.orig +1 -1
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/http_transport.py +38 -15
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/server.py +47 -48
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/server_instructions.py +17 -14
- ha_mcp_dev-9.1.0.dev3352/src/ha_mcp/tool_catalog.py +125 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/bug_report_config.py +3 -0
- ha_mcp_dev-9.1.0.dev3352/src/ha_mcp/tools/tool_search_hint_middleware.py +96 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_code.py +2 -2
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_search.py +3 -4
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/transforms/categorized_search.py +14 -5
- ha_mcp_dev-9.1.0.dev3348/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -103
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/LICENSE +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_rich_compat.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/LICENSE +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/REQUIRES.txt +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/VENDORED +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/_compat.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/_install_hints.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/_warnings.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/apps/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/apps/app.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/apps/approval.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/apps/choice.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/apps/config.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/apps/file_upload.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/apps/form.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/apps/generative.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/cli/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/cli/__main__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev_security.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/cli/auth.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/cli/cimd.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/cli/cli.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/cli/client.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/cli/deploy/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/cli/deploy/authentication.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/cli/deploy/command.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/cli/deploy/configuration.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/cli/deploy/credentials.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/cli/deploy/horizon_client.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/cli/deploy/output.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/cli/deploy/state.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/cli/discovery.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/cli/generate.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/cli/install/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_code.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_desktop.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/cli/install/cursor.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/cli/install/gemini_cli.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/cli/install/goose.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/cli/install/mcp_json.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/cli/install/shared.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/cli/install/stdio.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/cli/run.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/client/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/client/_sdk_context_shim.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/client/auth/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/client/auth/bearer.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/client/auth/client_credentials.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/client/auth/oauth.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/client/caching.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/client/client.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/client/dependencies.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/client/elicitation.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/client/extension_hooks.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/client/group.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/client/logging.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/client/messages.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/client/mixins/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/client/mixins/prompts.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/client/mixins/resources.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/client/mixins/skills.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/client/mixins/tools.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/client/oauth_callback.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/client/progress.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/client/roots.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/client/sampling/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/anthropic.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/google_genai.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/openai.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/client/telemetry.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/client/transports/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/client/transports/base.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/client/transports/config.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/client/transports/http.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/client/transports/inference.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/client/transports/memory.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/client/transports/sse.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/client/transports/stdio.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/contrib/README.md +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/README.md +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/bulk_tool_caller.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/example.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/README.md +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/component_manager.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/example.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/README.md +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/example.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/mcp_mixin.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/decorators.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/dependencies.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/exceptions.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/experimental/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/code_mode.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/jev_search.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/mcp_config.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/prompts/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/prompts/base.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/prompts/function_prompt.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/py.typed +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/resources/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/resources/base.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/resources/function_resource.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/resources/security.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/resources/template.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/resources/types.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/auth.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/cimd.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/authorize.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/identity_assertion.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/jwt_issuer.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/middleware.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/consent.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/models.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/proxy.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/ui.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/upstream.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/oidc_proxy.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/auth0.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/aws.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/azure.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/clerk.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/debug.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/descope.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/discord.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/github.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/google.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/huggingface.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/in_memory.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/introspection.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/jwt.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/keycloak.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/oci.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/propelauth.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/scalekit.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/supabase.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/workos.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/redirect_validation.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/auth/ssrf.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/caching.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/completions.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/context.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/dependencies.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/elicitation.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/event_store.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/extensions.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/http.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/lifespan.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/low_level.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/middleware/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/middleware/authorization.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/middleware/caching.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/middleware/dereference.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/middleware/error_handling.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/middleware/logging.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/middleware/middleware.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/middleware/ping.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/middleware/rate_limiting.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/middleware/response_limiting.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/middleware/timing.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/middleware/tool_injection.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/mixins/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/mixins/extensions.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/mixins/lifespan.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/mixins/mcp_operations.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/mixins/transport.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/providers/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/providers/addressing.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/providers/aggregate.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/providers/base.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/providers/fastmcp_provider.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem_discovery.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/prompts.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/resources.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/tools.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/local_provider.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/README.md +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/components.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/provider.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/routing.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_payload.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_synthesis.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/providers/proxy.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/_common.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/claude_provider.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/directory_provider.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/skill_provider.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/vendor_providers.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/providers/wrapped_provider.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/server.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/session_scoped_event_store.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/sessions.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/telemetry.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/transforms/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/transforms/catalog.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/transforms/namespace.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/transforms/prompts_as_tools.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/transforms/resources_as_tools.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/base.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/bm25.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/regex.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/transforms/tool_transform.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/transforms/version_filter.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/server/transforms/visibility.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/settings.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/skills/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/skills/_constants.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/skills/_resources.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/skills/_snapshot.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/skills/_source.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/skills/client.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/skills/extension.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/skills/models.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/telemetry.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/tools/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/tools/base.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/tools/function_parsing.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/tools/function_tool.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/tools/tool_transform.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/types.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/asgi_transport.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/async_utils.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/auth.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/authorization.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/cli.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/components.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/docstring_parsing.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/exceptions.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/http.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/inspect.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema_type.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/lifespan.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/logging.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/base.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/uv.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/mcp_server_config.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/schema.json +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/base.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/filesystem.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/mime.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/README.md +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/director.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/formatters.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/json_schema_converter.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/models.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/parser.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/schemas.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/pagination.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/prefab.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/skills.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/tasks.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/tests.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/timeout.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/token_cache.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/types.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/ui.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/version_check.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/fastmcp/utilities/versions.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/LICENSE +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/REQUIRES.txt +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/VENDORED +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/cli/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/cli/claude.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/cli/cli.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/client/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/client/__main__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/client/_input_required.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/client/_memory.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/client/_probe.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/client/_transport.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/client/auth/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/client/auth/exceptions.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/client/auth/extensions/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/client/auth/extensions/client_credentials.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/client/auth/extensions/identity_assertion.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/client/auth/oauth2.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/client/auth/utils.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/client/caching.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/client/client.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/client/context.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/client/extension.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/client/session.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/client/session_group.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/client/sse.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/client/stdio.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/client/streamable_http.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/client/subscriptions.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/os/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/os/posix/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/os/posix/utilities.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/os/win32/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/os/win32/utilities.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/py.typed +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/__main__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/_otel.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/_streamable_http_modern.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/apps.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/auth/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/auth/errors.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/auth/handlers/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/auth/handlers/authorize.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/auth/handlers/metadata.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/auth/handlers/register.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/auth/handlers/revoke.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/auth/handlers/token.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/auth/json_response.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/auth/middleware/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/auth/middleware/auth_context.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/auth/middleware/bearer_auth.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/auth/middleware/client_auth.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/auth/provider.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/auth/routes.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/auth/settings.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/caching.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/connection.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/context.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/elicitation.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/extension.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/fastmcp.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/lowlevel/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/lowlevel/helper_types.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/lowlevel/server.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/mcpserver/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/mcpserver/context.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/mcpserver/exceptions.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/base.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/manager.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/mcpserver/resolve.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/base.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/resource_manager.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/templates.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/types.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/mcpserver/server.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/base.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/tool_manager.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/context_injection.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/func_metadata.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/logging.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/types.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/models.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/request_state.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/runner.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/session.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/sse.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/stdio.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/streamable_http.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/streamable_http_manager.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/subscriptions.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/transport_security.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/server/validation.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/shared/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/shared/_callable_inspection.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/shared/_compat.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/shared/_context_streams.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/shared/_httpx_utils.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/shared/_otel.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/shared/_request_clock.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/shared/_stream_protocols.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/shared/auth.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/shared/auth_utils.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/shared/context.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/shared/direct_dispatcher.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/shared/dispatcher.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/shared/exceptions.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/shared/extension.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/shared/inbound.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/shared/jsonrpc_dispatcher.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/shared/memory.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/shared/message.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/shared/metadata_utils.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/shared/path_security.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/shared/peer.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/shared/subscriptions.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/shared/tool_name_validation.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/shared/transport_context.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/shared/uri_template.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/types/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/types/jsonrpc.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/types/methods.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp/types/version.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp_types/LICENSE +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp_types/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp_types/REQUIRES.txt +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp_types/VENDORED +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp_types/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp_types/_types.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp_types/_v2025_11_25/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp_types/_v2026_07_28/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp_types/_wire_base.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp_types/jsonrpc.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp_types/methods.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp_types/py.typed +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/mcp_types/version.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/requirements.txt +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/client.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/server.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_vendor/websockets/version.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/app_discovery.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/auth/iss_stamp.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/auth/oidc_compat.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/backup_dashboards.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/backup_diff.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/backup_entities.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/backup_entity_ids.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/backup_helper_target.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/backup_integrations.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/backup_manager.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/backup_tags.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/backup_todo.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/backup_zones.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/browser_landing.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/client/admin_routes.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/client/error_log_journald.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/client/event_listeners.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/client/models.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/client/rest_client.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/config_backup.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/config_meta.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/config_overrides.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/config_registry.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/config_settings.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/dashboard_screenshot/engine_compat.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/dashboard_screenshot/theme_check.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/ha_request_queue.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/hacs_auto_refresh.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/image_info.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/ipv6_lan_guard.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/listen_sockets.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/llm_exposure.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/log_filters.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/mcp_client_context.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/policy/decision_pin.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/policy/decisions.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/policy/editing.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/policy/events.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/policy/mrtr.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/policy/server_channels.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/read_only.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/redaction.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/renamed_tools.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-actions.md +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/triggers-and-conditions.md +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/server_lifespan.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/server_tool_text.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/_handlers_oauth_callbacks.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/_i18n.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/_persistence.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/_theme.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/locales/README.md +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/locales/az.json +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/locales/de.json +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/locales/en.json +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/locales/es.json +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/locales/hu.json +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/locales/it.json +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/locales/zh-Hant.json +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/settings.css +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/settings.html +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/settings_js/01_i18n_state.js +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/settings_js/02_tools_restart.js +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/settings_js/03_render_save.js +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/settings_js/04_backups.js +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/settings_js/05_feature_flags.js +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/settings_js/06_policy_cards.js +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/settings_js/07_policy_actions.js +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/settings_js/08_advanced.js +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/settings_js/09_prefs_visibility.js +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/settings_ui/settings_js/10_oauth_callbacks.js +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/storage_helper_types.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/strict_bps.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tool_dispatch.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/addon_connection_hints.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/area_messages.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/auto_backup.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/automation_errors.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/backup_access.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/backup_on_demand.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/backup_snapshot.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/backup_snapshot_restore.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/best_practice_result.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/best_practice_variables.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/blueprint_sources.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/blueprint_write.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/bug_report_redaction.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/bug_report_sources.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/bug_report_templates.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/bulk_selector.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/coercion.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/component_api.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/component_automation.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/component_config_entries.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/component_config_reads.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/component_dashboard_edit.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/component_devices.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/component_helper_collections.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/component_registries.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/component_todo.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/config_entry_backup.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/config_entry_flow.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/config_entry_flow_introspect.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/config_entry_identity.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/config_file_visibility.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/config_helpers/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/config_helpers/core_payload.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/config_helpers/create.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/config_helpers/describe.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/config_helpers/flow.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/config_helpers/icon_route.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/config_helpers/listing.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/config_helpers/registry.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/config_helpers/schemas.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/config_helpers/typed_config.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/config_helpers/update.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/config_helpers/validation.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/config_subentry_restore.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/config_write_errors.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/config_write_helpers.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/core_contract.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/dashboard_card_describe.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/dashboard_edit_errors.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/dashboard_list_checks.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/dashboard_read_errors.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/dev_backup.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/device_enrichment.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/diagnostics_helpers.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/energy_preferences.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/entity_expose_batch.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/entity_param_parsing.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/entity_registration.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/entity_removal.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/entity_update_fields.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/error_log_parsing.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/event_call.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/event_listener_fields.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/flow_helper_lookup.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/hacs_backend.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/hacs_registration.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/helper_flows.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/history_response.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/integration_entry_state.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/log_common.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/log_sources.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/log_sources_fault.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/log_sources_logbook.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/radio/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/radio/base.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/radio/matter.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/radio/thread.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/radio/zigbee.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/radio/zwave.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/radio/zwave_parameters.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/recorder_errors.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/resource_codec.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/resource_patch.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/response_helpers.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/scene_discovery.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/search/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/search/base.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/search/component.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/search/entities.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/search/legacy.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/search/modes.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/search/overview.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/search/response.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/search/state.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/server_version.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/statistics_calendar.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/statistics_helpers.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/statistics_resets.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/system_restart.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tool_hints.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_config_automations.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_dev.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_integrations.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_logs.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_radio.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_security_policy.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_themes.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/update_categories.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/tools/ws_waiters.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/transforms/compact_params.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/transforms/component_helpers.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/transforms/component_search.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/transforms/write_tool_note.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/transport_security.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/update_check.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/utils/config_write_lock.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/utils/dashboard_patch.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/utils/entity_membership.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/utils/mcp_client_host.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/utils/registry_update_lock.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/visibility/__init__.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/visibility/config_files.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/visibility/enforcement.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/visibility/identifier_aliases.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/visibility/model.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/src/ha_mcp/visibility/persistence.py +0 -0
- {ha_mcp_dev-9.1.0.dev3348 → ha_mcp_dev-9.1.0.dev3352}/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: 9.1.0.
|
|
3
|
+
Version: 9.1.0.dev3352
|
|
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
|
|
@@ -445,6 +445,19 @@ Leave it off in clients with deferred tool loading (claude.ai, Claude Desktop, C
|
|
|
445
445
|
|
|
446
446
|
For the HA app, the same option is documented in [`homeassistant-addon/DOCS.md`](homeassistant-addon/DOCS.md#enable_tool_search) along with the in-app settings UI for fine-grained tool enable/disable/pin.
|
|
447
447
|
|
|
448
|
+
### Per-URL tool catalog
|
|
449
|
+
|
|
450
|
+
`ENABLE_TOOL_SEARCH` defaults to off, and it sets the catalog of the main endpoint only. When several clients share one server, give each the URL for the catalog it needs: a client with built-in tool search keeps the full list, a small-context client gets the search tools. The suffixes are fixed overrides that ignore `ENABLE_TOOL_SEARCH`:
|
|
451
|
+
|
|
452
|
+
```text
|
|
453
|
+
Main endpoint (follows ENABLE_TOOL_SEARCH): https://example.com/private_your_secret
|
|
454
|
+
Always the full catalog: https://example.com/private_your_secret/catalog/full
|
|
455
|
+
Always the search tools: https://example.com/private_your_secret/catalog/search
|
|
456
|
+
Read-only, search tools: https://example.com/private_your_secret/readonly/catalog/search
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
Each URL keeps its catalog for the life of the connection, so a client picks its catalog only by the URL it is given. Reconnect the client after changing its URL so it refreshes its tool list. Home Assistant webhook URLs accept the same suffixes, alone or after `/readonly`: `https://your-ha.example/api/webhook/<webhook-id>/catalog/search`. This needs an embedded integration or Webhook Proxy app (add-on) release that serves them, with a matching MCP server; an older one returns 404 for a suffixed URL. Stdio runs one client per server process, so set `ENABLE_TOOL_SEARCH` in that client's server environment instead.
|
|
460
|
+
|
|
448
461
|
---
|
|
449
462
|
|
|
450
463
|
### Read-only HTTP connections
|
|
@@ -385,6 +385,19 @@ Leave it off in clients with deferred tool loading (claude.ai, Claude Desktop, C
|
|
|
385
385
|
|
|
386
386
|
For the HA app, the same option is documented in [`homeassistant-addon/DOCS.md`](homeassistant-addon/DOCS.md#enable_tool_search) along with the in-app settings UI for fine-grained tool enable/disable/pin.
|
|
387
387
|
|
|
388
|
+
### Per-URL tool catalog
|
|
389
|
+
|
|
390
|
+
`ENABLE_TOOL_SEARCH` defaults to off, and it sets the catalog of the main endpoint only. When several clients share one server, give each the URL for the catalog it needs: a client with built-in tool search keeps the full list, a small-context client gets the search tools. The suffixes are fixed overrides that ignore `ENABLE_TOOL_SEARCH`:
|
|
391
|
+
|
|
392
|
+
```text
|
|
393
|
+
Main endpoint (follows ENABLE_TOOL_SEARCH): https://example.com/private_your_secret
|
|
394
|
+
Always the full catalog: https://example.com/private_your_secret/catalog/full
|
|
395
|
+
Always the search tools: https://example.com/private_your_secret/catalog/search
|
|
396
|
+
Read-only, search tools: https://example.com/private_your_secret/readonly/catalog/search
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
Each URL keeps its catalog for the life of the connection, so a client picks its catalog only by the URL it is given. Reconnect the client after changing its URL so it refreshes its tool list. Home Assistant webhook URLs accept the same suffixes, alone or after `/readonly`: `https://your-ha.example/api/webhook/<webhook-id>/catalog/search`. This needs an embedded integration or Webhook Proxy app (add-on) release that serves them, with a matching MCP server; an older one returns 404 for a suffixed URL. Stdio runs one client per server process, so set `ENABLE_TOOL_SEARCH` in that client's server environment instead.
|
|
400
|
+
|
|
388
401
|
---
|
|
389
402
|
|
|
390
403
|
### Read-only HTTP connections
|
|
@@ -4,7 +4,7 @@ build-backend = "uv_build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ha-mcp-dev"
|
|
7
|
-
version = "9.1.0.
|
|
7
|
+
version = "9.1.0.dev3352"
|
|
8
8
|
description = "Home Assistant MCP Server - Complete control of Home Assistant through MCP"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.13,<3.15"
|
|
@@ -4,7 +4,7 @@ build-backend = "uv_build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ha-mcp-dev"
|
|
7
|
-
version = "9.1.0.
|
|
7
|
+
version = "9.1.0.dev3352"
|
|
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
|
|
@@ -4,7 +4,7 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import logging
|
|
6
6
|
from collections.abc import Iterator
|
|
7
|
-
from contextlib import contextmanager
|
|
7
|
+
from contextlib import ExitStack, contextmanager
|
|
8
8
|
from dataclasses import dataclass, field
|
|
9
9
|
from threading import Lock
|
|
10
10
|
from time import monotonic
|
|
@@ -19,6 +19,7 @@ from ha_mcp._vendor.fastmcp import FastMCP
|
|
|
19
19
|
from ha_mcp._vendor.fastmcp.server.http import StarletteWithLifespan
|
|
20
20
|
|
|
21
21
|
from .config import get_global_settings
|
|
22
|
+
from .tool_catalog import CATALOG_MODES, CatalogMode
|
|
22
23
|
|
|
23
24
|
logger = logging.getLogger(__name__)
|
|
24
25
|
|
|
@@ -90,7 +91,7 @@ class HttpTransportFastMCP(FastMCP):
|
|
|
90
91
|
"""
|
|
91
92
|
|
|
92
93
|
def http_app(self, *args: Any, **kwargs: Any) -> StarletteWithLifespan:
|
|
93
|
-
"""Build the app with
|
|
94
|
+
"""Build the app with endpoint selectors and optional transport experiments."""
|
|
94
95
|
settings = get_global_settings()
|
|
95
96
|
if settings.http_json_response:
|
|
96
97
|
# FastMCP accepts json_response as its third positional argument.
|
|
@@ -114,38 +115,60 @@ class HttpTransportFastMCP(FastMCP):
|
|
|
114
115
|
kwargs["middleware"] = middleware
|
|
115
116
|
app = super().http_app(*args, **kwargs)
|
|
116
117
|
if app.state.transport_type == "streamable-http":
|
|
117
|
-
app.add_middleware(
|
|
118
|
+
app.add_middleware(EndpointSelectors, path=app.state.path)
|
|
118
119
|
return app
|
|
119
120
|
|
|
120
121
|
|
|
121
|
-
class
|
|
122
|
-
"""Route
|
|
122
|
+
class EndpointSelectors:
|
|
123
|
+
"""Route connection-selecting suffixes through the same authenticated MCP app.
|
|
123
124
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
125
|
+
``/readonly`` restricts the connection to reads; ``/catalog/full`` and
|
|
126
|
+
``/catalog/search`` fix its tool catalog. A connection may use both,
|
|
127
|
+
read-only first (``/readonly/catalog/search``). The credential
|
|
128
|
+
still works at the normal endpoint. Settings and other HTTP routes are
|
|
129
|
+
not aliased.
|
|
127
130
|
"""
|
|
128
131
|
|
|
129
132
|
def __init__(self, app: ASGIApp, path: str) -> None:
|
|
130
133
|
self.app = app
|
|
131
134
|
self.path = path
|
|
132
|
-
self.
|
|
135
|
+
self.base = path.rstrip("/")
|
|
136
|
+
|
|
137
|
+
def _selectors(self, route_path: str) -> tuple[bool, CatalogMode | None] | None:
|
|
138
|
+
"""``(read_only, catalog_mode)`` for a selector suffix, else None."""
|
|
139
|
+
if not route_path.startswith(self.base + "/"):
|
|
140
|
+
return None
|
|
141
|
+
parts = route_path[len(self.base) + 1 :].split("/")
|
|
142
|
+
read_only = parts[:1] == ["readonly"]
|
|
143
|
+
if read_only:
|
|
144
|
+
parts = parts[1:]
|
|
145
|
+
if not parts:
|
|
146
|
+
return (True, None) if read_only else None
|
|
147
|
+
if len(parts) == 2 and parts[0] == "catalog" and parts[1] in CATALOG_MODES:
|
|
148
|
+
return read_only, parts[1]
|
|
149
|
+
return None
|
|
133
150
|
|
|
134
151
|
async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None:
|
|
135
|
-
if
|
|
136
|
-
scope["type"] != "http"
|
|
137
|
-
or _get_route_path(scope).rstrip("/") != self.readonly_path
|
|
138
|
-
):
|
|
152
|
+
if scope["type"] != "http":
|
|
139
153
|
await self.app(scope, receive, send)
|
|
140
154
|
return
|
|
141
|
-
|
|
142
155
|
from .read_only import read_only_request
|
|
156
|
+
from .tool_catalog import catalog_endpoint
|
|
143
157
|
|
|
144
158
|
route_path = _get_route_path(scope)
|
|
159
|
+
selected = self._selectors(route_path.rstrip("/"))
|
|
160
|
+
if selected is None:
|
|
161
|
+
await self.app(scope, receive, send)
|
|
162
|
+
return
|
|
163
|
+
read_only, mode = selected
|
|
145
164
|
prefix = scope["path"][: -len(route_path)]
|
|
146
165
|
path = prefix + self.path
|
|
147
166
|
scope = {**scope, "path": path, "raw_path": path.encode("utf-8")}
|
|
148
|
-
with
|
|
167
|
+
with ExitStack() as stack:
|
|
168
|
+
if read_only:
|
|
169
|
+
stack.enter_context(read_only_request())
|
|
170
|
+
if mode is not None:
|
|
171
|
+
stack.enter_context(catalog_endpoint(mode))
|
|
149
172
|
await self.app(scope, receive, send)
|
|
150
173
|
|
|
151
174
|
|
|
@@ -34,6 +34,12 @@ from .server_tool_text import (
|
|
|
34
34
|
SKILL_TOOL_NAME,
|
|
35
35
|
SKILL_USE_BEFORE_KEYWORDS,
|
|
36
36
|
)
|
|
37
|
+
from .tool_catalog import (
|
|
38
|
+
CATALOG_MODES,
|
|
39
|
+
default_catalog_mode,
|
|
40
|
+
install_catalog_instructions,
|
|
41
|
+
set_search_available,
|
|
42
|
+
)
|
|
37
43
|
from .tools.helpers import raise_tool_error
|
|
38
44
|
from .tools.tool_hints import read_only_hints
|
|
39
45
|
from .transforms import DEFAULT_PINNED_TOOLS
|
|
@@ -114,12 +120,18 @@ class HomeAssistantSmartMCPServer:
|
|
|
114
120
|
server_name = self.settings.mcp_server_name
|
|
115
121
|
server_version = self.settings.mcp_server_version
|
|
116
122
|
|
|
117
|
-
|
|
123
|
+
skills = self._build_skills_instructions()
|
|
124
|
+
self._instructions = {
|
|
125
|
+
mode: compose_instructions(
|
|
126
|
+
skills, self.settings, tool_search=mode == "search"
|
|
127
|
+
)
|
|
128
|
+
for mode in CATALOG_MODES
|
|
129
|
+
}
|
|
118
130
|
|
|
119
131
|
self.mcp = FastMCP(
|
|
120
132
|
name=server_name,
|
|
121
133
|
version=server_version,
|
|
122
|
-
instructions=
|
|
134
|
+
instructions=self._instructions[default_catalog_mode()],
|
|
123
135
|
lifespan=server_lifespan,
|
|
124
136
|
)
|
|
125
137
|
|
|
@@ -199,7 +211,7 @@ class HomeAssistantSmartMCPServer:
|
|
|
199
211
|
|
|
200
212
|
# Enrich tool descriptions with BM25 keyword boosts. Runs
|
|
201
213
|
# unconditionally so Claude's native deferred-tool search
|
|
202
|
-
# (claude.ai) benefits
|
|
214
|
+
# (claude.ai) benefits on full-catalog connections too.
|
|
203
215
|
# Must come before _apply_tool_search so CategorizedSearchTransform
|
|
204
216
|
# indexes the enriched descriptions.
|
|
205
217
|
self._apply_search_keyword_enrichment()
|
|
@@ -231,7 +243,7 @@ class HomeAssistantSmartMCPServer:
|
|
|
231
243
|
self.mcp.add_middleware(ValidationErrorMiddleware())
|
|
232
244
|
|
|
233
245
|
# Replace the opaque "Unknown tool" FastMCP raises when a client calls
|
|
234
|
-
# ha_search_tools / the ha_call_* proxies
|
|
246
|
+
# ha_search_tools / the ha_call_* proxies on a full-catalog connection
|
|
235
247
|
# (stale client tool-list cache) with an actionable refresh hint.
|
|
236
248
|
from .tools.tool_search_hint_middleware import ToolSearchHintMiddleware
|
|
237
249
|
|
|
@@ -321,14 +333,10 @@ class HomeAssistantSmartMCPServer:
|
|
|
321
333
|
|
|
322
334
|
return get_skills_dir()
|
|
323
335
|
|
|
324
|
-
def _build_instructions(self) -> str:
|
|
325
|
-
"""Compose the server instructions sent in the MCP initialize response."""
|
|
326
|
-
return compose_instructions(self._build_skills_instructions(), self.settings)
|
|
327
|
-
|
|
328
336
|
def _build_skills_instructions(self) -> str | None:
|
|
329
337
|
"""The skills section of the instructions, or None without skills."""
|
|
330
338
|
return build_skills_instructions(
|
|
331
|
-
self._get_skills_dir(),
|
|
339
|
+
self._get_skills_dir(), skill_tool_hidden(self.settings)
|
|
332
340
|
)
|
|
333
341
|
|
|
334
342
|
_parse_skill_frontmatter = staticmethod(parse_skill_frontmatter)
|
|
@@ -394,8 +402,8 @@ class HomeAssistantSmartMCPServer:
|
|
|
394
402
|
|
|
395
403
|
# Description overrides that REPLACE the original description for BM25.
|
|
396
404
|
# Used to narrow overly broad tools so they stop matching generic queries
|
|
397
|
-
# against ha-mcp's internal BM25 search tool. Only applied
|
|
398
|
-
#
|
|
405
|
+
# against ha-mcp's internal BM25 search tool. Only applied to
|
|
406
|
+
# search-mode connections, because they are tuned specifically for the
|
|
399
407
|
# categorized search transform and replacing the base description would
|
|
400
408
|
# unnecessarily trim context for other clients.
|
|
401
409
|
_SEARCH_DESCRIPTION_OVERRIDES: ClassVar[dict[str, str]] = {}
|
|
@@ -480,7 +488,7 @@ class HomeAssistantSmartMCPServer:
|
|
|
480
488
|
list-tools time via ``SearchKeywordsTransform``.
|
|
481
489
|
|
|
482
490
|
Description overrides (``_SEARCH_DESCRIPTION_OVERRIDES``) are only
|
|
483
|
-
applied
|
|
491
|
+
applied to search-mode connections, because they
|
|
484
492
|
REPLACE the original description and are tuned specifically for
|
|
485
493
|
ha-mcp's internal BM25 search tool.
|
|
486
494
|
|
|
@@ -496,11 +504,7 @@ class HomeAssistantSmartMCPServer:
|
|
|
496
504
|
)
|
|
497
505
|
return
|
|
498
506
|
|
|
499
|
-
overrides =
|
|
500
|
-
self._SEARCH_DESCRIPTION_OVERRIDES
|
|
501
|
-
if self.settings.enable_tool_search
|
|
502
|
-
else None
|
|
503
|
-
)
|
|
507
|
+
overrides = self._SEARCH_DESCRIPTION_OVERRIDES
|
|
504
508
|
try:
|
|
505
509
|
self.mcp.add_transform(
|
|
506
510
|
SearchKeywordsTransform(
|
|
@@ -517,32 +521,15 @@ class HomeAssistantSmartMCPServer:
|
|
|
517
521
|
logger.exception("Failed to apply SearchKeywordsTransform")
|
|
518
522
|
|
|
519
523
|
def _apply_tool_search(self) -> None:
|
|
520
|
-
"""
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
``
|
|
527
|
-
bundled skill trigger-conditions stay in the catalog — no explicit
|
|
528
|
-
``pinned.append(...)`` for it here.
|
|
529
|
-
|
|
530
|
-
Note: ``_apply_search_keyword_enrichment`` already ran before this
|
|
531
|
-
method and installed ``SearchKeywordsTransform`` — the enriched
|
|
524
|
+
"""Install the CategorizedSearchTransform and per-endpoint instructions.
|
|
525
|
+
|
|
526
|
+
For endpoints in search mode (see ``tool_catalog``), replaces the full
|
|
527
|
+
catalog with a BM25 search tool and read/write/delete call proxies.
|
|
528
|
+
Pinned tools, ``ha_get_skill_guide`` among them via
|
|
529
|
+
``DEFAULT_PINNED_TOOLS``, stay directly visible for permission gating.
|
|
530
|
+
``_apply_search_keyword_enrichment`` already ran, so the enriched
|
|
532
531
|
catalog is what the categorized transform indexes.
|
|
533
532
|
"""
|
|
534
|
-
if not self.settings.enable_tool_search:
|
|
535
|
-
return
|
|
536
|
-
|
|
537
|
-
try:
|
|
538
|
-
from .transforms import CategorizedSearchTransform
|
|
539
|
-
except ImportError:
|
|
540
|
-
logger.error(
|
|
541
|
-
"CategorizedSearchTransform not available but ENABLE_TOOL_SEARCH=true — "
|
|
542
|
-
"full tool catalog will be exposed. Install fastmcp>=3.1 to fix."
|
|
543
|
-
)
|
|
544
|
-
return
|
|
545
|
-
|
|
546
533
|
# Build the always_visible list: defaults (minus tools the user
|
|
547
534
|
# explicitly toggled to "enabled" in the Tools tab) + user pins.
|
|
548
535
|
# The skill guide tool is part of DEFAULT_PINNED_TOOLS, and in
|
|
@@ -576,6 +563,8 @@ class HomeAssistantSmartMCPServer:
|
|
|
576
563
|
)
|
|
577
564
|
|
|
578
565
|
try:
|
|
566
|
+
from .transforms import CategorizedSearchTransform
|
|
567
|
+
|
|
579
568
|
self.mcp.add_transform(
|
|
580
569
|
CategorizedSearchTransform(
|
|
581
570
|
max_results=self.settings.tool_search_max_results,
|
|
@@ -589,14 +578,24 @@ class HomeAssistantSmartMCPServer:
|
|
|
589
578
|
enable_code_mode=self.settings.enable_code_mode,
|
|
590
579
|
)
|
|
591
580
|
)
|
|
592
|
-
logger.info(
|
|
593
|
-
"Tool search transform applied (%d pinned tools, max_results=%d, code_mode=%s)",
|
|
594
|
-
len(pinned),
|
|
595
|
-
self.settings.tool_search_max_results,
|
|
596
|
-
self.settings.enable_code_mode,
|
|
597
|
-
)
|
|
598
581
|
except Exception:
|
|
599
|
-
|
|
582
|
+
# Import or install failed: no endpoint can serve search, so every
|
|
583
|
+
# one serves, and describes, the full catalog.
|
|
584
|
+
logger.exception(
|
|
585
|
+
"Tool search transform unavailable; every endpoint serves the "
|
|
586
|
+
"full tool catalog"
|
|
587
|
+
)
|
|
588
|
+
set_search_available(False)
|
|
589
|
+
self.mcp.instructions = self._instructions["full"]
|
|
590
|
+
return
|
|
591
|
+
set_search_available(True)
|
|
592
|
+
install_catalog_instructions(self.mcp, self._instructions)
|
|
593
|
+
logger.info(
|
|
594
|
+
"Tool search transform applied (%d pinned tools, max_results=%d, code_mode=%s)",
|
|
595
|
+
len(pinned),
|
|
596
|
+
self.settings.tool_search_max_results,
|
|
597
|
+
self.settings.enable_code_mode,
|
|
598
|
+
)
|
|
600
599
|
|
|
601
600
|
def _apply_tool_security_policies(self) -> None:
|
|
602
601
|
"""Register the tool security policies middleware (#966).
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""The instructions the server sends in the MCP initialize response.
|
|
2
2
|
|
|
3
3
|
Sections, in order: the bundled best-practice skills with how to read them
|
|
4
|
-
(plus the tool-search note
|
|
4
|
+
(plus the tool-search note for connections in search mode), the Read Only Mode
|
|
5
5
|
warning, the issue-filing rule, and the installation owner's
|
|
6
6
|
``custom_instructions``. The skills header and access fallbacks are
|
|
7
7
|
defined here; the notices come from ``server_tool_text``.
|
|
@@ -116,9 +116,7 @@ def skill_block(skill_name: str, description: str) -> str:
|
|
|
116
116
|
return f"\n### Skill: {skill_name} ({uri})\n{description.strip()}"
|
|
117
117
|
|
|
118
118
|
|
|
119
|
-
def build_skills_instructions(
|
|
120
|
-
skills_dir: Path | None, settings: Settings, tool_hidden: bool
|
|
121
|
-
) -> str | None:
|
|
119
|
+
def build_skills_instructions(skills_dir: Path | None, tool_hidden: bool) -> str | None:
|
|
122
120
|
"""Build the skills section from each bundled SKILL.md's frontmatter.
|
|
123
121
|
|
|
124
122
|
The description field is authored for LLM consumption and included
|
|
@@ -134,22 +132,27 @@ def build_skills_instructions(
|
|
|
134
132
|
_RESOURCE_ACCESS + _LOCAL_SKILLS_FALLBACK if tool_hidden else _SKILL_TOOL_ACCESS
|
|
135
133
|
)
|
|
136
134
|
header = _SKILLS_HEADER.format(access_method=access_method)
|
|
137
|
-
|
|
135
|
+
return header + "\n".join(
|
|
138
136
|
skill_block(name, frontmatter["description"])
|
|
139
137
|
for name, _dir, frontmatter in skills
|
|
140
138
|
)
|
|
141
139
|
|
|
142
|
-
if settings.enable_tool_search:
|
|
143
|
-
instructions += TOOL_DISCOVERY_INSTRUCTIONS.format(
|
|
144
|
-
pinned=", ".join(DEFAULT_PINNED_TOOLS)
|
|
145
|
-
)
|
|
146
|
-
|
|
147
|
-
return instructions
|
|
148
140
|
|
|
141
|
+
def compose_instructions(
|
|
142
|
+
skills: str | None, settings: Settings, *, tool_search: bool
|
|
143
|
+
) -> str:
|
|
144
|
+
"""Join the skills section with the startup notices and the owner's text.
|
|
149
145
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
146
|
+
``tool_search`` is the connection's catalog mode, so one server sends
|
|
147
|
+
the discovery note only to the connections that get the search tools.
|
|
148
|
+
"""
|
|
149
|
+
discovery = (
|
|
150
|
+
TOOL_DISCOVERY_INSTRUCTIONS.format(pinned=", ".join(DEFAULT_PINNED_TOOLS))
|
|
151
|
+
if tool_search
|
|
152
|
+
else ""
|
|
153
|
+
)
|
|
154
|
+
lead = (skills or "") + discovery
|
|
155
|
+
sections = [lead.lstrip("\n")] if lead else []
|
|
153
156
|
# Surface Read Only Mode in the startup instructions so clients
|
|
154
157
|
# that show server instructions warn the model up front. Startup
|
|
155
158
|
# state only — live flips are covered by the structured
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"""Per-endpoint tool catalog selection.
|
|
2
|
+
|
|
3
|
+
``ENABLE_TOOL_SEARCH`` (off by default) sets the catalog of the main
|
|
4
|
+
endpoint. A single ha-mcp instance is often shared by several MCP clients
|
|
5
|
+
with different needs: one with its own deferred tool search wants the full
|
|
6
|
+
catalog, a small-context client wants ha-mcp's search tools. Each URL
|
|
7
|
+
therefore serves one fixed catalog:
|
|
8
|
+
|
|
9
|
+
- ``<path>`` follows ``ENABLE_TOOL_SEARCH``;
|
|
10
|
+
- ``<path>/catalog/full`` always serves the full catalog;
|
|
11
|
+
- ``<path>/catalog/search`` always serves the search tools.
|
|
12
|
+
|
|
13
|
+
Either suffix may follow ``/readonly``. The catalog is fixed per URL, not
|
|
14
|
+
negotiated per request, because clients do not refresh their tool list
|
|
15
|
+
when it changes: a client picks its catalog by the URL it is given.
|
|
16
|
+
|
|
17
|
+
Stdio serves one client per process, so its environment selects the mode.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
from collections.abc import Callable, Iterator, Mapping
|
|
23
|
+
from contextlib import contextmanager
|
|
24
|
+
from contextvars import ContextVar
|
|
25
|
+
from typing import TYPE_CHECKING, Any, Literal
|
|
26
|
+
|
|
27
|
+
from ha_mcp._vendor import mcp_types as mt
|
|
28
|
+
from ha_mcp._vendor.fastmcp.server.middleware.middleware import (
|
|
29
|
+
CallNext,
|
|
30
|
+
Middleware,
|
|
31
|
+
MiddlewareContext,
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
from .config import get_global_settings
|
|
35
|
+
|
|
36
|
+
if TYPE_CHECKING:
|
|
37
|
+
from ha_mcp._vendor.fastmcp import FastMCP
|
|
38
|
+
|
|
39
|
+
CatalogMode = Literal["full", "search"]
|
|
40
|
+
CATALOG_MODES: tuple[CatalogMode, ...] = ("full", "search")
|
|
41
|
+
|
|
42
|
+
_endpoint_mode: ContextVar[CatalogMode | None] = ContextVar(
|
|
43
|
+
"ha_mcp_endpoint_catalog_mode", default=None
|
|
44
|
+
)
|
|
45
|
+
# False while the search transform cannot be installed: every endpoint then
|
|
46
|
+
# serves, and describes, the full catalog. Set by each server it builds, so
|
|
47
|
+
# a later server in the process (the component restarts in place) resets it.
|
|
48
|
+
_search_available = True
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def set_search_available(available: bool) -> None:
|
|
52
|
+
"""Record whether this process's server installed the search transform."""
|
|
53
|
+
global _search_available
|
|
54
|
+
_search_available = available
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def default_catalog_mode() -> CatalogMode:
|
|
58
|
+
"""The main endpoint's mode, set by ``ENABLE_TOOL_SEARCH``."""
|
|
59
|
+
if _search_available and get_global_settings().enable_tool_search:
|
|
60
|
+
return "search"
|
|
61
|
+
return "full"
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def current_catalog_mode() -> CatalogMode:
|
|
65
|
+
"""The catalog mode of the endpoint serving this request."""
|
|
66
|
+
if not _search_available:
|
|
67
|
+
return "full"
|
|
68
|
+
return _endpoint_mode.get() or default_catalog_mode()
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def tool_search_active() -> bool:
|
|
72
|
+
"""Whether this request's endpoint serves search-based tool discovery."""
|
|
73
|
+
return current_catalog_mode() == "search"
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
@contextmanager
|
|
77
|
+
def catalog_endpoint(mode: CatalogMode) -> Iterator[None]:
|
|
78
|
+
"""Select ``mode`` for this request and its nested tool calls."""
|
|
79
|
+
token = _endpoint_mode.set(mode)
|
|
80
|
+
try:
|
|
81
|
+
yield
|
|
82
|
+
finally:
|
|
83
|
+
_endpoint_mode.reset(token)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
class ToolCatalogInstructionsMiddleware(Middleware):
|
|
87
|
+
"""Send each connection the server instructions for its endpoint's catalog.
|
|
88
|
+
|
|
89
|
+
``initialize`` (protocol <= 2025-11-25) and ``server/discover``
|
|
90
|
+
(2026-07-28) both carry the instructions.
|
|
91
|
+
"""
|
|
92
|
+
|
|
93
|
+
def __init__(self, instructions_for: Callable[[CatalogMode], str]) -> None:
|
|
94
|
+
self._instructions_for = instructions_for
|
|
95
|
+
|
|
96
|
+
async def on_initialize(
|
|
97
|
+
self,
|
|
98
|
+
context: MiddlewareContext[mt.InitializeRequest],
|
|
99
|
+
call_next: CallNext[mt.InitializeRequest, mt.InitializeResult | None],
|
|
100
|
+
) -> mt.InitializeResult | None:
|
|
101
|
+
result = await call_next(context)
|
|
102
|
+
if result is None:
|
|
103
|
+
return None
|
|
104
|
+
return result.model_copy(
|
|
105
|
+
update={"instructions": self._instructions_for(current_catalog_mode())}
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
async def on_discover(
|
|
109
|
+
self,
|
|
110
|
+
context: MiddlewareContext[mt.DiscoverRequest],
|
|
111
|
+
call_next: CallNext[mt.DiscoverRequest, mt.DiscoverResult | dict[str, Any]],
|
|
112
|
+
) -> mt.DiscoverResult | dict[str, Any]:
|
|
113
|
+
result = await call_next(context)
|
|
114
|
+
if not isinstance(result, mt.DiscoverResult):
|
|
115
|
+
return result
|
|
116
|
+
return result.model_copy(
|
|
117
|
+
update={"instructions": self._instructions_for(current_catalog_mode())}
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def install_catalog_instructions(
|
|
122
|
+
mcp: FastMCP, instructions: Mapping[CatalogMode, str]
|
|
123
|
+
) -> None:
|
|
124
|
+
"""Send each connection the instructions for its endpoint's catalog."""
|
|
125
|
+
mcp.add_middleware(ToolCatalogInstructionsMiddleware(instructions.__getitem__))
|
|
@@ -6,6 +6,7 @@ from typing import Any
|
|
|
6
6
|
from ..config import Settings
|
|
7
7
|
from ..settings_ui import _persistence
|
|
8
8
|
from ..settings_ui._tools_meta import ignored_disabled_tools, tool_config_warnings
|
|
9
|
+
from ..tool_catalog import current_catalog_mode
|
|
9
10
|
|
|
10
11
|
logger = logging.getLogger(__name__)
|
|
11
12
|
|
|
@@ -46,6 +47,8 @@ def collect_config_toggles(settings: Settings) -> dict[str, Any]:
|
|
|
46
47
|
isinstance(custom, str) and custom.strip()
|
|
47
48
|
)
|
|
48
49
|
|
|
50
|
+
# The catalog this connection serves; its URL can override enable_tool_search.
|
|
51
|
+
toggles["connection_catalog"] = current_catalog_mode()
|
|
49
52
|
toggles.update(_tool_config_diagnostics(settings))
|
|
50
53
|
return toggles
|
|
51
54
|
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"""FastMCP middleware: actionable error for stale tool-search proxy/search calls.
|
|
2
|
+
|
|
3
|
+
On a connection serving the full catalog (see ``ha_mcp.tool_catalog``), the
|
|
4
|
+
synthetic tool-search tools — ``ha_search_tools`` and the
|
|
5
|
+
``ha_call_{read,write,delete}_tool`` proxies — do not resolve. If a
|
|
6
|
+
client calls one of them anyway, FastMCP raises a bare ``NotFoundError``
|
|
7
|
+
("Unknown tool: 'ha_search_tools'") with no recovery guidance.
|
|
8
|
+
|
|
9
|
+
Two things cause that call: the client caches a tool list it fetched from a
|
|
10
|
+
search-catalog connection, or the agent learned the names from another
|
|
11
|
+
ha-mcp server it is connected to (for example a ``/catalog/search`` URL
|
|
12
|
+
alongside a ``/catalog/full`` one). Restarting the app (add-on) or Home
|
|
13
|
+
Assistant fixes neither: the stale list lives in the client.
|
|
14
|
+
|
|
15
|
+
This middleware intercepts that one case and replaces the opaque "Unknown tool"
|
|
16
|
+
with a structured error naming the connection's catalog and both causes. It
|
|
17
|
+
only acts on a *top-level* resolution miss for one of those four names on a
|
|
18
|
+
full-catalog connection; in every other case — including a ``NotFoundError``
|
|
19
|
+
bubbling up from inside an executing tool — the original error propagates
|
|
20
|
+
unchanged.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
from __future__ import annotations
|
|
24
|
+
|
|
25
|
+
import logging
|
|
26
|
+
from typing import Any
|
|
27
|
+
|
|
28
|
+
from ha_mcp._vendor.fastmcp.exceptions import NotFoundError
|
|
29
|
+
from ha_mcp._vendor.fastmcp.server.middleware.middleware import (
|
|
30
|
+
CallNext,
|
|
31
|
+
Middleware,
|
|
32
|
+
MiddlewareContext,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
from ..errors import ErrorCode, create_error_response
|
|
36
|
+
from ..policy.middleware import PROXY_META_TOOLS
|
|
37
|
+
from ..tool_catalog import tool_search_active
|
|
38
|
+
from .helpers import raise_tool_error
|
|
39
|
+
|
|
40
|
+
logger = logging.getLogger(__name__)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class ToolSearchHintMiddleware(Middleware):
|
|
44
|
+
"""Turn the opaque "Unknown tool" for tool-search synthetic tools into a
|
|
45
|
+
stale-tool-list hint on a full-catalog connection."""
|
|
46
|
+
|
|
47
|
+
async def on_call_tool(
|
|
48
|
+
self, context: MiddlewareContext, call_next: CallNext
|
|
49
|
+
) -> Any:
|
|
50
|
+
try:
|
|
51
|
+
return await call_next(context)
|
|
52
|
+
except NotFoundError as exc:
|
|
53
|
+
name = context.message.name
|
|
54
|
+
# Only rewrite a TOP-LEVEL "Unknown tool" miss for one of the four
|
|
55
|
+
# tool-search synthetic names on a full-catalog connection:
|
|
56
|
+
# - match the dispatch-layer message so a NotFoundError bubbling up
|
|
57
|
+
# from INSIDE an executing tool (a different name) is never
|
|
58
|
+
# mislabeled as a stale cache; on any wording change this simply
|
|
59
|
+
# fails closed and re-raises the original error.
|
|
60
|
+
# - require the full catalog (on a search connection the names
|
|
61
|
+
# resolve, so a miss is a different, real problem to not mask).
|
|
62
|
+
top_level_miss = str(exc) == f"Unknown tool: {name!r}"
|
|
63
|
+
if top_level_miss and name in PROXY_META_TOOLS and not tool_search_active():
|
|
64
|
+
logger.info(
|
|
65
|
+
"Stale tool-search call for %r on a full-catalog connection "
|
|
66
|
+
"- returning refresh-your-tool-list hint",
|
|
67
|
+
name,
|
|
68
|
+
)
|
|
69
|
+
raise_tool_error(
|
|
70
|
+
create_error_response(
|
|
71
|
+
code=ErrorCode.RESOURCE_NOT_FOUND,
|
|
72
|
+
message=(
|
|
73
|
+
f"'{name}' exists only on a connection serving the "
|
|
74
|
+
"search catalog, and this connection serves the full "
|
|
75
|
+
"catalog, so every tool is available directly by name. "
|
|
76
|
+
"Either your MCP client is showing a cached tool list "
|
|
77
|
+
"from a search-catalog connection, or the name comes "
|
|
78
|
+
"from another ha-mcp server you are connected to (such "
|
|
79
|
+
"as a /catalog/search URL). Restarting the app "
|
|
80
|
+
"(add-on) or Home Assistant does not refresh the "
|
|
81
|
+
"client's cached list."
|
|
82
|
+
),
|
|
83
|
+
suggestions=[
|
|
84
|
+
(
|
|
85
|
+
"Call the tool you need directly by its name on "
|
|
86
|
+
"this connection."
|
|
87
|
+
),
|
|
88
|
+
(
|
|
89
|
+
"If the client lists stale tools, reconnect or "
|
|
90
|
+
"refresh this MCP server to reload its tool list."
|
|
91
|
+
),
|
|
92
|
+
],
|
|
93
|
+
context={"tool_name": name, "catalog": "full"},
|
|
94
|
+
)
|
|
95
|
+
)
|
|
96
|
+
raise
|
|
@@ -79,8 +79,8 @@ _saved_tools: dict[str, dict[str, str]] = {}
|
|
|
79
79
|
|
|
80
80
|
# Tools that sandbox code must not call. Includes ``ha_manage_custom_tool``
|
|
81
81
|
# itself (prevents recursive self-invocation) plus the four synthetics that
|
|
82
|
-
#
|
|
83
|
-
#
|
|
82
|
+
# a search-catalog connection exposes (main URL with ``ENABLE_TOOL_SEARCH``,
|
|
83
|
+
# or ``/catalog/search``): ``ha_search_tools``, ``ha_call_*_tool``. Without those
|
|
84
84
|
# four entries, sandbox code could "launder" a recursive call as
|
|
85
85
|
# ``call_tool("ha_call_write_tool", {"name": "ha_manage_custom_tool", ...})``
|
|
86
86
|
# — the proxy would then dispatch the underlying tool and the in-sandbox
|