ha-mcp-dev 9.0.0.dev3224__tar.gz → 9.0.1.dev3231__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 (815) hide show
  1. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/PKG-INFO +1 -1
  2. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/pyproject.toml +1 -1
  3. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/pyproject.toml.orig +1 -1
  4. ha_mcp_dev-9.0.1.dev3231/src/ha_mcp/mcp_client_context.py +164 -0
  5. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/policy/middleware.py +117 -14
  6. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/policy/mrtr.py +114 -13
  7. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/server.py +5 -25
  8. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/bug_report_templates.py +17 -2
  9. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/search/overview.py +4 -2
  10. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_bug_report.py +11 -68
  11. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_search.py +12 -3
  12. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/utils/skill_loader.py +24 -0
  13. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/LICENSE +0 -0
  14. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/README.md +0 -0
  15. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/__init__.py +0 -0
  16. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/__main__.py +0 -0
  17. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_pypi_marker +0 -0
  18. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_rich_compat.py +0 -0
  19. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/__init__.py +0 -0
  20. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/LICENSE +0 -0
  21. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/MANIFEST.sha256 +0 -0
  22. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/REQUIRES.txt +0 -0
  23. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/VENDORED +0 -0
  24. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/__init__.py +0 -0
  25. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/_compat.py +0 -0
  26. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/_install_hints.py +0 -0
  27. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/_warnings.py +0 -0
  28. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/apps/__init__.py +0 -0
  29. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/apps/app.py +0 -0
  30. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/apps/approval.py +0 -0
  31. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/apps/choice.py +0 -0
  32. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/apps/config.py +0 -0
  33. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/apps/file_upload.py +0 -0
  34. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/apps/form.py +0 -0
  35. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/apps/generative.py +0 -0
  36. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/cli/__init__.py +0 -0
  37. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/cli/__main__.py +0 -0
  38. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev.py +0 -0
  39. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/cli/apps_dev_security.py +0 -0
  40. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/cli/auth.py +0 -0
  41. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/cli/cimd.py +0 -0
  42. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/cli/cli.py +0 -0
  43. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/cli/client.py +0 -0
  44. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/cli/deploy/__init__.py +0 -0
  45. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/cli/deploy/authentication.py +0 -0
  46. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/cli/deploy/command.py +0 -0
  47. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/cli/deploy/configuration.py +0 -0
  48. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/cli/deploy/credentials.py +0 -0
  49. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/cli/deploy/horizon_client.py +0 -0
  50. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/cli/deploy/output.py +0 -0
  51. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/cli/deploy/state.py +0 -0
  52. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/cli/discovery.py +0 -0
  53. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/cli/generate.py +0 -0
  54. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/cli/install/__init__.py +0 -0
  55. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_code.py +0 -0
  56. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/cli/install/claude_desktop.py +0 -0
  57. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/cli/install/cursor.py +0 -0
  58. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/cli/install/gemini_cli.py +0 -0
  59. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/cli/install/goose.py +0 -0
  60. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/cli/install/mcp_json.py +0 -0
  61. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/cli/install/shared.py +0 -0
  62. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/cli/install/stdio.py +0 -0
  63. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/cli/run.py +0 -0
  64. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/client/__init__.py +0 -0
  65. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/client/_sdk_context_shim.py +0 -0
  66. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/client/auth/__init__.py +0 -0
  67. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/client/auth/bearer.py +0 -0
  68. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/client/auth/client_credentials.py +0 -0
  69. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/client/auth/oauth.py +0 -0
  70. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/client/caching.py +0 -0
  71. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/client/client.py +0 -0
  72. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/client/dependencies.py +0 -0
  73. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/client/elicitation.py +0 -0
  74. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/client/extension_hooks.py +0 -0
  75. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/client/group.py +0 -0
  76. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/client/logging.py +0 -0
  77. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/client/messages.py +0 -0
  78. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/client/mixins/__init__.py +0 -0
  79. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/client/mixins/prompts.py +0 -0
  80. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/client/mixins/resources.py +0 -0
  81. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/client/mixins/skills.py +0 -0
  82. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/client/mixins/tools.py +0 -0
  83. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/client/oauth_callback.py +0 -0
  84. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/client/progress.py +0 -0
  85. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/client/roots.py +0 -0
  86. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/client/sampling/__init__.py +0 -0
  87. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/__init__.py +0 -0
  88. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/anthropic.py +0 -0
  89. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/google_genai.py +0 -0
  90. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/client/sampling/handlers/openai.py +0 -0
  91. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/client/telemetry.py +0 -0
  92. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/client/transports/__init__.py +0 -0
  93. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/client/transports/base.py +0 -0
  94. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/client/transports/config.py +0 -0
  95. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/client/transports/http.py +0 -0
  96. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/client/transports/inference.py +0 -0
  97. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/client/transports/memory.py +0 -0
  98. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/client/transports/sse.py +0 -0
  99. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/client/transports/stdio.py +0 -0
  100. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/contrib/README.md +0 -0
  101. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/README.md +0 -0
  102. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/__init__.py +0 -0
  103. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/bulk_tool_caller.py +0 -0
  104. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/contrib/bulk_tool_caller/example.py +0 -0
  105. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/README.md +0 -0
  106. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/__init__.py +0 -0
  107. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/component_manager.py +0 -0
  108. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/contrib/component_manager/example.py +0 -0
  109. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/README.md +0 -0
  110. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/__init__.py +0 -0
  111. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/example.py +0 -0
  112. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/contrib/mcp_mixin/mcp_mixin.py +0 -0
  113. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/decorators.py +0 -0
  114. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/dependencies.py +0 -0
  115. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/exceptions.py +0 -0
  116. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/experimental/__init__.py +0 -0
  117. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/__init__.py +0 -0
  118. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/code_mode.py +0 -0
  119. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/experimental/transforms/jev_search.py +0 -0
  120. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/mcp_config.py +0 -0
  121. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/prompts/__init__.py +0 -0
  122. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/prompts/base.py +0 -0
  123. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/prompts/function_prompt.py +0 -0
  124. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/py.typed +0 -0
  125. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/resources/__init__.py +0 -0
  126. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/resources/base.py +0 -0
  127. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/resources/function_resource.py +0 -0
  128. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/resources/security.py +0 -0
  129. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/resources/template.py +0 -0
  130. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/resources/types.py +0 -0
  131. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/__init__.py +0 -0
  132. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/__init__.py +0 -0
  133. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/auth.py +0 -0
  134. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/cimd.py +0 -0
  135. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/__init__.py +0 -0
  136. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/handlers/authorize.py +0 -0
  137. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/identity_assertion.py +0 -0
  138. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/jwt_issuer.py +0 -0
  139. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/middleware.py +0 -0
  140. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/__init__.py +0 -0
  141. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/consent.py +0 -0
  142. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/models.py +0 -0
  143. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/proxy.py +0 -0
  144. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/ui.py +0 -0
  145. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/oauth_proxy/upstream.py +0 -0
  146. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/oidc_proxy.py +0 -0
  147. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/__init__.py +0 -0
  148. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/auth0.py +0 -0
  149. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/aws.py +0 -0
  150. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/azure.py +0 -0
  151. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/clerk.py +0 -0
  152. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/debug.py +0 -0
  153. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/descope.py +0 -0
  154. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/discord.py +0 -0
  155. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/github.py +0 -0
  156. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/google.py +0 -0
  157. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/huggingface.py +0 -0
  158. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/in_memory.py +0 -0
  159. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/introspection.py +0 -0
  160. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/jwt.py +0 -0
  161. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/keycloak.py +0 -0
  162. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/oci.py +0 -0
  163. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/propelauth.py +0 -0
  164. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/scalekit.py +0 -0
  165. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/supabase.py +0 -0
  166. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/providers/workos.py +0 -0
  167. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/redirect_validation.py +0 -0
  168. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/auth/ssrf.py +0 -0
  169. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/caching.py +0 -0
  170. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/completions.py +0 -0
  171. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/context.py +0 -0
  172. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/dependencies.py +0 -0
  173. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/elicitation.py +0 -0
  174. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/event_store.py +0 -0
  175. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/extensions.py +0 -0
  176. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/http.py +0 -0
  177. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/lifespan.py +0 -0
  178. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/low_level.py +0 -0
  179. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/middleware/__init__.py +0 -0
  180. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/middleware/authorization.py +0 -0
  181. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/middleware/caching.py +0 -0
  182. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/middleware/dereference.py +0 -0
  183. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/middleware/error_handling.py +0 -0
  184. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/middleware/logging.py +0 -0
  185. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/middleware/middleware.py +0 -0
  186. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/middleware/ping.py +0 -0
  187. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/middleware/rate_limiting.py +0 -0
  188. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/middleware/response_limiting.py +0 -0
  189. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/middleware/timing.py +0 -0
  190. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/middleware/tool_injection.py +0 -0
  191. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/mixins/__init__.py +0 -0
  192. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/mixins/extensions.py +0 -0
  193. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/mixins/lifespan.py +0 -0
  194. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/mixins/mcp_operations.py +0 -0
  195. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/mixins/transport.py +0 -0
  196. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/providers/__init__.py +0 -0
  197. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/providers/addressing.py +0 -0
  198. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/providers/aggregate.py +0 -0
  199. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/providers/base.py +0 -0
  200. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/providers/fastmcp_provider.py +0 -0
  201. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem.py +0 -0
  202. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/providers/filesystem_discovery.py +0 -0
  203. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/__init__.py +0 -0
  204. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/__init__.py +0 -0
  205. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/prompts.py +0 -0
  206. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/resources.py +0 -0
  207. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/decorators/tools.py +0 -0
  208. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/providers/local_provider/local_provider.py +0 -0
  209. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/README.md +0 -0
  210. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/__init__.py +0 -0
  211. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/components.py +0 -0
  212. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/provider.py +0 -0
  213. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/providers/openapi/routing.py +0 -0
  214. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_payload.py +0 -0
  215. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/providers/prefab_synthesis.py +0 -0
  216. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/providers/proxy.py +0 -0
  217. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/__init__.py +0 -0
  218. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/_common.py +0 -0
  219. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/claude_provider.py +0 -0
  220. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/directory_provider.py +0 -0
  221. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/skill_provider.py +0 -0
  222. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/providers/skills/vendor_providers.py +0 -0
  223. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/providers/wrapped_provider.py +0 -0
  224. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/server.py +0 -0
  225. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/session_scoped_event_store.py +0 -0
  226. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/sessions.py +0 -0
  227. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/telemetry.py +0 -0
  228. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/transforms/__init__.py +0 -0
  229. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/transforms/catalog.py +0 -0
  230. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/transforms/namespace.py +0 -0
  231. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/transforms/prompts_as_tools.py +0 -0
  232. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/transforms/resources_as_tools.py +0 -0
  233. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/__init__.py +0 -0
  234. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/base.py +0 -0
  235. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/bm25.py +0 -0
  236. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/transforms/search/regex.py +0 -0
  237. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/transforms/tool_transform.py +0 -0
  238. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/transforms/version_filter.py +0 -0
  239. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/server/transforms/visibility.py +0 -0
  240. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/settings.py +0 -0
  241. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/skills/__init__.py +0 -0
  242. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/skills/_constants.py +0 -0
  243. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/skills/_resources.py +0 -0
  244. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/skills/_snapshot.py +0 -0
  245. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/skills/_source.py +0 -0
  246. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/skills/client.py +0 -0
  247. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/skills/extension.py +0 -0
  248. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/skills/models.py +0 -0
  249. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/telemetry.py +0 -0
  250. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/tools/__init__.py +0 -0
  251. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/tools/base.py +0 -0
  252. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/tools/function_parsing.py +0 -0
  253. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/tools/function_tool.py +0 -0
  254. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/tools/tool_transform.py +0 -0
  255. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/types.py +0 -0
  256. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/__init__.py +0 -0
  257. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/asgi_transport.py +0 -0
  258. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/async_utils.py +0 -0
  259. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/auth.py +0 -0
  260. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/authorization.py +0 -0
  261. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/cli.py +0 -0
  262. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/components.py +0 -0
  263. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/docstring_parsing.py +0 -0
  264. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/exceptions.py +0 -0
  265. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/http.py +0 -0
  266. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/inspect.py +0 -0
  267. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema.py +0 -0
  268. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/json_schema_type.py +0 -0
  269. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/lifespan.py +0 -0
  270. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/logging.py +0 -0
  271. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/__init__.py +0 -0
  272. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/__init__.py +0 -0
  273. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/__init__.py +0 -0
  274. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/base.py +0 -0
  275. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/environments/uv.py +0 -0
  276. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/mcp_server_config.py +0 -0
  277. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/schema.json +0 -0
  278. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/__init__.py +0 -0
  279. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/base.py +0 -0
  280. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/mcp_server_config/v1/sources/filesystem.py +0 -0
  281. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/mime.py +0 -0
  282. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/README.md +0 -0
  283. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/__init__.py +0 -0
  284. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/director.py +0 -0
  285. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/formatters.py +0 -0
  286. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/json_schema_converter.py +0 -0
  287. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/models.py +0 -0
  288. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/parser.py +0 -0
  289. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/openapi/schemas.py +0 -0
  290. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/pagination.py +0 -0
  291. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/prefab.py +0 -0
  292. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/skills.py +0 -0
  293. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/tasks.py +0 -0
  294. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/tests.py +0 -0
  295. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/timeout.py +0 -0
  296. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/token_cache.py +0 -0
  297. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/types.py +0 -0
  298. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/ui.py +0 -0
  299. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/version_check.py +0 -0
  300. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/fastmcp/utilities/versions.py +0 -0
  301. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/LICENSE +0 -0
  302. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/MANIFEST.sha256 +0 -0
  303. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/REQUIRES.txt +0 -0
  304. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/VENDORED +0 -0
  305. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/__init__.py +0 -0
  306. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/cli/__init__.py +0 -0
  307. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/cli/claude.py +0 -0
  308. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/cli/cli.py +0 -0
  309. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/client/__init__.py +0 -0
  310. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/client/__main__.py +0 -0
  311. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/client/_input_required.py +0 -0
  312. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/client/_memory.py +0 -0
  313. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/client/_probe.py +0 -0
  314. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/client/_transport.py +0 -0
  315. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/client/auth/__init__.py +0 -0
  316. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/client/auth/exceptions.py +0 -0
  317. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/client/auth/extensions/__init__.py +0 -0
  318. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/client/auth/extensions/client_credentials.py +0 -0
  319. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/client/auth/extensions/identity_assertion.py +0 -0
  320. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/client/auth/oauth2.py +0 -0
  321. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/client/auth/utils.py +0 -0
  322. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/client/caching.py +0 -0
  323. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/client/client.py +0 -0
  324. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/client/context.py +0 -0
  325. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/client/extension.py +0 -0
  326. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/client/session.py +0 -0
  327. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/client/session_group.py +0 -0
  328. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/client/sse.py +0 -0
  329. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/client/stdio.py +0 -0
  330. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/client/streamable_http.py +0 -0
  331. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/client/subscriptions.py +0 -0
  332. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/os/__init__.py +0 -0
  333. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/os/posix/__init__.py +0 -0
  334. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/os/posix/utilities.py +0 -0
  335. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/os/win32/__init__.py +0 -0
  336. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/os/win32/utilities.py +0 -0
  337. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/py.typed +0 -0
  338. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/__init__.py +0 -0
  339. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/__main__.py +0 -0
  340. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/_otel.py +0 -0
  341. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/_streamable_http_modern.py +0 -0
  342. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/apps.py +0 -0
  343. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/auth/__init__.py +0 -0
  344. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/auth/errors.py +0 -0
  345. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/auth/handlers/__init__.py +0 -0
  346. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/auth/handlers/authorize.py +0 -0
  347. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/auth/handlers/metadata.py +0 -0
  348. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/auth/handlers/register.py +0 -0
  349. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/auth/handlers/revoke.py +0 -0
  350. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/auth/handlers/token.py +0 -0
  351. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/auth/json_response.py +0 -0
  352. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/auth/middleware/__init__.py +0 -0
  353. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/auth/middleware/auth_context.py +0 -0
  354. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/auth/middleware/bearer_auth.py +0 -0
  355. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/auth/middleware/client_auth.py +0 -0
  356. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/auth/provider.py +0 -0
  357. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/auth/routes.py +0 -0
  358. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/auth/settings.py +0 -0
  359. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/caching.py +0 -0
  360. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/connection.py +0 -0
  361. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/context.py +0 -0
  362. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/elicitation.py +0 -0
  363. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/extension.py +0 -0
  364. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/fastmcp.py +0 -0
  365. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/lowlevel/__init__.py +0 -0
  366. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/lowlevel/helper_types.py +0 -0
  367. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/lowlevel/server.py +0 -0
  368. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/mcpserver/__init__.py +0 -0
  369. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/mcpserver/context.py +0 -0
  370. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/mcpserver/exceptions.py +0 -0
  371. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/__init__.py +0 -0
  372. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/base.py +0 -0
  373. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/mcpserver/prompts/manager.py +0 -0
  374. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/mcpserver/resolve.py +0 -0
  375. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/__init__.py +0 -0
  376. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/base.py +0 -0
  377. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/resource_manager.py +0 -0
  378. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/templates.py +0 -0
  379. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/mcpserver/resources/types.py +0 -0
  380. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/mcpserver/server.py +0 -0
  381. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/__init__.py +0 -0
  382. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/base.py +0 -0
  383. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/mcpserver/tools/tool_manager.py +0 -0
  384. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/__init__.py +0 -0
  385. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/context_injection.py +0 -0
  386. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/func_metadata.py +0 -0
  387. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/logging.py +0 -0
  388. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/mcpserver/utilities/types.py +0 -0
  389. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/models.py +0 -0
  390. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/request_state.py +0 -0
  391. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/runner.py +0 -0
  392. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/session.py +0 -0
  393. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/sse.py +0 -0
  394. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/stdio.py +0 -0
  395. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/streamable_http.py +0 -0
  396. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/streamable_http_manager.py +0 -0
  397. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/subscriptions.py +0 -0
  398. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/transport_security.py +0 -0
  399. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/server/validation.py +0 -0
  400. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/shared/__init__.py +0 -0
  401. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/shared/_callable_inspection.py +0 -0
  402. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/shared/_compat.py +0 -0
  403. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/shared/_context_streams.py +0 -0
  404. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/shared/_httpx_utils.py +0 -0
  405. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/shared/_otel.py +0 -0
  406. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/shared/_request_clock.py +0 -0
  407. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/shared/_stream_protocols.py +0 -0
  408. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/shared/auth.py +0 -0
  409. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/shared/auth_utils.py +0 -0
  410. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/shared/context.py +0 -0
  411. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/shared/direct_dispatcher.py +0 -0
  412. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/shared/dispatcher.py +0 -0
  413. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/shared/exceptions.py +0 -0
  414. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/shared/extension.py +0 -0
  415. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/shared/inbound.py +0 -0
  416. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/shared/jsonrpc_dispatcher.py +0 -0
  417. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/shared/memory.py +0 -0
  418. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/shared/message.py +0 -0
  419. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/shared/metadata_utils.py +0 -0
  420. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/shared/path_security.py +0 -0
  421. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/shared/peer.py +0 -0
  422. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/shared/subscriptions.py +0 -0
  423. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/shared/tool_name_validation.py +0 -0
  424. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/shared/transport_context.py +0 -0
  425. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/shared/uri_template.py +0 -0
  426. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/types/__init__.py +0 -0
  427. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/types/jsonrpc.py +0 -0
  428. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/types/methods.py +0 -0
  429. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp/types/version.py +0 -0
  430. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp_types/LICENSE +0 -0
  431. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp_types/MANIFEST.sha256 +0 -0
  432. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp_types/REQUIRES.txt +0 -0
  433. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp_types/VENDORED +0 -0
  434. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp_types/__init__.py +0 -0
  435. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp_types/_types.py +0 -0
  436. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp_types/_v2025_11_25/__init__.py +0 -0
  437. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp_types/_v2026_07_28/__init__.py +0 -0
  438. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp_types/_wire_base.py +0 -0
  439. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp_types/jsonrpc.py +0 -0
  440. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp_types/methods.py +0 -0
  441. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp_types/py.typed +0 -0
  442. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/mcp_types/version.py +0 -0
  443. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/requirements.txt +0 -0
  444. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
  445. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
  446. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
  447. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
  448. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
  449. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
  450. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
  451. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
  452. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
  453. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
  454. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
  455. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
  456. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
  457. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/client.py +0 -0
  458. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
  459. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
  460. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
  461. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
  462. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
  463. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
  464. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
  465. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
  466. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
  467. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
  468. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
  469. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
  470. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
  471. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
  472. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
  473. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
  474. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
  475. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
  476. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
  477. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
  478. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
  479. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
  480. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/server.py +0 -0
  481. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
  482. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
  483. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
  484. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
  485. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
  486. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
  487. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
  488. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
  489. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
  490. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
  491. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
  492. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
  493. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
  494. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
  495. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
  496. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
  497. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
  498. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
  499. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_vendor/websockets/version.py +0 -0
  500. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/_version.py +0 -0
  501. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/app_discovery.py +0 -0
  502. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/auth/__init__.py +0 -0
  503. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/auth/consent_form.py +0 -0
  504. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/auth/iss_stamp.py +0 -0
  505. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/auth/oidc_compat.py +0 -0
  506. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/auth/provider.py +0 -0
  507. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/backup_dashboards.py +0 -0
  508. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/backup_diff.py +0 -0
  509. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/backup_entities.py +0 -0
  510. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/backup_entity_ids.py +0 -0
  511. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/backup_helper_target.py +0 -0
  512. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/backup_integrations.py +0 -0
  513. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/backup_manager.py +0 -0
  514. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/backup_tags.py +0 -0
  515. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/backup_zones.py +0 -0
  516. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/browser_landing.py +0 -0
  517. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/client/__init__.py +0 -0
  518. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/client/admin_routes.py +0 -0
  519. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/client/error_log_journald.py +0 -0
  520. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/client/models.py +0 -0
  521. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/client/rest_client.py +0 -0
  522. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/client/supervisor_client.py +0 -0
  523. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/client/websocket_client.py +0 -0
  524. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/client/websocket_listener.py +0 -0
  525. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/config.py +0 -0
  526. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/config_backup.py +0 -0
  527. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/config_meta.py +0 -0
  528. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/config_overrides.py +0 -0
  529. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/config_registry.py +0 -0
  530. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/config_settings.py +0 -0
  531. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  532. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  533. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  534. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  535. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  536. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
  537. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/errors.py +0 -0
  538. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/ha_request_queue.py +0 -0
  539. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/hacs_auto_refresh.py +0 -0
  540. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/http_transport.py +0 -0
  541. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/image_info.py +0 -0
  542. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/llm_exposure.py +0 -0
  543. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/log_filters.py +0 -0
  544. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/policy/__init__.py +0 -0
  545. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/policy/approval_queue.py +0 -0
  546. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/policy/decision_pin.py +0 -0
  547. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/policy/decisions.py +0 -0
  548. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/policy/editing.py +0 -0
  549. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/policy/evaluator.py +0 -0
  550. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/policy/events.py +0 -0
  551. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/policy/handlers.py +0 -0
  552. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/policy/model.py +0 -0
  553. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/policy/persistence.py +0 -0
  554. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/policy/server_channels.py +0 -0
  555. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/policy/value_sources.py +0 -0
  556. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/py.typed +0 -0
  557. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/read_only.py +0 -0
  558. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/redaction.py +0 -0
  559. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/renamed_tools.py +0 -0
  560. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  561. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  562. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  563. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-actions.md +0 -0
  564. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
  565. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  566. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  567. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  568. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  569. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  570. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  571. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  572. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  573. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  574. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  575. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/triggers-and-conditions.md +0 -0
  576. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  577. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/server_instructions.py +0 -0
  578. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/server_lifespan.py +0 -0
  579. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/server_tool_text.py +0 -0
  580. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/__init__.py +0 -0
  581. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
  582. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
  583. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  584. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/_handlers_oauth_callbacks.py +0 -0
  585. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  586. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  587. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  588. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/_i18n.py +0 -0
  589. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
  590. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  591. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  592. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/_theme.py +0 -0
  593. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
  594. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/locales/README.md +0 -0
  595. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/locales/az.json +0 -0
  596. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
  597. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/locales/de.json +0 -0
  598. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/locales/en.json +0 -0
  599. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
  600. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/locales/es.json +0 -0
  601. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
  602. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/locales/it.json +0 -0
  603. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
  604. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
  605. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
  606. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
  607. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
  608. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
  609. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
  610. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/locales/zh-Hant.json +0 -0
  611. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/settings.css +0 -0
  612. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/settings.html +0 -0
  613. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/settings_js/01_i18n_state.js +0 -0
  614. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/settings_js/02_tools_restart.js +0 -0
  615. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/settings_js/03_render_save.js +0 -0
  616. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/settings_js/04_backups.js +0 -0
  617. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/settings_js/05_feature_flags.js +0 -0
  618. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/settings_js/06_policy_cards.js +0 -0
  619. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/settings_js/07_policy_actions.js +0 -0
  620. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/settings_js/08_advanced.js +0 -0
  621. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/settings_js/09_prefs_visibility.js +0 -0
  622. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/settings_ui/settings_js/10_oauth_callbacks.js +0 -0
  623. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/smoke_test.py +0 -0
  624. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  625. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/strict_bps.py +0 -0
  626. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tool_dispatch.py +0 -0
  627. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/__init__.py +0 -0
  628. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/addon_connection_hints.py +0 -0
  629. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/area_messages.py +0 -0
  630. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/auto_backup.py +0 -0
  631. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/backup.py +0 -0
  632. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/backup_access.py +0 -0
  633. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/backup_on_demand.py +0 -0
  634. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/backup_snapshot.py +0 -0
  635. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/backup_snapshot_restore.py +0 -0
  636. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  637. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/best_practice_result.py +0 -0
  638. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/best_practice_variables.py +0 -0
  639. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/blueprint_sources.py +0 -0
  640. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
  641. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/blueprint_write.py +0 -0
  642. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/bug_report_config.py +0 -0
  643. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/bulk_selector.py +0 -0
  644. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/coercion.py +0 -0
  645. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/component_api.py +0 -0
  646. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/component_config_entries.py +0 -0
  647. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/component_config_reads.py +0 -0
  648. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/component_dashboard_edit.py +0 -0
  649. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/component_devices.py +0 -0
  650. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/component_helper_collections.py +0 -0
  651. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/component_registries.py +0 -0
  652. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
  653. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/config_entry_backup.py +0 -0
  654. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  655. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
  656. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/config_entry_flow_introspect.py +0 -0
  657. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
  658. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
  659. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/config_entry_identity.py +0 -0
  660. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
  661. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
  662. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/config_file_visibility.py +0 -0
  663. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/config_helpers/__init__.py +0 -0
  664. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/config_helpers/core_payload.py +0 -0
  665. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/config_helpers/create.py +0 -0
  666. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/config_helpers/describe.py +0 -0
  667. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/config_helpers/flow.py +0 -0
  668. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/config_helpers/icon_route.py +0 -0
  669. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/config_helpers/listing.py +0 -0
  670. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/config_helpers/registry.py +0 -0
  671. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/config_helpers/schemas.py +0 -0
  672. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/config_helpers/typed_config.py +0 -0
  673. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/config_helpers/update.py +0 -0
  674. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/config_helpers/validation.py +0 -0
  675. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/config_subentry_restore.py +0 -0
  676. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/config_write_errors.py +0 -0
  677. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/config_write_helpers.py +0 -0
  678. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/core_contract.py +0 -0
  679. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/dashboard_card_describe.py +0 -0
  680. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/dashboard_edit_errors.py +0 -0
  681. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/dashboard_list_checks.py +0 -0
  682. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/dev_backup.py +0 -0
  683. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/device_control.py +0 -0
  684. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/device_enrichment.py +0 -0
  685. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/diagnostics_helpers.py +0 -0
  686. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/energy_preferences.py +0 -0
  687. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/entity_param_parsing.py +0 -0
  688. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/entity_registration.py +0 -0
  689. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/entity_removal.py +0 -0
  690. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/entity_update_fields.py +0 -0
  691. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/error_log_parsing.py +0 -0
  692. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/flow_helper_lookup.py +0 -0
  693. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/hacs_registration.py +0 -0
  694. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/helper_flows.py +0 -0
  695. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/helpers.py +0 -0
  696. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/history_response.py +0 -0
  697. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/integration_entry_state.py +0 -0
  698. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
  699. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/log_common.py +0 -0
  700. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/log_sources.py +0 -0
  701. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/log_sources_fault.py +0 -0
  702. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/log_sources_logbook.py +0 -0
  703. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
  704. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/radio/__init__.py +0 -0
  705. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/radio/base.py +0 -0
  706. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/radio/matter.py +0 -0
  707. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/radio/thread.py +0 -0
  708. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  709. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/radio/zwave.py +0 -0
  710. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/radio/zwave_parameters.py +0 -0
  711. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/recorder_errors.py +0 -0
  712. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/reference_validator.py +0 -0
  713. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/registry.py +0 -0
  714. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
  715. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/response_helpers.py +0 -0
  716. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/scene_discovery.py +0 -0
  717. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/search/__init__.py +0 -0
  718. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/search/base.py +0 -0
  719. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/search/component.py +0 -0
  720. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/search/entities.py +0 -0
  721. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/search/legacy.py +0 -0
  722. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/search/modes.py +0 -0
  723. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/search/response.py +0 -0
  724. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/search/state.py +0 -0
  725. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/server_version.py +0 -0
  726. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  727. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  728. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  729. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  730. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  731. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  732. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
  733. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  734. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  735. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  736. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/statistics_calendar.py +0 -0
  737. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/statistics_helpers.py +0 -0
  738. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/statistics_resets.py +0 -0
  739. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/system_restart.py +0 -0
  740. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tool_hints.py +0 -0
  741. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  742. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_addons.py +0 -0
  743. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_areas.py +0 -0
  744. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
  745. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  746. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_calendar.py +0 -0
  747. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_camera.py +0 -0
  748. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_categories.py +0 -0
  749. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_code.py +0 -0
  750. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  751. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  752. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  753. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  754. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  755. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  756. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_dev.py +0 -0
  757. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_energy.py +0 -0
  758. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_entities.py +0 -0
  759. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  760. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_groups.py +0 -0
  761. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_hacs.py +0 -0
  762. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_history.py +0 -0
  763. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_integrations.py +0 -0
  764. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_labels.py +0 -0
  765. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_logs.py +0 -0
  766. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_radio.py +0 -0
  767. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_registry.py +0 -0
  768. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_resources.py +0 -0
  769. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_security_policy.py +0 -0
  770. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_service.py +0 -0
  771. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_services.py +0 -0
  772. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_system.py +0 -0
  773. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_themes.py +0 -0
  774. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_todo.py +0 -0
  775. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_traces.py +0 -0
  776. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_updates.py +0 -0
  777. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_utility.py +0 -0
  778. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  779. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  780. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
  781. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/tools_zones.py +0 -0
  782. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/util_helpers.py +0 -0
  783. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/validation_middleware.py +0 -0
  784. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/tools/ws_waiters.py +0 -0
  785. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/transforms/__init__.py +0 -0
  786. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/transforms/categorized_search.py +0 -0
  787. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/transforms/compact_params.py +0 -0
  788. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/transforms/component_helpers.py +0 -0
  789. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/transforms/component_search.py +0 -0
  790. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  791. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/transforms/write_tool_note.py +0 -0
  792. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/transport_security.py +0 -0
  793. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/update_check.py +0 -0
  794. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/utils/__init__.py +0 -0
  795. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/utils/config_hash.py +0 -0
  796. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/utils/config_write_lock.py +0 -0
  797. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/utils/dashboard_patch.py +0 -0
  798. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/utils/data_paths.py +0 -0
  799. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
  800. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/utils/domain_handlers.py +0 -0
  801. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/utils/entity_membership.py +0 -0
  802. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  803. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  804. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/utils/mcp_client_host.py +0 -0
  805. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/utils/operation_manager.py +0 -0
  806. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/utils/python_sandbox.py +0 -0
  807. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/utils/registry_update_lock.py +0 -0
  808. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/utils/usage_logger.py +0 -0
  809. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/visibility/__init__.py +0 -0
  810. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/visibility/config_files.py +0 -0
  811. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/visibility/enforcement.py +0 -0
  812. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/visibility/identifier_aliases.py +0 -0
  813. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/visibility/model.py +0 -0
  814. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/visibility/persistence.py +0 -0
  815. {ha_mcp_dev-9.0.0.dev3224 → ha_mcp_dev-9.0.1.dev3231}/src/ha_mcp/visibility/resolver.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 9.0.0.dev3224
3
+ Version: 9.0.1.dev3231
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
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "9.0.0.dev3224"
7
+ version = "9.0.1.dev3231"
8
8
  description = "Home Assistant MCP Server - Complete control of Home Assistant through MCP"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13,<3.15"
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "9.0.0.dev3224"
7
+ version = "9.0.1.dev3231"
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
@@ -0,0 +1,164 @@
1
+ """What the connected MCP client said about itself on the current request.
2
+
3
+ Handshake-era clients (through 2025-11-25) send their client info and
4
+ capabilities once, in ``initialize``. On 2026-07-28 there is no handshake:
5
+ every request carries its protocol version, client info and capabilities in
6
+ ``_meta``, and the SDK exposes them on that request's session. Either way the
7
+ values are read per request, so they describe the request being served.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import logging
13
+ from typing import Any
14
+
15
+ from ha_mcp._vendor.fastmcp.server.dependencies import get_http_headers
16
+ from ha_mcp._vendor.fastmcp.server.middleware.middleware import (
17
+ CallNext,
18
+ Middleware,
19
+ MiddlewareContext,
20
+ )
21
+ from ha_mcp._vendor.mcp_types import ClientCapabilities
22
+
23
+ logger = logging.getLogger(__name__)
24
+
25
+
26
+ def protocol_version(ctx: Any) -> str | None:
27
+ """The MCP protocol version this request was served on."""
28
+ version = getattr(getattr(ctx, "request_context", None), "protocol_version", None)
29
+ return version if isinstance(version, str) else None
30
+
31
+
32
+ def client_capabilities(ctx: Any) -> ClientCapabilities | None:
33
+ """The capabilities the client declared for this request, if any."""
34
+ session = getattr(getattr(ctx, "request_context", None), "session", None)
35
+ caps = getattr(session, "client_capabilities", None)
36
+ return caps if isinstance(caps, ClientCapabilities) else None
37
+
38
+
39
+ def declares_form_elicitation(caps: ClientCapabilities | None) -> bool:
40
+ """True when the client can show a form-mode elicitation to its user.
41
+
42
+ An empty ``elicitation`` object predates the form/url split and means
43
+ form mode only.
44
+ """
45
+ elicitation = caps.elicitation if caps is not None else None
46
+ if elicitation is None:
47
+ return False
48
+ return elicitation.form is not None or elicitation.url is None
49
+
50
+
51
+ def capability_names(caps: ClientCapabilities | None) -> list[str] | None:
52
+ """Flatten declared capabilities into stable, readable names.
53
+
54
+ ``None`` means the request carried none to read, which is not the same as
55
+ declaring none: a handshake-era client over stateless HTTP sends them only
56
+ in ``initialize``, never on a later call.
57
+ """
58
+ if caps is None:
59
+ return None
60
+ names: list[str] = []
61
+ if caps.elicitation is not None:
62
+ if declares_form_elicitation(caps):
63
+ names.append("elicitation.form")
64
+ if caps.elicitation.url is not None:
65
+ names.append("elicitation.url")
66
+ names.extend(
67
+ field
68
+ for field in ("sampling", "roots", "tasks")
69
+ if getattr(caps, field) is not None
70
+ )
71
+ names.extend(f"extension:{key}" for key in sorted(caps.extensions or {}))
72
+ names.extend(f"experimental:{key}" for key in sorted(caps.experimental or {}))
73
+ return names
74
+
75
+
76
+ def extract_client_info(ctx: Any) -> dict[str, str]:
77
+ """Pull the connecting MCP client's self-identification off the request context.
78
+
79
+ The MCP ``initialize`` handshake carries a ``clientInfo`` Implementation
80
+ object (``name``/``version``/optional ``title``). FastMCP exposes the
81
+ underlying server session as ``ctx.session``; the MCP SDK's
82
+ ``ServerSession`` keeps the parsed initialize params on ``client_params``;
83
+ on the 2026-07-28 protocol the SDK synthesizes them from the request's
84
+ ``_meta`` when it carries both client info and capabilities. An
85
+ older-protocol client over stateless HTTP sends client info only in
86
+ ``initialize``, so the request's ``User-Agent`` is the fallback there,
87
+ marked as such in ``title``.
88
+
89
+ Returns ``{"name": ..., "version": ..., "title": ...}``. ``name`` and
90
+ ``version`` fall back to ``"unknown"`` when the client didn't send them;
91
+ ``title`` falls back to the empty string so callers can distinguish "not
92
+ sent" from a real title without false-positive aside rendering.
93
+
94
+ Returns an empty dict when there is no context, or no client info and no
95
+ ``User-Agent`` (e.g. stdio), so its callers (bug report, overview, debug
96
+ log) never fail on it. The log level is intentionally INFO, not DEBUG:
97
+ this catch is the only signal we'd get if FastMCP/MCP SDK shape drifts in
98
+ a future release, and silent drift would hide a regression for months.
99
+ """
100
+ if ctx is None:
101
+ return {}
102
+ try:
103
+ params = getattr(getattr(ctx, "session", None), "client_params", None)
104
+ client = getattr(params, "client_info", None) or getattr(
105
+ params, "clientInfo", None
106
+ )
107
+ if client is None:
108
+ return _client_info_from_user_agent()
109
+ return {
110
+ "name": getattr(client, "name", None) or "unknown",
111
+ "version": getattr(client, "version", None) or "unknown",
112
+ "title": getattr(client, "title", None) or "",
113
+ }
114
+ except Exception as e: # noqa: BLE001
115
+ logger.info(
116
+ "Failed to read MCP client info from context: %s (%s)",
117
+ e,
118
+ type(e).__name__,
119
+ )
120
+ return {}
121
+
122
+
123
+ def _client_info_from_user_agent() -> dict[str, str]:
124
+ """``{"name", "version", "title"}`` from the HTTP ``User-Agent``, or ``{}``."""
125
+ user_agent = get_http_headers(include={"user-agent"}).get("user-agent", "").strip()
126
+ if not user_agent:
127
+ return {}
128
+ product = user_agent.split()[0]
129
+ name, _, version = product.partition("/")
130
+ logger.debug("No MCP client info on the request; using User-Agent %r", product)
131
+ return {
132
+ "name": name or "unknown",
133
+ "version": version or "unknown",
134
+ "title": "from HTTP User-Agent",
135
+ }
136
+
137
+
138
+ def describe_mcp_client(ctx: Any) -> dict[str, Any]:
139
+ """Protocol version, client info and declared capabilities of this request."""
140
+ return {
141
+ "protocol_version": protocol_version(ctx) or "unknown",
142
+ "client_info": extract_client_info(ctx),
143
+ "capabilities": capability_names(client_capabilities(ctx)),
144
+ }
145
+
146
+
147
+ class McpClientDebugLogMiddleware(Middleware):
148
+ """Log, at DEBUG, which protocol and capabilities each tool call arrived with.
149
+
150
+ The modern protocol is stateless, so there is no connection to log once
151
+ per client; the line is per call and costs one level check when DEBUG is
152
+ off.
153
+ """
154
+
155
+ async def on_call_tool(
156
+ self, context: MiddlewareContext, call_next: CallNext
157
+ ) -> Any:
158
+ if logger.isEnabledFor(logging.DEBUG):
159
+ logger.debug(
160
+ "tools/call %s: %s",
161
+ context.message.name,
162
+ describe_mcp_client(context.fastmcp_context),
163
+ )
164
+ return await call_next(context)
@@ -15,6 +15,7 @@ from ha_mcp._vendor.fastmcp.server.middleware.middleware import (
15
15
  Middleware,
16
16
  MiddlewareContext,
17
17
  )
18
+ from ha_mcp._vendor.fastmcp.tools.base import InputRequiredToolResult
18
19
 
19
20
  from ..errors import ErrorCode, create_error_response
20
21
  from ..renamed_tools import current_tool_name
@@ -30,7 +31,12 @@ from .evaluator import (
30
31
  )
31
32
  from .events import emit_approval_requested
32
33
  from .model import Policy, Rule
33
- from .mrtr import ApprovalContinuation, supports_mrtr
34
+ from .mrtr import (
35
+ ApprovalAnswer,
36
+ ApprovalContinuation,
37
+ approval_answer,
38
+ supports_mrtr,
39
+ )
34
40
 
35
41
  if TYPE_CHECKING:
36
42
  from ..client.rest_client import HomeAssistantClient
@@ -264,8 +270,22 @@ class PolicyMiddleware(Middleware):
264
270
  continuation = ApprovalContinuation.start(
265
271
  pending, policy, wait, dynamic_targets=dynamic_targets
266
272
  )
273
+ if resumed is not None and (answer := approval_answer(context)) != "accept":
274
+ return await self._end_unconfirmed_resume(
275
+ pending,
276
+ rule,
277
+ resumed[0],
278
+ answer,
279
+ dynamic_targets=dynamic_targets,
280
+ policy=policy,
281
+ name=name,
282
+ )
267
283
  await self._wait_for_decision(
268
- context, pending, continuation.wait_seconds() if continuation else wait
284
+ context,
285
+ pending,
286
+ continuation.wait_seconds(confirmed=resumed is not None)
287
+ if continuation
288
+ else wait,
269
289
  )
270
290
 
271
291
  if pending.decision == "approved":
@@ -292,17 +312,87 @@ class PolicyMiddleware(Middleware):
292
312
  self._queue.remove(pending.token)
293
313
  self._raise_denied_error()
294
314
 
295
- if continuation is not None:
315
+ # Only the first leg asks; an accepted form already waited out the window.
316
+ if continuation is not None and resumed is None:
296
317
  result = continuation.next_result(self._queue)
297
318
  if result is not None:
298
319
  return result
299
320
 
321
+ await self._raise_unresolved(
322
+ pending, rule, dynamic_targets=dynamic_targets, policy=policy, name=name
323
+ )
324
+ return None # py/mixed-returns: explicit terminal; error handlers above always raise (NoReturn), unreachable
325
+
326
+ async def _end_unconfirmed_resume(
327
+ self,
328
+ pending: PendingApproval,
329
+ rule: Rule | None,
330
+ continuation: ApprovalContinuation,
331
+ answer: ApprovalAnswer | None,
332
+ *,
333
+ dynamic_targets: bool,
334
+ policy: Policy,
335
+ name: str,
336
+ ) -> InputRequiredToolResult | None:
337
+ """Handle a resumed call whose form was not accepted. Never dispatches.
338
+
339
+ Only an accepted form continues a resumed call, even once the row is
340
+ approved. The answer is client-supplied, so it may stop or deny the
341
+ call but never approve it: decline denies or removes the row (for
342
+ every call waiting on a shared static row, as a Deny click would),
343
+ cancel ends with the approval error, and a retry with no answer is
344
+ asked again.
345
+ """
346
+ if answer is not None:
347
+ # Logged because a client answer can end a row a human approved.
348
+ logger.info(
349
+ "policy middleware: token %s for tool=%s ended by the client's "
350
+ "form answer=%s (decision was %s)",
351
+ pending.token,
352
+ name,
353
+ answer,
354
+ pending.decision,
355
+ )
356
+ if answer == "decline" or pending.decision == "denied":
357
+ self._queue.deny(pending.token)
358
+ self._queue.remove(pending.token)
359
+ self._raise_denied_error()
360
+ if answer is None:
361
+ ask = continuation.next_result(self._queue)
362
+ if ask is not None:
363
+ return ask
364
+ await self._raise_unresolved(
365
+ pending,
366
+ rule,
367
+ dynamic_targets=dynamic_targets,
368
+ policy=policy,
369
+ name=name,
370
+ dismissed=answer == "cancel",
371
+ )
372
+ return None # py/mixed-returns: explicit terminal; error handlers above always raise (NoReturn), unreachable
373
+
374
+ async def _raise_unresolved(
375
+ self,
376
+ pending: PendingApproval,
377
+ rule: Rule | None,
378
+ *,
379
+ dynamic_targets: bool,
380
+ policy: Policy,
381
+ name: str,
382
+ dismissed: bool = False,
383
+ ) -> NoReturn:
384
+ """End a call that has no decision: finalize the row, re-announce, raise."""
300
385
  pending = self._finalize_timed_out_pending(
301
- pending, dynamic_targets=dynamic_targets, policy=policy, name=name
386
+ pending,
387
+ dynamic_targets=dynamic_targets,
388
+ policy=policy,
389
+ name=name,
390
+ dismissed=dismissed,
302
391
  )
303
392
  await self._announce_reissued(pending, rule, dynamic_targets=dynamic_targets)
304
- self._raise_pending_error(pending, rule, dynamic_targets=dynamic_targets)
305
- return None # py/mixed-returns: explicit terminal; error handlers above always raise (NoReturn), unreachable
393
+ self._raise_pending_error(
394
+ pending, rule, dynamic_targets=dynamic_targets, dismissed=dismissed
395
+ )
306
396
 
307
397
  async def _announce_reissued(
308
398
  self,
@@ -526,8 +616,12 @@ class PolicyMiddleware(Middleware):
526
616
  dynamic_targets: bool,
527
617
  policy: Policy,
528
618
  name: str,
619
+ dismissed: bool = False,
529
620
  ) -> PendingApproval:
530
- """Resolve a pending entry that timed out without a decision.
621
+ """Resolve a pending entry that ended without a decision.
622
+
623
+ ``dismissed`` means the user dismissed the approval form rather than
624
+ the wait running out; it only changes what is logged.
531
625
 
532
626
  Two mutually exclusive outcomes, split by ``dynamic_targets`` for
533
627
  the same reason the entry was never shared or looked up in the
@@ -561,9 +655,12 @@ class PolicyMiddleware(Middleware):
561
655
  # an operator tell those apart.
562
656
  logger.info(
563
657
  "policy middleware: dynamic pending token %s removed after "
564
- "its single-use wait window closed for tool=%s; a late "
565
- "Approve click on it will log as an unknown token",
658
+ "%s for tool=%s; a late Approve click on it will log as an "
659
+ "unknown token",
566
660
  pending.token,
661
+ "the approval form was dismissed"
662
+ if dismissed
663
+ else "its single-use wait window closed",
567
664
  name,
568
665
  )
569
666
  return pending
@@ -627,6 +724,7 @@ class PolicyMiddleware(Middleware):
627
724
  rule: Rule | None = None,
628
725
  *,
629
726
  dynamic_targets: bool = False,
727
+ dismissed: bool = False,
630
728
  ) -> NoReturn:
631
729
  """Raise the structured USER_APPROVAL_REQUIRED error for one pending entry.
632
730
 
@@ -638,9 +736,9 @@ class PolicyMiddleware(Middleware):
638
736
  picked up by a later re-call -- so its wording must not promise the
639
737
  normal "re-call after the user approves" recovery path the
640
738
  non-dynamic case uses, and must not describe a still-open approval
641
- window: this is the ONLY call site, reached after
642
- ``_wait_for_decision`` returns with no decision, so the wait window
643
- has already closed by the time this message is built.
739
+ window. It ends either after ``_wait_for_decision`` returned with no
740
+ decision (the window closed) or, with ``dismissed``, when the user
741
+ dismissed the approval form, and the message says which.
644
742
  """
645
743
  context: dict[str, Any] = {"token": pending.token}
646
744
  # Surface the matched rule so users (and the LLM) can tell at a
@@ -657,10 +755,15 @@ class PolicyMiddleware(Middleware):
657
755
  # countdown left to report -- a number here would read as
658
756
  # "there's still time", exactly the false impression this
659
757
  # message must not give.
758
+ ended = (
759
+ "the approval form for this call was dismissed"
760
+ if dismissed
761
+ else "this call's wait window has now closed"
762
+ )
660
763
  message = (
661
764
  "User approval required, and this specific request has "
662
- "already expired: it was single-use, bound to this one "
663
- "call only, and this call's wait window has now closed. "
765
+ "already ended: it was single-use, bound to this one "
766
+ f"call only, and {ended}. "
664
767
  "The token above has already been removed and no longer "
665
768
  "exists -- there is nothing left to approve for this call. "
666
769
  "Re-call this tool to create a brand-new, independent "
@@ -1,42 +1,69 @@
1
- """Bounded MRTR polling of the existing approval queue.
1
+ """Ask the user, through MRTR elicitation, to decide a held tool call.
2
+
3
+ A result carrying only ``requestState`` gives the client nothing to show its
4
+ user, and the spec lets a client stop there instead of retrying. The only
5
+ in-band way to reach the user is an ``inputRequests`` entry, and a server may
6
+ send one only for a capability the client declared. So a client that declares
7
+ form elicitation is told, after a short first wait, to decide the call in the
8
+ ha-mcp settings; every other client keeps the blocking wait and its
9
+ approval-required error.
2
10
 
3
11
  FastMCP seals requestState and binds it to the wire call and principal. This
4
12
  module additionally binds the resolved leaf tool, policy and queue entry. The
5
- state is a reference to a decision, never an approval supplied by the client.
13
+ state is a reference to a decision, never an approval supplied by the client:
14
+ the elicitation answer can stop or deny a call, never approve it.
6
15
  """
7
16
 
8
17
  from __future__ import annotations
9
18
 
19
+ import logging
10
20
  from collections.abc import Mapping
11
21
  from datetime import UTC, datetime
12
22
  from time import time
13
- from typing import Literal, NoReturn
23
+ from typing import Literal, NoReturn, cast, get_args
14
24
 
15
25
  from pydantic import BaseModel, ConfigDict, Field, ValidationError
16
26
 
17
27
  from ha_mcp._vendor.fastmcp.server.middleware.middleware import MiddlewareContext
18
28
  from ha_mcp._vendor.fastmcp.tools.base import InputRequiredToolResult
19
- from ha_mcp._vendor.mcp_types import InputRequiredResult
29
+ from ha_mcp._vendor.mcp_types import (
30
+ ElicitRequest,
31
+ ElicitRequestFormParams,
32
+ InputRequiredResult,
33
+ )
20
34
  from ha_mcp._vendor.mcp_types.version import MODERN_PROTOCOL_VERSIONS
21
35
 
22
36
  from ..errors import ErrorCode, create_error_response
37
+ from ..mcp_client_context import (
38
+ client_capabilities,
39
+ declares_form_elicitation,
40
+ protocol_version,
41
+ )
23
42
  from ..renamed_tools import current_tool_name
24
43
  from ..tool_dispatch import CALL_PROXY_META_TOOLS
25
44
  from ..tools.helpers import raise_tool_error
26
45
  from .approval_queue import ApprovalQueue, PendingApproval, compute_args_hash
27
46
  from .model import Policy
28
47
 
48
+ logger = logging.getLogger(__name__)
49
+
29
50
  # Leave room below the SDK's default ten-round limit for a normal final error.
30
51
  MAX_CONTINUATIONS = 8
52
+ # How long a call waits before asking; a quick approval never prompts.
31
53
  ROUND_WAIT_SECONDS = 10
54
+ APPROVAL_INPUT_KEY = "ha_mcp_approval"
55
+
56
+ ApprovalAnswer = Literal["accept", "decline", "cancel"]
32
57
 
33
58
 
34
59
  def supports_mrtr(context: MiddlewareContext) -> bool:
35
- """Use modern MRTR only where retrying resumes this single tool dispatch."""
60
+ """Use MRTR only where the client can show the ask and a retry resumes this dispatch."""
36
61
  ctx = context.fastmcp_context
37
- request = getattr(ctx, "request_context", None)
38
- if getattr(request, "protocol_version", None) not in MODERN_PROTOCOL_VERSIONS:
62
+ if protocol_version(ctx) not in MODERN_PROTOCOL_VERSIONS:
63
+ return False
64
+ if not declares_form_elicitation(client_capabilities(ctx)):
39
65
  return False
66
+ request = getattr(ctx, "request_context", None)
40
67
  params = getattr(getattr(request, "_srctx", None), "params", None)
41
68
  if not isinstance(params, Mapping):
42
69
  return False
@@ -49,6 +76,48 @@ def supports_mrtr(context: MiddlewareContext) -> bool:
49
76
  return name == current_tool_name(context.message.name)
50
77
 
51
78
 
79
+ def approval_answer(context: MiddlewareContext) -> ApprovalAnswer | None:
80
+ """The user's answer to the approval elicitation, if this retry carries one."""
81
+ responses = getattr(context.fastmcp_context, "input_responses", None)
82
+ if not responses:
83
+ return None
84
+ answer = responses.get(APPROVAL_INPUT_KEY)
85
+ action = getattr(answer, "action", None)
86
+ if action not in get_args(ApprovalAnswer):
87
+ logger.warning(
88
+ "approval elicitation: unreadable answer (keys %s, value %r); asking again",
89
+ sorted(responses),
90
+ answer,
91
+ )
92
+ return None
93
+ return cast("ApprovalAnswer", action)
94
+
95
+
96
+ def _approval_request(tool_name: str, wait_seconds: int) -> ElicitRequest:
97
+ return ElicitRequest(
98
+ params=ElicitRequestFormParams(
99
+ # Clients may render this on one truncated line: keep it short.
100
+ message=(
101
+ f"Approve {tool_name} in ha-mcp > Tool Security Policies and "
102
+ f"Accept here (either order, within {wait_seconds} s of the call)."
103
+ ),
104
+ # A bool field rather than an empty schema: FastMCP notes some
105
+ # clients render an empty schema as a blank, non-functional form.
106
+ requested_schema={
107
+ "type": "object",
108
+ "properties": {
109
+ "decided": {
110
+ "type": "boolean",
111
+ "title": "Continue once approved in the ha-mcp settings",
112
+ "default": True,
113
+ }
114
+ },
115
+ "required": ["decided"],
116
+ },
117
+ )
118
+ )
119
+
120
+
52
121
  def _policy_hash(policy: Policy) -> str:
53
122
  return compute_args_hash(
54
123
  {
@@ -73,8 +142,23 @@ def _cannot_resume() -> NoReturn:
73
142
  )
74
143
 
75
144
 
145
+ def _window_ended() -> NoReturn:
146
+ raise_tool_error(
147
+ create_error_response(
148
+ ErrorCode.USER_APPROVAL_REQUIRED,
149
+ "The approval window for this call has ended. This retry executed "
150
+ "nothing, but an earlier attempt of this call may already have run: "
151
+ "check its outcome before calling the tool again.",
152
+ suggestions=[
153
+ "Check the target's current state before re-calling.",
154
+ "A fresh call needs a new approval in the Tool Security Policies tab.",
155
+ ],
156
+ )
157
+ )
158
+
159
+
76
160
  class ApprovalContinuation(BaseModel):
77
- """Small, sealed reference retaining one logical call's deadline."""
161
+ """Small, sealed reference retaining one logical call's deadline and window."""
78
162
 
79
163
  model_config = ConfigDict(extra="forbid", strict=True, allow_inf_nan=False)
80
164
 
@@ -84,6 +168,7 @@ class ApprovalContinuation(BaseModel):
84
168
  args_hash: str
85
169
  policy_hash: str
86
170
  deadline: float
171
+ window_seconds: int
87
172
  rounds: int = Field(default=0, ge=0, le=MAX_CONTINUATIONS)
88
173
 
89
174
  @classmethod
@@ -107,6 +192,11 @@ class ApprovalContinuation(BaseModel):
107
192
  except ValidationError:
108
193
  _cannot_resume()
109
194
  pending = queue.get(continuation.token)
195
+ # A late answer is ordinary user latency, not a stale or reused
196
+ # state: past the deadline the gate waits no longer and ends with
197
+ # the normal approval outcome, so the deadline is not checked here.
198
+ if pending is None and continuation.deadline <= time():
199
+ _window_ended()
110
200
  if (
111
201
  pending is None
112
202
  or continuation.tool_name != name
@@ -114,7 +204,6 @@ class ApprovalContinuation(BaseModel):
114
204
  or pending.tool_name != name
115
205
  or pending.args_hash != args_hash
116
206
  or continuation.policy_hash != _policy_hash(policy)
117
- or continuation.deadline <= time()
118
207
  ):
119
208
  _cannot_resume()
120
209
  return continuation, pending
@@ -139,13 +228,18 @@ class ApprovalContinuation(BaseModel):
139
228
  args_hash=pending.args_hash,
140
229
  policy_hash=_policy_hash(policy),
141
230
  deadline=deadline,
231
+ window_seconds=wait_seconds,
142
232
  )
143
233
 
144
- def wait_seconds(self) -> float:
145
- return max(0, min(ROUND_WAIT_SECONDS, self.deadline - time()))
234
+ def wait_seconds(self, *, confirmed: bool) -> float:
235
+ """Wait briefly before asking; once the user confirmed, use the whole window."""
236
+ remaining = self.deadline - time()
237
+ if confirmed:
238
+ return max(0, remaining)
239
+ return max(0, min(ROUND_WAIT_SECONDS, remaining))
146
240
 
147
241
  def next_result(self, queue: ApprovalQueue) -> InputRequiredToolResult | None:
148
- """End a pending leg without granting, consuming or extending approval."""
242
+ """Ask the user to decide, without granting, consuming or extending approval."""
149
243
  if (
150
244
  self.rounds >= MAX_CONTINUATIONS
151
245
  or time() >= self.deadline
@@ -154,5 +248,12 @@ class ApprovalContinuation(BaseModel):
154
248
  return None
155
249
  state = self.model_copy(update={"rounds": self.rounds + 1})
156
250
  return InputRequiredToolResult(
157
- InputRequiredResult(request_state=state.model_dump_json())
251
+ InputRequiredResult(
252
+ input_requests={
253
+ APPROVAL_INPUT_KEY: _approval_request(
254
+ self.tool_name, self.window_seconds
255
+ )
256
+ },
257
+ request_state=state.model_dump_json(),
258
+ )
158
259
  )
@@ -41,6 +41,7 @@ from .utils.skill_loader import (
41
41
  BEST_PRACTICES_SKILL_NAME,
42
42
  best_practices_skill,
43
43
  list_skill_files,
44
+ log_skill_registration_summary,
44
45
  parse_skill_frontmatter,
45
46
  )
46
47
 
@@ -216,9 +217,12 @@ class HomeAssistantSmartMCPServer:
216
217
  # Keep the pre-rename tool names callable for clients that still hold
217
218
  # an older catalog. First in the chain, so everything after it sees the
218
219
  # current name it is keyed on.
220
+ from .mcp_client_context import McpClientDebugLogMiddleware
219
221
  from .tools.renamed_tool_middleware import RenamedToolAliasMiddleware
220
222
 
221
223
  self.mcp.add_middleware(RenamedToolAliasMiddleware())
224
+ # After the alias, so the DEBUG line logs the current tool name.
225
+ self.mcp.add_middleware(McpClientDebugLogMiddleware())
222
226
 
223
227
  # Convert Pydantic type-validation errors to structured ToolErrors so
224
228
  # models get actionable guidance instead of raw Pydantic messages.
@@ -882,31 +886,7 @@ class HomeAssistantSmartMCPServer:
882
886
  )
883
887
  status["tool"] = "failed"
884
888
 
885
- self._log_skill_registration_summary(status)
886
-
887
- @staticmethod
888
- def _log_skill_registration_summary(status: dict[str, str | int]) -> None:
889
- """Emit one-line summary of skill registration outcome.
890
-
891
- ``info`` when both provider and tool registered AND at least one
892
- skill bundle parsed; ``warning`` otherwise. The guidance>0 gate
893
- catches the "tool registered but exposes nothing" case (skills
894
- directory missing, empty, or every SKILL.md fails to parse) —
895
- the tool stays present so the failure is reachable via a tool
896
- call, but operators should grep for this warning when a user
897
- reports missing skill features.
898
- """
899
- provider = status.get("provider")
900
- tool = status.get("tool")
901
- raw_guidance = status.get("guidance_count", 0)
902
- guidance = raw_guidance if isinstance(raw_guidance, int) else 0
903
-
904
- message = "Skill system summary: provider=%s, tool=%s, guidance_count=%d"
905
- args = (provider, tool, guidance)
906
- if provider == "ok" and tool == "ok" and guidance > 0:
907
- logger.info(message, *args)
908
- else:
909
- logger.warning(message, *args)
889
+ log_skill_registration_summary(status)
910
890
 
911
891
  def _register_skill_guide_tool(self, skills_dir: Path | None) -> int:
912
892
  """Register the ``ha_get_skill_guide`` tool unconditionally.