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