ha-mcp-dev 8.4.3.dev2539__tar.gz → 8.4.3.dev2544__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 (307) hide show
  1. {ha_mcp_dev-8.4.3.dev2539/src/ha_mcp_dev.egg-info → ha_mcp_dev-8.4.3.dev2544}/PKG-INFO +4 -4
  2. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/README.md +3 -3
  3. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/pyproject.toml +1 -1
  4. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/backup_manager.py +54 -6
  5. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/config.py +5 -5
  6. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/en.json +1 -1
  7. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/settings.js +1 -1
  8. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_bug_report.py +22 -3
  9. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_search.py +4 -1
  10. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/util_helpers.py +3 -1
  11. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544/src/ha_mcp_dev.egg-info}/PKG-INFO +4 -4
  12. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/LICENSE +0 -0
  13. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/MANIFEST.in +0 -0
  14. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/setup.cfg +0 -0
  15. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/__init__.py +0 -0
  16. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/__main__.py +0 -0
  17. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_pypi_marker +0 -0
  18. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_rich_compat.py +0 -0
  19. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/__init__.py +0 -0
  20. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/requirements.txt +0 -0
  21. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
  22. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
  23. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
  24. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
  25. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
  26. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
  27. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
  28. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
  29. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
  30. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
  31. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
  32. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
  33. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
  34. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/client.py +0 -0
  35. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
  36. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
  37. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
  38. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
  39. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
  40. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
  41. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
  42. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
  43. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
  44. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
  45. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
  46. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
  47. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
  48. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
  49. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
  50. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
  51. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
  52. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
  53. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
  54. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
  55. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
  56. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
  57. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/server.py +0 -0
  58. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
  59. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
  60. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
  61. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
  62. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
  63. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
  64. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
  65. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
  66. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
  67. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
  68. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
  69. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
  70. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
  71. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
  72. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
  73. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
  74. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
  75. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
  76. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_vendor/websockets/version.py +0 -0
  77. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/_version.py +0 -0
  78. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/auth/__init__.py +0 -0
  79. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/auth/consent_form.py +0 -0
  80. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/auth/oidc_compat.py +0 -0
  81. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/auth/provider.py +0 -0
  82. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/browser_landing.py +0 -0
  83. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/client/__init__.py +0 -0
  84. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/client/rest_client.py +0 -0
  85. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/client/supervisor_client.py +0 -0
  86. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/client/websocket_client.py +0 -0
  87. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/client/websocket_listener.py +0 -0
  88. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  89. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  90. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  91. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  92. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  93. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
  94. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/errors.py +0 -0
  95. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/hacs_auto_refresh.py +0 -0
  96. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/llm_exposure.py +0 -0
  97. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/log_filters.py +0 -0
  98. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/policy/__init__.py +0 -0
  99. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/policy/approval_queue.py +0 -0
  100. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/policy/editing.py +0 -0
  101. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/policy/evaluator.py +0 -0
  102. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/policy/handlers.py +0 -0
  103. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/policy/middleware.py +0 -0
  104. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/policy/model.py +0 -0
  105. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/policy/persistence.py +0 -0
  106. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/policy/value_sources.py +0 -0
  107. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/py.typed +0 -0
  108. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/read_only.py +0 -0
  109. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/redaction.py +0 -0
  110. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/renamed_tools.py +0 -0
  111. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  112. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  113. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  114. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  115. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  116. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  117. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  118. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  119. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  120. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  121. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/area-target-over-entity-list/case.yaml +0 -0
  122. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/arrive-home-automation/case.yaml +0 -0
  123. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/assist-shortcut-card/case.yaml +0 -0
  124. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/avg-temperature/case.yaml +0 -0
  125. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/backup-deletion-confirmation/case.yaml +0 -0
  126. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/blueprint-authoring/case.yaml +0 -0
  127. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/button-event-entity/case.yaml +0 -0
  128. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/device-id-trigger-migration/case.yaml +0 -0
  129. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/helper-flow-fields-not-platform-yaml/case.yaml +0 -0
  130. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/media-player-song/case.yaml +0 -0
  131. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/motion-light-automation-mode/case.yaml +0 -0
  132. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/rename-entity-impact-analysis/case.yaml +0 -0
  133. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/template-attributes-yaml-exception/case.yaml +0 -0
  134. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/timer-finished-automation/case.yaml +0 -0
  135. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/evals/vacuum-last-clean/case.yaml +0 -0
  136. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/scripts/check_eval_cases.py +0 -0
  137. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  138. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  139. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  140. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/backups.md +0 -0
  141. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  142. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  143. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  144. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  145. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  146. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  147. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  148. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  149. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  150. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  151. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  152. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/server.py +0 -0
  153. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/__init__.py +0 -0
  154. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
  155. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
  156. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  157. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  158. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  159. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  160. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/_i18n.py +0 -0
  161. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/_locale_policy.py +0 -0
  162. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  163. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  164. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/_theme.py +0 -0
  165. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
  166. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/README.md +0 -0
  167. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/cs.json +0 -0
  168. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/de.json +0 -0
  169. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/eo.json +0 -0
  170. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/es.json +0 -0
  171. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
  172. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/it.json +0 -0
  173. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/ko.json +0 -0
  174. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
  175. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
  176. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
  177. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
  178. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/tlh.json +0 -0
  179. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
  180. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/settings.css +0 -0
  181. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/settings_ui/settings.html +0 -0
  182. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/smoke_test.py +0 -0
  183. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  184. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/strict_bps.py +0 -0
  185. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/__init__.py +0 -0
  186. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/auto_backup.py +0 -0
  187. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/backup.py +0 -0
  188. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  189. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/best_practice_result.py +0 -0
  190. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/best_practice_variables.py +0 -0
  191. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/blueprint_sources.py +0 -0
  192. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/blueprint_substitute.py +0 -0
  193. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/blueprint_write.py +0 -0
  194. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/bulk_selector.py +0 -0
  195. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/component_api.py +0 -0
  196. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/component_config_entries.py +0 -0
  197. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/component_config_reads.py +0 -0
  198. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/component_devices.py +0 -0
  199. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/component_registries.py +0 -0
  200. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
  201. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  202. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
  203. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
  204. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
  205. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/config_entry_identity.py +0 -0
  206. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/config_entry_reconfigure.py +0 -0
  207. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/config_entry_reload_watch.py +0 -0
  208. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/device_control.py +0 -0
  209. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/error_log_parsing.py +0 -0
  210. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/hacs_registration.py +0 -0
  211. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/helpers.py +0 -0
  212. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/integration_reconfigure.py +0 -0
  213. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/log_common.py +0 -0
  214. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/log_sources.py +0 -0
  215. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/log_sources_supervisor.py +0 -0
  216. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/radio/__init__.py +0 -0
  217. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/radio/base.py +0 -0
  218. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/radio/matter.py +0 -0
  219. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/radio/thread.py +0 -0
  220. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  221. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/radio/zwave.py +0 -0
  222. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/reference_validator.py +0 -0
  223. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/registry.py +0 -0
  224. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/renamed_tool_middleware.py +0 -0
  225. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  226. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  227. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  228. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  229. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  230. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  231. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/smart_search/_graph.py +0 -0
  232. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  233. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  234. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  235. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  236. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_addons.py +0 -0
  237. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_areas.py +0 -0
  238. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_assist_pipeline.py +0 -0
  239. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  240. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_calendar.py +0 -0
  241. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_camera.py +0 -0
  242. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_categories.py +0 -0
  243. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_code.py +0 -0
  244. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  245. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  246. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  247. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  248. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  249. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  250. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_dev.py +0 -0
  251. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_energy.py +0 -0
  252. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_entities.py +0 -0
  253. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  254. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_groups.py +0 -0
  255. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_hacs.py +0 -0
  256. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_history.py +0 -0
  257. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_integrations.py +0 -0
  258. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_labels.py +0 -0
  259. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_logs.py +0 -0
  260. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_radio.py +0 -0
  261. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_registry.py +0 -0
  262. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_resources.py +0 -0
  263. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_security_policy.py +0 -0
  264. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_service.py +0 -0
  265. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_services.py +0 -0
  266. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_system.py +0 -0
  267. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_themes.py +0 -0
  268. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_todo.py +0 -0
  269. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_traces.py +0 -0
  270. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_updates.py +0 -0
  271. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_utility.py +0 -0
  272. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  273. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  274. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
  275. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/tools_zones.py +0 -0
  276. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/tools/validation_middleware.py +0 -0
  277. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/transforms/__init__.py +0 -0
  278. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/transforms/categorized_search.py +0 -0
  279. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  280. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/transport_security.py +0 -0
  281. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/update_check.py +0 -0
  282. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/__init__.py +0 -0
  283. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/config_hash.py +0 -0
  284. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/config_write_lock.py +0 -0
  285. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/data_paths.py +0 -0
  286. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/device_registry_semantics.py +0 -0
  287. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/domain_handlers.py +0 -0
  288. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/entity_membership.py +0 -0
  289. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  290. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  291. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/operation_manager.py +0 -0
  292. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/python_sandbox.py +0 -0
  293. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/skill_loader.py +0 -0
  294. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/utils/usage_logger.py +0 -0
  295. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/visibility/__init__.py +0 -0
  296. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/visibility/enforcement.py +0 -0
  297. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/visibility/model.py +0 -0
  298. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/visibility/persistence.py +0 -0
  299. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp/visibility/resolver.py +0 -0
  300. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  301. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  302. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  303. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  304. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  305. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/tests/__init__.py +0 -0
  306. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/tests/test_constants.py +0 -0
  307. {ha_mcp_dev-8.4.3.dev2539 → ha_mcp_dev-8.4.3.dev2544}/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.dev2539
3
+ Version: 8.4.3.dev2544
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
@@ -40,7 +40,7 @@ Dynamic: license-file
40
40
  <!-- mcp-name: io.github.homeassistant-ai/ha-mcp -->
41
41
 
42
42
  <p align="center">
43
- <img src="https://img.shields.io/badge/tools-88-blue" alt="95+ Tools">
43
+ <img src="https://img.shields.io/badge/tools-87-blue" alt="95+ Tools">
44
44
  <a href="https://github.com/homeassistant-ai/ha-mcp/releases"><img src="https://img.shields.io/github/v/release/homeassistant-ai/ha-mcp" alt="Release"></a>
45
45
  <a href="https://github.com/homeassistant-ai/ha-mcp/actions/workflows/e2e-tests.yml"><img src="https://img.shields.io/github/actions/workflow/status/homeassistant-ai/ha-mcp/e2e-tests.yml?branch=master&label=E2E%20Tests" alt="E2E Tests"></a>
46
46
  <a href="LICENSE.md"><img src="https://img.shields.io/github/license/homeassistant-ai/ha-mcp.svg" alt="License"></a>
@@ -247,7 +247,7 @@ Spend less time configuring, more time enjoying your smart home.
247
247
  <details>
248
248
  <!-- TOOLS_TABLE_START -->
249
249
 
250
- <summary><b>Complete Tool List (88 tools)</b></summary>
250
+ <summary><b>Complete Tool List (87 tools)</b></summary>
251
251
 
252
252
  | Category | Tools |
253
253
  |----------|-------|
@@ -255,7 +255,7 @@ Spend less time configuring, more time enjoying your smart home.
255
255
  | **Areas & Floors** | `ha_list_floors_areas`, `ha_remove_area_or_floor`, `ha_set_area_or_floor` |
256
256
  | **Assist** | `ha_manage_pipeline` |
257
257
  | **Automations** | `ha_config_get_automation`, `ha_config_remove_automation`, `ha_config_set_automation` |
258
- | **Blueprints** | `ha_get_blueprint`, `ha_import_blueprint` |
258
+ | **Blueprints** | `ha_manage_blueprints` |
259
259
  | **Calendar** | `ha_config_get_calendar_events`, `ha_config_remove_calendar_event`, `ha_config_set_calendar_event` |
260
260
  | **Camera** | `ha_get_camera_image` |
261
261
  | **Dashboard** | `ha_get_dashboard_screenshot` *(beta)* |
@@ -8,7 +8,7 @@
8
8
  <!-- mcp-name: io.github.homeassistant-ai/ha-mcp -->
9
9
 
10
10
  <p align="center">
11
- <img src="https://img.shields.io/badge/tools-88-blue" alt="95+ Tools">
11
+ <img src="https://img.shields.io/badge/tools-87-blue" alt="95+ Tools">
12
12
  <a href="https://github.com/homeassistant-ai/ha-mcp/releases"><img src="https://img.shields.io/github/v/release/homeassistant-ai/ha-mcp" alt="Release"></a>
13
13
  <a href="https://github.com/homeassistant-ai/ha-mcp/actions/workflows/e2e-tests.yml"><img src="https://img.shields.io/github/actions/workflow/status/homeassistant-ai/ha-mcp/e2e-tests.yml?branch=master&label=E2E%20Tests" alt="E2E Tests"></a>
14
14
  <a href="LICENSE.md"><img src="https://img.shields.io/github/license/homeassistant-ai/ha-mcp.svg" alt="License"></a>
@@ -215,7 +215,7 @@ Spend less time configuring, more time enjoying your smart home.
215
215
  <details>
216
216
  <!-- TOOLS_TABLE_START -->
217
217
 
218
- <summary><b>Complete Tool List (88 tools)</b></summary>
218
+ <summary><b>Complete Tool List (87 tools)</b></summary>
219
219
 
220
220
  | Category | Tools |
221
221
  |----------|-------|
@@ -223,7 +223,7 @@ Spend less time configuring, more time enjoying your smart home.
223
223
  | **Areas & Floors** | `ha_list_floors_areas`, `ha_remove_area_or_floor`, `ha_set_area_or_floor` |
224
224
  | **Assist** | `ha_manage_pipeline` |
225
225
  | **Automations** | `ha_config_get_automation`, `ha_config_remove_automation`, `ha_config_set_automation` |
226
- | **Blueprints** | `ha_get_blueprint`, `ha_import_blueprint` |
226
+ | **Blueprints** | `ha_manage_blueprints` |
227
227
  | **Calendar** | `ha_config_get_calendar_events`, `ha_config_remove_calendar_event`, `ha_config_set_calendar_event` |
228
228
  | **Camera** | `ha_get_camera_image` |
229
229
  | **Dashboard** | `ha_get_dashboard_screenshot` *(beta)* |
@@ -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.dev2539"
7
+ version = "8.4.3.dev2544"
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
@@ -7,7 +7,11 @@ Storage path resolution
7
7
  -----------------------
8
8
  ``Settings.auto_backup_dir`` overrides; otherwise defaults to
9
9
  ``/data/ha_mcp_backups`` in the add-on (SUPERVISOR_TOKEN set + ``/data``
10
- exists), else ``${XDG_DATA_HOME:-~/.local/share}/ha_mcp/backups``.
10
+ exists), else ``<data dir>/backups`` where the data dir is what
11
+ ``utils.data_paths.get_data_dir`` resolves (``HA_MCP_CONFIG_DIR``,
12
+ ``~/.ha-mcp``, or the tmpdir fallback). Installs that still hold snapshots
13
+ under the pre-#2372 default ``${XDG_DATA_HOME:-~/.local/share}/ha_mcp/backups``
14
+ keep using that directory; see ``_resolve_default_dir``.
11
15
 
12
16
  File format
13
17
  -----------
@@ -55,6 +59,7 @@ import yaml # type: ignore[import-untyped]
55
59
  from fastmcp.exceptions import ToolError
56
60
 
57
61
  from .client.rest_client import HomeAssistantConnectionError, HomeAssistantError
62
+ from .utils.data_paths import get_data_dir
58
63
 
59
64
  logger = logging.getLogger(__name__)
60
65
 
@@ -263,17 +268,60 @@ def _now_iso() -> str:
263
268
  return datetime.now(UTC).isoformat()
264
269
 
265
270
 
266
- def _resolve_default_dir() -> Path:
267
- """Pick a sane default backup directory for the current deployment mode."""
268
- # Addon detection: Supervisor sets SUPERVISOR_TOKEN AND /data exists.
269
- if os.environ.get("SUPERVISOR_TOKEN") and Path("/data").is_dir():
270
- return Path("/data/ha_mcp_backups")
271
+ # Add-on default. Named in the add-on option descriptions, so it stays put.
272
+ _ADDON_BACKUP_DIR = Path("/data/ha_mcp_backups")
273
+
274
+
275
+ def _legacy_default_dir() -> Path:
276
+ """The non-add-on default before #2372: XDG user-data, outside the data dir."""
271
277
  xdg = os.environ.get("XDG_DATA_HOME")
272
278
  if xdg:
273
279
  return Path(xdg) / "ha_mcp" / "backups"
274
280
  return (Path.home() / ".local" / "share" / "ha_mcp" / "backups").resolve()
275
281
 
276
282
 
283
+ def _holds_files(path: Path) -> bool:
284
+ """Whether ``path`` is a directory with at least one entry.
285
+
286
+ An unreadable or missing directory counts as empty: nothing in it can be
287
+ listed or restored from, so there is nothing to keep using.
288
+ """
289
+ try:
290
+ return any(path.iterdir())
291
+ except OSError:
292
+ return False
293
+
294
+
295
+ def _resolve_default_dir() -> Path:
296
+ """Pick a sane default backup directory for the current deployment mode.
297
+
298
+ Add-on (Supervisor sets ``SUPERVISOR_TOKEN`` and ``/data`` exists):
299
+ ``/data/ha_mcp_backups``. Otherwise ``backups/`` inside the data dir, the
300
+ directory that already holds the settings and that every documented
301
+ Docker recipe persists as the ``ha-mcp-data`` volume. The previous default,
302
+ ``${XDG_DATA_HOME:-~/.local/share}/ha_mcp/backups``, sat outside that
303
+ volume: under a ``read_only`` root it was EROFS, which fails the mandatory
304
+ pre-write snapshots closed, and on a writable root the snapshots were
305
+ discarded with the container (#2372).
306
+
307
+ An install that already holds snapshots under the previous default keeps
308
+ using it so its restore points stay listed and rotation keeps counting
309
+ them; only installs with nothing there move to the data dir.
310
+ """
311
+ if os.environ.get("SUPERVISOR_TOKEN") and _ADDON_BACKUP_DIR.parent.is_dir():
312
+ return _ADDON_BACKUP_DIR
313
+ legacy = _legacy_default_dir()
314
+ if _holds_files(legacy):
315
+ logger.info(
316
+ "Auto-backup: keeping existing backup dir %s (new installs default "
317
+ "to %s; set HAMCP_BACKUP_DIR to choose explicitly)",
318
+ legacy,
319
+ get_data_dir() / "backups",
320
+ )
321
+ return legacy
322
+ return get_data_dir() / "backups"
323
+
324
+
277
325
  # Sentinel returned by ``BackupManager._fetch_config_for_snapshot`` when there
278
326
  # is nothing to snapshot — a handled transient fetch failure (already logged),
279
327
  # or a None config for an entity that did not exist. Distinct from any real
@@ -400,7 +400,7 @@ class Settings(BaseSettings):
400
400
 
401
401
  # Backup directory override. Empty ("") resolves at runtime to a
402
402
  # deployment-mode default: ``/data/ha_mcp_backups`` in the add-on,
403
- # otherwise ``${XDG_DATA_HOME:-~/.local/share}/ha_mcp/backups``.
403
+ # otherwise ``<data dir>/backups`` (see ``backup_manager._resolve_default_dir``).
404
404
  auto_backup_dir: str = Field("", alias="HAMCP_BACKUP_DIR")
405
405
 
406
406
  # Calendar event backups query an ahead-of-now window to locate the
@@ -776,8 +776,8 @@ FEATURE_FLAG_FIELDS: tuple[FeatureFlagField, ...] = (
776
776
  )
777
777
 
778
778
  # Override-file location is the same data dir that holds tool_config.json
779
- # (resolved via ``utils.data_paths.get_data_dir`` — addon ``/data``,
780
- # ``HA_MCP_CONFIG_DIR``, ``XDG_DATA_HOME``, or a tmpdir fallback).
779
+ # (resolved via ``utils.data_paths.get_data_dir`` — ``HA_MCP_CONFIG_DIR``,
780
+ # addon ``/data``, ``~/.ha-mcp``, or a tmpdir fallback).
781
781
  # Imported lazily inside helpers to avoid a circular import at module
782
782
  # load.
783
783
  _FEATURE_FLAG_OVERRIDE_FILENAME = "feature_flags.json"
@@ -1656,8 +1656,8 @@ BACKUP_OVERRIDE_FIELDS: tuple[BackupOverrideField, ...] = (
1656
1656
  )
1657
1657
 
1658
1658
  # Override-file location is the same data dir that holds tool_config.json
1659
- # (resolved via ``utils.data_paths.get_data_dir`` — addon ``/data``,
1660
- # ``HA_MCP_CONFIG_DIR``, ``XDG_DATA_HOME``, or a tmpdir fallback).
1659
+ # (resolved via ``utils.data_paths.get_data_dir`` — ``HA_MCP_CONFIG_DIR``,
1660
+ # addon ``/data``, ``~/.ha-mcp``, or a tmpdir fallback).
1661
1661
  # Imported lazily inside helpers to avoid a circular import at module
1662
1662
  # load (``utils.data_paths`` imports from ``_version`` which imports
1663
1663
  # from ``config`` transitively in some test layouts).
@@ -251,7 +251,7 @@
251
251
  "backup.fields.auto_backup_retain_per_entity.label": "Retain per entity",
252
252
  "backup.fields.auto_backup_retain_per_entity.help": "Maximum snapshots kept per entity (1–10000). Older ones rotate out.",
253
253
  "backup.fields.auto_backup_dir.label": "Backup directory override",
254
- "backup.fields.auto_backup_dir.help": "Leave empty to use the default directory; otherwise enter an absolute path.",
254
+ "backup.fields.auto_backup_dir.help": "Leave empty for the default: /data/ha_mcp_backups in the App (add-on), otherwise the backups/ subdirectory of the ha-mcp data directory; an install that already holds snapshots under the earlier default keeps using it. The directory in use is shown in the backup status. Or enter an absolute path.",
255
255
  "backup.fields.auto_backup_calendar_lookahead_days.label": "Calendar lookahead (days)",
256
256
  "backup.fields.auto_backup_calendar_lookahead_days.help": "How far ahead to query calendar events for pre-edit snapshots. Range 1–365.",
257
257
  "backup.fields.enable_snapshot_delete.label": "Allow snapshot deletion",
@@ -1438,7 +1438,7 @@ const BACKUP_FIELD_LABELS = {
1438
1438
  },
1439
1439
  auto_backup_dir: {
1440
1440
  label: 'Backup directory override',
1441
- help: 'Empty = default (/data/ha_mcp_backups in the App (add-on), $XDG_DATA_HOME/ha_mcp/backups otherwise). Override with an absolute path.',
1441
+ help: 'Leave empty for the default: /data/ha_mcp_backups in the App (add-on), otherwise the backups/ subdirectory of the ha-mcp data directory; an install that already holds snapshots under the earlier default keeps using it. The directory in use is shown in the backup status. Or enter an absolute path.',
1442
1442
  },
1443
1443
  auto_backup_calendar_lookahead_days: {
1444
1444
  label: 'Calendar lookahead (days)',
@@ -29,14 +29,20 @@ from ha_mcp import __version__
29
29
  from .._version import get_version, is_embedded, is_running_in_addon
30
30
  from ..client.supervisor_client import make_supervisor_httpx_client
31
31
  from ..config import Settings, get_global_settings
32
+ from ..errors import create_validation_error
32
33
  from ..utils.usage_logger import (
33
34
  AVG_LOG_ENTRIES_PER_TOOL,
34
35
  get_recent_logs,
35
36
  get_startup_logs,
36
37
  )
37
38
  from .component_api import get_component_caps
38
- from .helpers import log_tool_usage, register_tool_methods
39
- from .util_helpers import ANSI_ESCAPE_RE, JSON_STRING_COERCION, project_fields
39
+ from .helpers import log_tool_usage, raise_tool_error, register_tool_methods
40
+ from .util_helpers import (
41
+ ANSI_ESCAPE_RE,
42
+ JSON_STRING_COERCION,
43
+ parse_string_list_param,
44
+ project_fields,
45
+ )
40
46
 
41
47
  logger = logging.getLogger(__name__)
42
48
 
@@ -948,6 +954,19 @@ class BugReportTools:
948
954
  usual cause, and refreshing the MCP connection is the fix
949
955
  - `suggested_title`, `duplicate_check_urls`, `anonymization_guide`
950
956
  """
957
+ # Validate fields= before anything is collected: the projection at the
958
+ # end was the only parse, outside any ValueError handler, so a
959
+ # malformed value reached FastMCP as a bare exception after the whole
960
+ # report had been assembled.
961
+ parsed_fields: list[str] | None = None
962
+ if fields is not None:
963
+ try:
964
+ parsed_fields = parse_string_list_param(
965
+ fields, "fields", allow_csv=True
966
+ )
967
+ except ValueError as exc:
968
+ raise_tool_error(create_validation_error(str(exc), parameter="fields"))
969
+
951
970
  # Detect installation method, platform, and runtime config.
952
971
  install_method = _detect_installation_method()
953
972
  platform_info = _detect_platform()
@@ -1166,7 +1185,7 @@ class BugReportTools:
1166
1185
  "CRITICAL: Always ANONYMIZE the report BEFORE presenting it in markdown code blocks!"
1167
1186
  ),
1168
1187
  }
1169
- return project_fields(result, fields)
1188
+ return project_fields(result, parsed_fields)
1170
1189
 
1171
1190
 
1172
1191
  def register_bug_report_tools(mcp: Any, client: Any, **kwargs: Any) -> None:
@@ -4121,7 +4121,10 @@ class SearchTools:
4121
4121
  )
4122
4122
  include_dismissed_repairs_bool = bool(include_dismissed_repairs)
4123
4123
 
4124
- parsed_domains = parse_string_list_param(domains, "domains", allow_csv=True)
4124
+ try:
4125
+ parsed_domains = parse_string_list_param(domains, "domains", allow_csv=True)
4126
+ except ValueError as exc:
4127
+ raise_tool_error(create_validation_error(str(exc), parameter="domains"))
4125
4128
 
4126
4129
  result = await self._collect_overview(
4127
4130
  _OverviewInputs(
@@ -205,7 +205,9 @@ def _parse_json_to_str_list(s: str, param_name: str) -> list[str]:
205
205
  if not all(isinstance(item, str) for item in parsed):
206
206
  raise ValueError(f"{param_name} must be a JSON array of strings")
207
207
  return parsed
208
- except json.JSONDecodeError as e:
208
+ except (json.JSONDecodeError, RecursionError) as e:
209
+ # RecursionError: nested past the interpreter's limit is still
210
+ # "not valid JSON" to the caller, which expects ValueError here.
209
211
  raise ValueError(f"Invalid JSON in {param_name}: {e}") from e
210
212
 
211
213
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 8.4.3.dev2539
3
+ Version: 8.4.3.dev2544
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
@@ -40,7 +40,7 @@ Dynamic: license-file
40
40
  <!-- mcp-name: io.github.homeassistant-ai/ha-mcp -->
41
41
 
42
42
  <p align="center">
43
- <img src="https://img.shields.io/badge/tools-88-blue" alt="95+ Tools">
43
+ <img src="https://img.shields.io/badge/tools-87-blue" alt="95+ Tools">
44
44
  <a href="https://github.com/homeassistant-ai/ha-mcp/releases"><img src="https://img.shields.io/github/v/release/homeassistant-ai/ha-mcp" alt="Release"></a>
45
45
  <a href="https://github.com/homeassistant-ai/ha-mcp/actions/workflows/e2e-tests.yml"><img src="https://img.shields.io/github/actions/workflow/status/homeassistant-ai/ha-mcp/e2e-tests.yml?branch=master&label=E2E%20Tests" alt="E2E Tests"></a>
46
46
  <a href="LICENSE.md"><img src="https://img.shields.io/github/license/homeassistant-ai/ha-mcp.svg" alt="License"></a>
@@ -247,7 +247,7 @@ Spend less time configuring, more time enjoying your smart home.
247
247
  <details>
248
248
  <!-- TOOLS_TABLE_START -->
249
249
 
250
- <summary><b>Complete Tool List (88 tools)</b></summary>
250
+ <summary><b>Complete Tool List (87 tools)</b></summary>
251
251
 
252
252
  | Category | Tools |
253
253
  |----------|-------|
@@ -255,7 +255,7 @@ Spend less time configuring, more time enjoying your smart home.
255
255
  | **Areas & Floors** | `ha_list_floors_areas`, `ha_remove_area_or_floor`, `ha_set_area_or_floor` |
256
256
  | **Assist** | `ha_manage_pipeline` |
257
257
  | **Automations** | `ha_config_get_automation`, `ha_config_remove_automation`, `ha_config_set_automation` |
258
- | **Blueprints** | `ha_get_blueprint`, `ha_import_blueprint` |
258
+ | **Blueprints** | `ha_manage_blueprints` |
259
259
  | **Calendar** | `ha_config_get_calendar_events`, `ha_config_remove_calendar_event`, `ha_config_set_calendar_event` |
260
260
  | **Camera** | `ha_get_camera_image` |
261
261
  | **Dashboard** | `ha_get_dashboard_screenshot` *(beta)* |