ha-mcp-dev 8.1.1.dev2263__tar.gz → 8.1.1.dev2268__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 (259) hide show
  1. {ha_mcp_dev-8.1.1.dev2263/src/ha_mcp_dev.egg-info → ha_mcp_dev-8.1.1.dev2268}/PKG-INFO +4 -4
  2. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/README.md +3 -3
  3. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/pyproject.toml +1 -1
  4. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/settings_ui/_i18n.py +25 -1
  5. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/settings_ui/locales/README.md +9 -3
  6. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268/src/ha_mcp_dev.egg-info}/PKG-INFO +4 -4
  7. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/LICENSE +0 -0
  8. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/MANIFEST.in +0 -0
  9. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/setup.cfg +0 -0
  10. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/__init__.py +0 -0
  11. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/__main__.py +0 -0
  12. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_pypi_marker +0 -0
  13. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/__init__.py +0 -0
  14. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/requirements.txt +0 -0
  15. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
  16. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
  17. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
  18. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
  19. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
  20. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
  21. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
  22. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
  23. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
  24. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
  25. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
  26. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
  27. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
  28. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/client.py +0 -0
  29. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
  30. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
  31. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
  32. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
  33. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
  34. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
  35. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
  36. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
  37. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
  38. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
  39. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
  40. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
  41. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
  42. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
  43. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
  44. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
  45. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
  46. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
  47. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
  48. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
  49. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
  50. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
  51. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/server.py +0 -0
  52. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
  53. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
  54. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
  55. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
  56. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
  57. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
  58. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
  59. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
  60. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
  61. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
  62. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
  63. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
  64. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
  65. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
  66. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
  67. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
  68. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
  69. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
  70. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_vendor/websockets/version.py +0 -0
  71. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/_version.py +0 -0
  72. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/auth/__init__.py +0 -0
  73. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/auth/consent_form.py +0 -0
  74. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/auth/provider.py +0 -0
  75. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/backup_manager.py +0 -0
  76. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/browser_landing.py +0 -0
  77. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/client/__init__.py +0 -0
  78. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/client/rest_client.py +0 -0
  79. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/client/supervisor_client.py +0 -0
  80. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/client/websocket_client.py +0 -0
  81. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/client/websocket_listener.py +0 -0
  82. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/config.py +0 -0
  83. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  84. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  85. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  86. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  87. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  88. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
  89. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/errors.py +0 -0
  90. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/llm_exposure.py +0 -0
  91. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/policy/__init__.py +0 -0
  92. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/policy/approval_queue.py +0 -0
  93. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/policy/editing.py +0 -0
  94. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/policy/evaluator.py +0 -0
  95. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/policy/handlers.py +0 -0
  96. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/policy/middleware.py +0 -0
  97. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/policy/model.py +0 -0
  98. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/policy/persistence.py +0 -0
  99. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/policy/value_sources.py +0 -0
  100. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/py.typed +0 -0
  101. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/read_only.py +0 -0
  102. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  103. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  104. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  105. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  106. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  107. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  108. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  109. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  110. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  111. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  112. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  113. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  114. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  115. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  116. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  117. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  118. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  119. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  120. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  121. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  122. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  123. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  124. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  125. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  126. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  127. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/server.py +0 -0
  128. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/settings_ui/__init__.py +0 -0
  129. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
  130. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
  131. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  132. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  133. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  134. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  135. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  136. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  137. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/settings_ui/_theme.py +0 -0
  138. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
  139. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/settings_ui/locales/de.json +0 -0
  140. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/settings_ui/locales/en.json +0 -0
  141. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/settings_ui/locales/es.json +0 -0
  142. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
  143. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/settings_ui/locales/it.json +0 -0
  144. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
  145. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
  146. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
  147. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/settings_ui/settings.css +0 -0
  148. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/settings_ui/settings.html +0 -0
  149. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/settings_ui/settings.js +0 -0
  150. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/smoke_test.py +0 -0
  151. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  152. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/strict_bps.py +0 -0
  153. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/__init__.py +0 -0
  154. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/auto_backup.py +0 -0
  155. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/backup.py +0 -0
  156. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  157. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/best_practice_result.py +0 -0
  158. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/best_practice_variables.py +0 -0
  159. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/component_api.py +0 -0
  160. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/component_config_reads.py +0 -0
  161. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/component_devices.py +0 -0
  162. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/component_registries.py +0 -0
  163. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
  164. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  165. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
  166. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
  167. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
  168. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/device_control.py +0 -0
  169. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/hacs_registration.py +0 -0
  170. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/helpers.py +0 -0
  171. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/radio/__init__.py +0 -0
  172. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/radio/base.py +0 -0
  173. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/radio/matter.py +0 -0
  174. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/radio/thread.py +0 -0
  175. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  176. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/radio/zwave.py +0 -0
  177. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/reference_validator.py +0 -0
  178. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/registry.py +0 -0
  179. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  180. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  181. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  182. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  183. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  184. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  185. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  186. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  187. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  188. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  189. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_addons.py +0 -0
  190. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_areas.py +0 -0
  191. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  192. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  193. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_calendar.py +0 -0
  194. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_camera.py +0 -0
  195. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_categories.py +0 -0
  196. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_code.py +0 -0
  197. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  198. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  199. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  200. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  201. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  202. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  203. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_dev.py +0 -0
  204. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_energy.py +0 -0
  205. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_entities.py +0 -0
  206. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  207. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_groups.py +0 -0
  208. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_hacs.py +0 -0
  209. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_history.py +0 -0
  210. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_integrations.py +0 -0
  211. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_labels.py +0 -0
  212. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_radio.py +0 -0
  213. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_registry.py +0 -0
  214. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_resources.py +0 -0
  215. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_search.py +0 -0
  216. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_security_policy.py +0 -0
  217. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_service.py +0 -0
  218. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_services.py +0 -0
  219. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_system.py +0 -0
  220. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_themes.py +0 -0
  221. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_todo.py +0 -0
  222. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_traces.py +0 -0
  223. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_updates.py +0 -0
  224. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_utility.py +0 -0
  225. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  226. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  227. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
  228. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/tools_zones.py +0 -0
  229. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/util_helpers.py +0 -0
  230. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/tools/validation_middleware.py +0 -0
  231. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/transforms/__init__.py +0 -0
  232. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/transforms/categorized_search.py +0 -0
  233. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  234. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/transport_security.py +0 -0
  235. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/update_check.py +0 -0
  236. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/utils/__init__.py +0 -0
  237. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/utils/config_hash.py +0 -0
  238. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/utils/config_write_lock.py +0 -0
  239. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/utils/data_paths.py +0 -0
  240. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/utils/domain_handlers.py +0 -0
  241. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  242. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  243. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/utils/operation_manager.py +0 -0
  244. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/utils/python_sandbox.py +0 -0
  245. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/utils/skill_loader.py +0 -0
  246. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/utils/usage_logger.py +0 -0
  247. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/visibility/__init__.py +0 -0
  248. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/visibility/enforcement.py +0 -0
  249. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/visibility/model.py +0 -0
  250. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/visibility/persistence.py +0 -0
  251. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp/visibility/resolver.py +0 -0
  252. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  253. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  254. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  255. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  256. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  257. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/tests/__init__.py +0 -0
  258. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/tests/test_constants.py +0 -0
  259. {ha_mcp_dev-8.1.1.dev2263 → ha_mcp_dev-8.1.1.dev2268}/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.1.1.dev2263
3
+ Version: 8.1.1.dev2268
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-87-blue" alt="95+ Tools">
43
+ <img src="https://img.shields.io/badge/tools-88-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 (87 tools)</b></summary>
250
+ <summary><b>Complete Tool List (88 tools)</b></summary>
251
251
 
252
252
  | Category | Tools |
253
253
  |----------|-------|
@@ -276,7 +276,7 @@ Spend less time configuring, more time enjoying your smart home.
276
276
  | **Scripts** | `ha_config_get_script`, `ha_config_remove_script`, `ha_config_set_script` |
277
277
  | **Search & Discovery** | `ha_get_overview`, `ha_get_state`, `ha_search` |
278
278
  | **Service & Device Control** | `ha_bulk_control`, `ha_call_event`, `ha_call_service`, `ha_get_operation_status`, `ha_list_services` |
279
- | **System** | `ha_config_get_yaml` *(beta)*, `ha_config_set_yaml` *(beta)*, `ha_manage_backup`, `ha_manage_custom_tool` *(beta)*, `ha_manage_theme`, `ha_manage_updates`, `ha_reload_core`, `ha_restart` |
279
+ | **System** | `ha_config_get_yaml` *(beta)*, `ha_config_set_yaml` *(beta)*, `ha_manage_backup`, `ha_manage_custom_tool` *(beta)*, `ha_manage_security_policy`, `ha_manage_theme`, `ha_manage_updates`, `ha_reload_core`, `ha_restart` |
280
280
  | **Todo Lists** | `ha_get_todo`, `ha_remove_todo_item`, `ha_set_todo_item` |
281
281
  | **Utilities** | `ha_eval_template`, `ha_report_issue` |
282
282
  | **Zones** | `ha_get_zone`, `ha_remove_zone`, `ha_set_zone` |
@@ -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-87-blue" alt="95+ Tools">
11
+ <img src="https://img.shields.io/badge/tools-88-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 (87 tools)</b></summary>
218
+ <summary><b>Complete Tool List (88 tools)</b></summary>
219
219
 
220
220
  | Category | Tools |
221
221
  |----------|-------|
@@ -244,7 +244,7 @@ Spend less time configuring, more time enjoying your smart home.
244
244
  | **Scripts** | `ha_config_get_script`, `ha_config_remove_script`, `ha_config_set_script` |
245
245
  | **Search & Discovery** | `ha_get_overview`, `ha_get_state`, `ha_search` |
246
246
  | **Service & Device Control** | `ha_bulk_control`, `ha_call_event`, `ha_call_service`, `ha_get_operation_status`, `ha_list_services` |
247
- | **System** | `ha_config_get_yaml` *(beta)*, `ha_config_set_yaml` *(beta)*, `ha_manage_backup`, `ha_manage_custom_tool` *(beta)*, `ha_manage_theme`, `ha_manage_updates`, `ha_reload_core`, `ha_restart` |
247
+ | **System** | `ha_config_get_yaml` *(beta)*, `ha_config_set_yaml` *(beta)*, `ha_manage_backup`, `ha_manage_custom_tool` *(beta)*, `ha_manage_security_policy`, `ha_manage_theme`, `ha_manage_updates`, `ha_reload_core`, `ha_restart` |
248
248
  | **Todo Lists** | `ha_get_todo`, `ha_remove_todo_item`, `ha_set_todo_item` |
249
249
  | **Utilities** | `ha_eval_template`, `ha_report_issue` |
250
250
  | **Zones** | `ha_get_zone`, `ha_remove_zone`, `ha_set_zone` |
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "8.1.1.dev2263"
7
+ version = "8.1.1.dev2268"
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
@@ -23,7 +23,18 @@ _PLACEHOLDER_RE = re.compile(r"\{([a-zA-Z_][a-zA-Z0-9_]*)\}")
23
23
 
24
24
 
25
25
  def _validate_string_map(value: Any, *, context: str) -> dict[str, str]:
26
- """Return a validated ``str -> str`` catalog section."""
26
+ """Return a validated ``str -> str`` catalog section.
27
+
28
+ A blank value is rejected rather than stored. English is the per-key
29
+ fallback, but only for a key that is ABSENT: ``t()`` and ``tHtml()`` pick
30
+ the catalog value with ``hasOwnProperty``, so a present-but-empty string
31
+ wins over English and renders as nothing at all. Omitting a key and
32
+ emptying it therefore look identical in the JSON and behave oppositely on
33
+ screen, which is the kind of difference no reviewer catches by reading.
34
+ Nothing else covers it either — the parity ceilings count a key
35
+ untranslated only when it equals the English or is missing, so ``""``
36
+ reads there as translated.
37
+ """
27
38
  if value is None:
28
39
  return {}
29
40
  if not isinstance(value, dict):
@@ -32,6 +43,12 @@ def _validate_string_map(value: Any, *, context: str) -> dict[str, str]:
32
43
  for key, text in value.items():
33
44
  if not isinstance(key, str) or not isinstance(text, str):
34
45
  raise ValueError(f"{context} must contain only string keys and values")
46
+ if not text.strip():
47
+ raise ValueError(
48
+ f"{context}.{key} is blank — English renders only for an "
49
+ "absent key, so translate it, or leave the key out where the "
50
+ "section allows a missing one"
51
+ )
35
52
  result[key] = text
36
53
  return result
37
54
 
@@ -53,6 +70,13 @@ def _validate_tools(value: Any, *, context: str) -> dict[str, dict[str, str]]:
53
70
  continue
54
71
  if not isinstance(field_value, str):
55
72
  raise ValueError(f"{context}.{tool_name}.{field} must be a string")
73
+ # Same rule as _validate_string_map: blank loses to nothing, an
74
+ # omitted field falls back to the tool's own English metadata.
75
+ if not field_value.strip():
76
+ raise ValueError(
77
+ f"{context}.{tool_name}.{field} is blank — omit the field "
78
+ "instead, so the English tool metadata renders"
79
+ )
56
80
  translated[field] = field_value
57
81
  unknown = set(tool_values) - {"title", "description"}
58
82
  if unknown:
@@ -61,13 +61,19 @@ or constructed — needs no pipeline change.
61
61
  rejected when the catalog loads.
62
62
  - `messages`: interface labels, help text, notices, and runtime messages. Keys
63
63
  may be omitted — English is the per-key fallback at runtime — but see the
64
- share limit below before leaving a catalog half-finished.
64
+ share limit below before leaving a catalog half-finished. Omitting is the
65
+ only way to say "not translated yet": a key that is present but blank is
66
+ rejected when the catalog loads, because the runtime resolves by key
67
+ presence, so an empty value would win over English and render as nothing.
65
68
  - `tool_groups`: one entry per renderable MCP tool tag, keyed by the English
66
- tag. Not optional, and exact: no key more and none fewer.
69
+ tag. Not optional, and exact: no key more and none fewer. Blank is rejected
70
+ here too, but dropping the key is not the escape hatch it is for `messages` —
71
+ the exact key set forbids that. A heading you have not translated yet keeps
72
+ the English tag as its value.
67
73
  - `tools`: `title` and `description` per tool, keyed by the stable MCP tool
68
74
  name. The key set is not optional and exact in the same way; either field on
69
75
  its own may be left out, but a missing one counts as untranslated against the
70
- share limit below.
76
+ share limit below. Blank is rejected here too, for the same reason.
71
77
 
72
78
  Keep the keys and `{placeholders}` unchanged in every section.
73
79
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 8.1.1.dev2263
3
+ Version: 8.1.1.dev2268
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-87-blue" alt="95+ Tools">
43
+ <img src="https://img.shields.io/badge/tools-88-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 (87 tools)</b></summary>
250
+ <summary><b>Complete Tool List (88 tools)</b></summary>
251
251
 
252
252
  | Category | Tools |
253
253
  |----------|-------|
@@ -276,7 +276,7 @@ Spend less time configuring, more time enjoying your smart home.
276
276
  | **Scripts** | `ha_config_get_script`, `ha_config_remove_script`, `ha_config_set_script` |
277
277
  | **Search & Discovery** | `ha_get_overview`, `ha_get_state`, `ha_search` |
278
278
  | **Service & Device Control** | `ha_bulk_control`, `ha_call_event`, `ha_call_service`, `ha_get_operation_status`, `ha_list_services` |
279
- | **System** | `ha_config_get_yaml` *(beta)*, `ha_config_set_yaml` *(beta)*, `ha_manage_backup`, `ha_manage_custom_tool` *(beta)*, `ha_manage_theme`, `ha_manage_updates`, `ha_reload_core`, `ha_restart` |
279
+ | **System** | `ha_config_get_yaml` *(beta)*, `ha_config_set_yaml` *(beta)*, `ha_manage_backup`, `ha_manage_custom_tool` *(beta)*, `ha_manage_security_policy`, `ha_manage_theme`, `ha_manage_updates`, `ha_reload_core`, `ha_restart` |
280
280
  | **Todo Lists** | `ha_get_todo`, `ha_remove_todo_item`, `ha_set_todo_item` |
281
281
  | **Utilities** | `ha_eval_template`, `ha_report_issue` |
282
282
  | **Zones** | `ha_get_zone`, `ha_remove_zone`, `ha_set_zone` |