ha-mcp-dev 8.4.3.dev2624__tar.gz → 8.4.3.dev2625__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 (315) hide show
  1. {ha_mcp_dev-8.4.3.dev2624/src/ha_mcp_dev.egg-info → ha_mcp_dev-8.4.3.dev2625}/PKG-INFO +1 -1
  2. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/pyproject.toml +1 -1
  3. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/config.py +16 -0
  4. ha_mcp_dev-8.4.3.dev2625/src/ha_mcp/http_transport.py +160 -0
  5. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/server.py +1 -1
  6. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/settings_ui/locales/en.json +4 -0
  7. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/settings_ui/settings.js +3 -0
  8. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  9. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp_dev.egg-info/SOURCES.txt +1 -0
  10. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/LICENSE +0 -0
  11. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/MANIFEST.in +0 -0
  12. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/README.md +0 -0
  13. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/setup.cfg +0 -0
  14. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/__init__.py +0 -0
  15. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/__main__.py +0 -0
  16. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_pypi_marker +0 -0
  17. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_rich_compat.py +0 -0
  18. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/__init__.py +0 -0
  19. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/requirements.txt +0 -0
  20. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
  21. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
  22. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
  23. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
  24. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
  25. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
  26. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
  27. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
  28. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
  29. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
  30. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
  31. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
  32. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
  33. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/client.py +0 -0
  34. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
  35. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
  36. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
  37. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
  38. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
  39. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
  40. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
  41. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
  42. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
  43. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
  44. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
  45. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
  46. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
  47. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
  48. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
  49. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
  50. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
  51. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
  52. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
  53. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
  54. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
  55. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
  56. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/server.py +0 -0
  57. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
  58. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
  59. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
  60. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
  61. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
  62. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
  63. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
  64. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
  65. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
  66. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
  67. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
  68. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
  69. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
  70. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
  71. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
  72. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
  73. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
  74. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
  75. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_vendor/websockets/version.py +0 -0
  76. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/_version.py +0 -0
  77. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/auth/__init__.py +0 -0
  78. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/auth/consent_form.py +0 -0
  79. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/auth/oidc_compat.py +0 -0
  80. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/auth/provider.py +0 -0
  81. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/backup_manager.py +0 -0
  82. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/browser_landing.py +0 -0
  83. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/client/__init__.py +0 -0
  84. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/client/rest_client.py +0 -0
  85. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/client/supervisor_client.py +0 -0
  86. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/client/websocket_client.py +0 -0
  87. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/client/websocket_listener.py +0 -0
  88. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  89. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  90. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  91. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  92. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  93. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
  94. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/errors.py +0 -0
  95. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/ha_request_queue.py +0 -0
  96. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/hacs_auto_refresh.py +0 -0
  97. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/llm_exposure.py +0 -0
  98. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/log_filters.py +0 -0
  99. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/policy/__init__.py +0 -0
  100. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/policy/approval_queue.py +0 -0
  101. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/policy/editing.py +0 -0
  102. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/policy/evaluator.py +0 -0
  103. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/policy/handlers.py +0 -0
  104. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/policy/middleware.py +0 -0
  105. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/policy/model.py +0 -0
  106. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/policy/persistence.py +0 -0
  107. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/policy/value_sources.py +0 -0
  108. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/py.typed +0 -0
  109. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/read_only.py +0 -0
  110. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/redaction.py +0 -0
  111. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/renamed_tools.py +0 -0
  112. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  113. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  114. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  115. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  116. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  117. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  118. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  119. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  120. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  121. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  122. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/evals/area-target-over-entity-list/case.yaml +0 -0
  123. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/evals/arrive-home-automation/case.yaml +0 -0
  124. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/evals/assist-shortcut-card/case.yaml +0 -0
  125. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/evals/avg-temperature/case.yaml +0 -0
  126. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/evals/backup-deletion-confirmation/case.yaml +0 -0
  127. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/evals/blueprint-authoring/case.yaml +0 -0
  128. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/evals/button-event-entity/case.yaml +0 -0
  129. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/evals/device-id-trigger-migration/case.yaml +0 -0
  130. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/evals/helper-flow-fields-not-platform-yaml/case.yaml +0 -0
  131. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/evals/media-player-song/case.yaml +0 -0
  132. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/evals/motion-light-automation-mode/case.yaml +0 -0
  133. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/evals/rename-entity-impact-analysis/case.yaml +0 -0
  134. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/evals/template-attributes-yaml-exception/case.yaml +0 -0
  135. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/evals/timer-finished-automation/case.yaml +0 -0
  136. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/evals/vacuum-last-clean/case.yaml +0 -0
  137. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/scripts/check_eval_cases.py +0 -0
  138. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  139. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  140. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  141. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
  142. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  143. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  144. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  145. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  146. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  147. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  148. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  149. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  150. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  151. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  152. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  153. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/settings_ui/__init__.py +0 -0
  154. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
  155. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
  156. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  157. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  158. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  159. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  160. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/settings_ui/_i18n.py +0 -0
  161. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
  162. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  163. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  164. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/settings_ui/_theme.py +0 -0
  165. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
  166. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/settings_ui/locales/README.md +0 -0
  167. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
  168. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/settings_ui/locales/de.json +0 -0
  169. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
  170. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/settings_ui/locales/es.json +0 -0
  171. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
  172. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/settings_ui/locales/it.json +0 -0
  173. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
  174. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
  175. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
  176. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
  177. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
  178. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
  179. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
  180. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/settings_ui/locales/zh-Hant.json +0 -0
  181. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/settings_ui/settings.css +0 -0
  182. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/settings_ui/settings.html +0 -0
  183. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/smoke_test.py +0 -0
  184. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  185. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/strict_bps.py +0 -0
  186. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tool_dispatch.py +0 -0
  187. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/__init__.py +0 -0
  188. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/auto_backup.py +0 -0
  189. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/backup.py +0 -0
  190. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  191. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/best_practice_result.py +0 -0
  192. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/best_practice_variables.py +0 -0
  193. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/blueprint_sources.py +0 -0
  194. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
  195. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/blueprint_write.py +0 -0
  196. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/bulk_selector.py +0 -0
  197. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/component_api.py +0 -0
  198. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/component_config_entries.py +0 -0
  199. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/component_config_reads.py +0 -0
  200. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/component_dashboard_edit.py +0 -0
  201. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/component_devices.py +0 -0
  202. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/component_registries.py +0 -0
  203. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
  204. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  205. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
  206. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
  207. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
  208. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/config_entry_identity.py +0 -0
  209. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
  210. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
  211. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/dashboard_edit_errors.py +0 -0
  212. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/device_control.py +0 -0
  213. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/error_log_parsing.py +0 -0
  214. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/hacs_registration.py +0 -0
  215. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/helpers.py +0 -0
  216. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
  217. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/log_common.py +0 -0
  218. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/log_sources.py +0 -0
  219. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/log_sources_fault.py +0 -0
  220. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
  221. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/radio/__init__.py +0 -0
  222. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/radio/base.py +0 -0
  223. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/radio/matter.py +0 -0
  224. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/radio/thread.py +0 -0
  225. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  226. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/radio/zwave.py +0 -0
  227. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/reference_validator.py +0 -0
  228. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/registry.py +0 -0
  229. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
  230. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  231. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  232. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  233. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  234. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  235. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  236. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
  237. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  238. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  239. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  240. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  241. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_addons.py +0 -0
  242. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_areas.py +0 -0
  243. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
  244. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  245. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  246. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_calendar.py +0 -0
  247. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_camera.py +0 -0
  248. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_categories.py +0 -0
  249. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_code.py +0 -0
  250. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  251. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  252. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  253. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  254. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  255. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  256. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_dev.py +0 -0
  257. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_energy.py +0 -0
  258. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_entities.py +0 -0
  259. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  260. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_groups.py +0 -0
  261. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_hacs.py +0 -0
  262. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_history.py +0 -0
  263. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_integrations.py +0 -0
  264. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_labels.py +0 -0
  265. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_logs.py +0 -0
  266. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_radio.py +0 -0
  267. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_registry.py +0 -0
  268. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_resources.py +0 -0
  269. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_search.py +0 -0
  270. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_security_policy.py +0 -0
  271. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_service.py +0 -0
  272. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_services.py +0 -0
  273. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_system.py +0 -0
  274. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_themes.py +0 -0
  275. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_todo.py +0 -0
  276. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_traces.py +0 -0
  277. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_updates.py +0 -0
  278. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_utility.py +0 -0
  279. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  280. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  281. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
  282. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/tools_zones.py +0 -0
  283. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/util_helpers.py +0 -0
  284. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/tools/validation_middleware.py +0 -0
  285. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/transforms/__init__.py +0 -0
  286. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/transforms/categorized_search.py +0 -0
  287. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  288. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/transport_security.py +0 -0
  289. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/update_check.py +0 -0
  290. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/utils/__init__.py +0 -0
  291. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/utils/config_hash.py +0 -0
  292. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/utils/config_write_lock.py +0 -0
  293. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/utils/dashboard_patch.py +0 -0
  294. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/utils/data_paths.py +0 -0
  295. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
  296. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/utils/domain_handlers.py +0 -0
  297. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/utils/entity_membership.py +0 -0
  298. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  299. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  300. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/utils/operation_manager.py +0 -0
  301. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/utils/python_sandbox.py +0 -0
  302. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/utils/skill_loader.py +0 -0
  303. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/utils/usage_logger.py +0 -0
  304. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/visibility/__init__.py +0 -0
  305. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/visibility/enforcement.py +0 -0
  306. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/visibility/model.py +0 -0
  307. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/visibility/persistence.py +0 -0
  308. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp/visibility/resolver.py +0 -0
  309. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  310. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  311. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  312. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  313. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/tests/__init__.py +0 -0
  314. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/tests/test_constants.py +0 -0
  315. {ha_mcp_dev-8.4.3.dev2624 → ha_mcp_dev-8.4.3.dev2625}/tests/test_env_manager.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 8.4.3.dev2624
3
+ Version: 8.4.3.dev2625
4
4
  Summary: Home Assistant MCP Server - Complete control of Home Assistant through MCP
5
5
  Author-email: Julien <github@qc-h.net>
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "8.4.3.dev2624"
7
+ version = "8.4.3.dev2625"
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
@@ -124,6 +124,12 @@ class Settings(BaseSettings):
124
124
  debug: bool = Field(False, alias="DEBUG")
125
125
  log_level: str = Field("INFO", alias="LOG_LEVEL")
126
126
 
127
+ # Opt-in HTTP experiments, applied at app construction (restart required).
128
+ http_transport_diagnostics: bool = Field(
129
+ False, alias="HAMCP_HTTP_TRANSPORT_DIAGNOSTICS"
130
+ )
131
+ http_json_response: bool = Field(False, alias="HAMCP_HTTP_JSON_RESPONSE")
132
+
127
133
  # MCP Server configuration
128
134
  mcp_server_name: str = Field("ha-mcp", alias="MCP_SERVER_NAME")
129
135
  mcp_server_version: str = Field(
@@ -940,6 +946,16 @@ ADVANCED_SETTINGS_FIELDS: tuple[AdvancedField, ...] = (
940
946
  AdvancedField("environment", "ENVIRONMENT", str, "diagnostics", True),
941
947
  AdvancedField("log_level", "LOG_LEVEL", str, "diagnostics", True),
942
948
  AdvancedField("debug", "DEBUG", bool, "diagnostics", True),
949
+ AdvancedField(
950
+ "http_transport_diagnostics",
951
+ "HAMCP_HTTP_TRANSPORT_DIAGNOSTICS",
952
+ bool,
953
+ "diagnostics",
954
+ True,
955
+ ),
956
+ AdvancedField(
957
+ "http_json_response", "HAMCP_HTTP_JSON_RESPONSE", bool, "diagnostics", True
958
+ ),
943
959
  # Settings UI sidecar (stdio-only). 0 (default) = first spawn picks a
944
960
  # free port and later spawns reuse it via ui.state (#2131); a value
945
961
  # pins a preferred fixed port instead (best-effort, #1587).
@@ -0,0 +1,160 @@
1
+ """Default-off HTTP diagnostics and JSON responses for HA-MCP launchers."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import logging
6
+ from dataclasses import dataclass
7
+ from time import monotonic
8
+ from typing import Any
9
+ from uuid import uuid4
10
+
11
+ import fastmcp
12
+ from fastmcp import FastMCP
13
+ from fastmcp.server.http import StarletteWithLifespan
14
+ from starlette.middleware import Middleware
15
+ from starlette.types import ASGIApp, Message, Receive, Scope, Send
16
+
17
+ from .config import get_global_settings
18
+
19
+ logger = logging.getLogger(__name__)
20
+
21
+
22
+ class HttpTransportFastMCP(FastMCP):
23
+ """Apply instance HTTP experiments at the shared app-construction boundary.
24
+
25
+ Both CLI HTTP launchers and existing embedded components call ``http_app``.
26
+ Keep FastMCP's arguments untouched when the options are off, including any
27
+ existing FASTMCP_JSON_RESPONSE setting. Stdio does not use this method.
28
+ """
29
+
30
+ def http_app(self, *args: Any, **kwargs: Any) -> StarletteWithLifespan:
31
+ """Build the normal app, adding only explicitly enabled experiments."""
32
+ settings = get_global_settings()
33
+ if settings.http_json_response:
34
+ # FastMCP accepts json_response as its third positional argument.
35
+ if len(args) > 2:
36
+ args = (*args[:2], True, *args[3:])
37
+ else:
38
+ kwargs["json_response"] = True
39
+ if settings.http_transport_diagnostics:
40
+ path = args[0] if args else kwargs.get("path")
41
+ existing = args[1] if len(args) > 1 else kwargs.get("middleware")
42
+ middleware = [
43
+ *(existing or []),
44
+ Middleware(
45
+ TransportDiagnostics,
46
+ path=path or fastmcp.settings.streamable_http_path,
47
+ ),
48
+ ]
49
+ if len(args) > 1:
50
+ args = (args[0], middleware, *args[2:])
51
+ else:
52
+ kwargs["middleware"] = middleware
53
+ return super().http_app(*args, **kwargs)
54
+
55
+
56
+ @dataclass
57
+ class _Transfer:
58
+ """Counters local to one HTTP request; never retain body data."""
59
+
60
+ request_bytes: int = 0
61
+ response_bytes: int = 0
62
+ request_complete: bool = False
63
+ response_complete: bool = False
64
+ disconnect: bool = False
65
+ status: int | None = None
66
+ error: str | None = None
67
+
68
+ def received(self, message: Message, trace: str) -> None:
69
+ """Count only events delivered by the underlying receive callable."""
70
+ if message["type"] == "http.request":
71
+ self.request_bytes += len(message.get("body", b""))
72
+ if not message.get("more_body", False):
73
+ self.request_complete = True
74
+ logger.info("MCP HTTP trace=%s request body complete", trace)
75
+ elif message["type"] == "http.disconnect":
76
+ self.disconnect = True
77
+
78
+ def sent(self, message: Message, trace: str, started: float) -> None:
79
+ """Record accepted events, including final-body handoff before app cleanup."""
80
+ if message["type"] == "http.response.start":
81
+ self.status = message["status"]
82
+ logger.info(
83
+ "MCP HTTP trace=%s response headers status=%s", trace, self.status
84
+ )
85
+ elif message["type"] == "http.response.body":
86
+ self.response_bytes += len(message.get("body", b""))
87
+ self.response_complete = not message.get("more_body", False)
88
+ if self.response_complete:
89
+ logger.info(
90
+ "MCP HTTP trace=%s response body complete response_bytes=%d elapsed_ms=%.1f",
91
+ trace,
92
+ self.response_bytes,
93
+ (monotonic() - started) * 1000,
94
+ )
95
+
96
+
97
+ def _declared_length(scope: Scope) -> int | None:
98
+ """Read only a bounded numeric length, never log arbitrary header text."""
99
+ for name, value in scope.get("headers", []):
100
+ if name.lower() == b"content-length":
101
+ if len(value) <= 20 and value.isdigit():
102
+ return int(value)
103
+ return None
104
+ return None
105
+
106
+
107
+ class TransportDiagnostics:
108
+ """Observe the MCP HTTP boundary without buffering or altering messages.
109
+
110
+ Completion means ASGI accepted the final body event, not that the client
111
+ received or processed it. No paths, headers, request IDs supplied by clients,
112
+ bodies or exception messages are logged. Other HTTP routes are untouched.
113
+ """
114
+
115
+ def __init__(self, app: ASGIApp, path: str) -> None:
116
+ self.app = app
117
+ self.path = path.rstrip("/")
118
+
119
+ async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None:
120
+ if scope["type"] != "http" or scope["path"].rstrip("/") != self.path:
121
+ await self.app(scope, receive, send)
122
+ return
123
+
124
+ transfer = _Transfer()
125
+ trace = uuid4().hex[:16]
126
+ started = monotonic()
127
+ declared = _declared_length(scope)
128
+ logger.info("MCP HTTP trace=%s started declared_bytes=%s", trace, declared)
129
+
130
+ async def receive_observed() -> Message:
131
+ message = await receive()
132
+ transfer.received(message, trace)
133
+ return message
134
+
135
+ async def send_observed(message: Message) -> None:
136
+ await send(message)
137
+ transfer.sent(message, trace, started)
138
+
139
+ try:
140
+ await self.app(scope, receive_observed, send_observed)
141
+ except BaseException as exc:
142
+ # Cancellation is diagnostic too; always preserve the original exit.
143
+ transfer.error = type(exc).__name__
144
+ raise
145
+ finally:
146
+ logger.info(
147
+ "MCP HTTP trace=%s finished elapsed_ms=%.1f declared_bytes=%s "
148
+ "request_bytes=%d request_complete=%s status=%s "
149
+ "response_bytes=%d response_complete=%s disconnect=%s error=%s",
150
+ trace,
151
+ (monotonic() - started) * 1000,
152
+ declared,
153
+ transfer.request_bytes,
154
+ transfer.request_complete,
155
+ transfer.status,
156
+ transfer.response_bytes,
157
+ transfer.response_complete,
158
+ transfer.disconnect,
159
+ transfer.error,
160
+ )
@@ -14,13 +14,13 @@ from pathlib import Path
14
14
  from typing import TYPE_CHECKING, Annotated, Any, ClassVar
15
15
 
16
16
  import yaml # type: ignore[import-untyped]
17
- from fastmcp import FastMCP
18
17
  from mcp.types import Icon
19
18
  from pydantic import Field
20
19
 
21
20
  from .config import _PACKAGE_VERSION, get_global_settings
22
21
  from .errors import ErrorCode, create_error_response
23
22
  from .hacs_auto_refresh import hacs_refresh_lifespan
23
+ from .http_transport import HttpTransportFastMCP as FastMCP
24
24
  from .tools.helpers import raise_tool_error
25
25
  from .transforms import DEFAULT_PINNED_TOOLS
26
26
 
@@ -448,6 +448,10 @@
448
448
  "advanced.mcp_server_version.help": "Defaults to the package version. Overriding may confuse clients. Restart required.",
449
449
  "advanced.environment.label": "Environment",
450
450
  "advanced.environment.help": "development or production. Affects logging verbosity. Restart required.",
451
+ "advanced.http_transport_diagnostics.label": "HTTP transport diagnostics",
452
+ "advanced.http_transport_diagnostics.help": "Experimental. Log MCP HTTP byte counts, timing and completion at INFO level, without payloads or credentials. Does not confirm client receipt. HTTP only; restart required.",
453
+ "advanced.http_json_response.label": "JSON responses instead of streaming",
454
+ "advanced.http_json_response.help": "Experimental. Return a single JSON response instead of an SSE stream. Affects all HTTP clients on this server and disables streamed progress for these responses. HTTP only; restart required.",
451
455
  "advanced.log_level.label": "Log level",
452
456
  "advanced.log_level.help": "DEBUG/INFO/WARNING/ERROR/CRITICAL. Restart required.",
453
457
  "advanced.debug.label": "Debug mode",
@@ -3981,6 +3981,8 @@ const ADVANCED_FIELD_META = {
3981
3981
  environment: { label: "Environment", help: "'development' or 'production'. Affects logging verbosity. Restart required." },
3982
3982
  log_level: { label: "Log level", help: "DEBUG/INFO/WARNING/ERROR/CRITICAL. Set once at startup; restart required." },
3983
3983
  debug: { label: "Debug mode", help: "Verbose request logging. Logs sensitive data; do not enable in production. Restart required." },
3984
+ http_transport_diagnostics: { label: "HTTP transport diagnostics", help: "Experimental. Log MCP HTTP byte counts, timing and completion at INFO level, without payloads or credentials. Does not confirm client receipt. HTTP only; restart required." },
3985
+ http_json_response: { label: "JSON responses instead of streaming", help: "Experimental. Return a single JSON response instead of an SSE stream. Affects all HTTP clients on this server and disables streamed progress for these responses. HTTP only; restart required." },
3984
3986
  code_mode_max_duration: { label: "Code-mode max duration (s)", help: "Wall-clock budget per sandbox run. Range 1–300. Restart required." },
3985
3987
  code_mode_max_memory: { label: "Code-mode max memory (bytes)", help: "RSS cap per sandbox run. Range 1 MB–256 MB. Restart required." },
3986
3988
  code_mode_max_recursion: { label: "Code-mode max recursion", help: "Recursion-depth cap per sandbox run. Restart required." },
@@ -4002,6 +4004,7 @@ const ADVANCED_RESTART_REQUIRED = new Set([
4002
4004
  "ha_tool_concurrency",
4003
4005
  "enabled_tool_modules", "enable_websocket",
4004
4006
  "log_level", "debug",
4007
+ "http_transport_diagnostics", "http_json_response",
4005
4008
  "mcp_server_name", "mcp_server_version", "environment",
4006
4009
  // fuzzy_threshold is read once by SmartSearchTools at the
4007
4010
  // lazy-init singleton (tools/smart_search/) — changes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 8.4.3.dev2624
3
+ Version: 8.4.3.dev2625
4
4
  Summary: Home Assistant MCP Server - Complete control of Home Assistant through MCP
5
5
  Author-email: Julien <github@qc-h.net>
6
6
  License: MIT
@@ -13,6 +13,7 @@ src/ha_mcp/config.py
13
13
  src/ha_mcp/errors.py
14
14
  src/ha_mcp/ha_request_queue.py
15
15
  src/ha_mcp/hacs_auto_refresh.py
16
+ src/ha_mcp/http_transport.py
16
17
  src/ha_mcp/llm_exposure.py
17
18
  src/ha_mcp/log_filters.py
18
19
  src/ha_mcp/py.typed