ha-mcp-dev 7.12.3.dev1940__tar.gz → 7.12.3.dev1946__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 (177) hide show
  1. {ha_mcp_dev-7.12.3.dev1940/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.12.3.dev1946}/PKG-INFO +4 -4
  2. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/README.md +3 -3
  3. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/pyproject.toml +1 -1
  4. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/config.py +31 -0
  5. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/server.py +11 -11
  6. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/settings_ui/_handlers_backups.py +1 -0
  7. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/settings_ui/settings.js +9 -0
  8. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/backup.py +349 -13
  9. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_config_helpers.py +112 -8
  10. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_groups.py +42 -10
  11. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_resources.py +30 -5
  12. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946/src/ha_mcp_dev.egg-info}/PKG-INFO +4 -4
  13. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/LICENSE +0 -0
  14. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/MANIFEST.in +0 -0
  15. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/setup.cfg +0 -0
  16. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/__init__.py +0 -0
  17. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/__main__.py +0 -0
  18. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/_pypi_marker +0 -0
  19. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/_version.py +0 -0
  20. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/auth/__init__.py +0 -0
  21. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/auth/consent_form.py +0 -0
  22. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/auth/provider.py +0 -0
  23. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/backup_manager.py +0 -0
  24. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/browser_landing.py +0 -0
  25. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/client/__init__.py +0 -0
  26. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/client/rest_client.py +0 -0
  27. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/client/supervisor_client.py +0 -0
  28. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/client/websocket_client.py +0 -0
  29. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/client/websocket_listener.py +0 -0
  30. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  31. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  32. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  33. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  34. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  35. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/errors.py +0 -0
  36. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/llm_exposure.py +0 -0
  37. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/policy/__init__.py +0 -0
  38. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/policy/approval_queue.py +0 -0
  39. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/policy/evaluator.py +0 -0
  40. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/policy/handlers.py +0 -0
  41. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/policy/middleware.py +0 -0
  42. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/policy/model.py +0 -0
  43. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/policy/persistence.py +0 -0
  44. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/policy/value_sources.py +0 -0
  45. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/py.typed +0 -0
  46. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/read_only.py +0 -0
  47. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  48. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  49. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  50. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  51. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  52. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  53. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  54. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  55. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  56. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  57. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  58. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  59. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  60. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  61. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  62. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  63. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  64. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  65. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  66. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  67. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  68. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  69. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  70. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  71. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  72. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/settings_ui/__init__.py +0 -0
  73. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
  74. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  75. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  76. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  77. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  78. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  79. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  80. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/settings_ui/_theme.py +0 -0
  81. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
  82. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/settings_ui/settings.css +0 -0
  83. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/settings_ui/settings.html +0 -0
  84. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/smoke_test.py +0 -0
  85. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  86. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/strict_bps.py +0 -0
  87. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/__init__.py +0 -0
  88. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/auto_backup.py +0 -0
  89. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  90. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/component_api.py +0 -0
  91. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  92. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/device_control.py +0 -0
  93. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/enhanced.py +0 -0
  94. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/helpers.py +0 -0
  95. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/radio/__init__.py +0 -0
  96. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/radio/base.py +0 -0
  97. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/radio/matter.py +0 -0
  98. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/radio/thread.py +0 -0
  99. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  100. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/radio/zwave.py +0 -0
  101. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/reference_validator.py +0 -0
  102. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/registry.py +0 -0
  103. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  104. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  105. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  106. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  107. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  108. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  109. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  110. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  111. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  112. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  113. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_addons.py +0 -0
  114. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_areas.py +0 -0
  115. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  116. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  117. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_calendar.py +0 -0
  118. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_camera.py +0 -0
  119. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_categories.py +0 -0
  120. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_code.py +0 -0
  121. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  122. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  123. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  124. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  125. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  126. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_dev.py +0 -0
  127. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_energy.py +0 -0
  128. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_entities.py +0 -0
  129. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  130. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_hacs.py +0 -0
  131. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_history.py +0 -0
  132. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_integrations.py +0 -0
  133. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_labels.py +0 -0
  134. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_radio.py +0 -0
  135. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_registry.py +0 -0
  136. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_search.py +0 -0
  137. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_service.py +0 -0
  138. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_services.py +0 -0
  139. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_system.py +0 -0
  140. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_themes.py +0 -0
  141. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_todo.py +0 -0
  142. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_traces.py +0 -0
  143. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_updates.py +0 -0
  144. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_utility.py +0 -0
  145. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  146. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  147. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
  148. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/tools_zones.py +0 -0
  149. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/util_helpers.py +0 -0
  150. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/tools/validation_middleware.py +0 -0
  151. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/transforms/__init__.py +0 -0
  152. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/transforms/categorized_search.py +0 -0
  153. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  154. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/transport_security.py +0 -0
  155. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/update_check.py +0 -0
  156. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/utils/__init__.py +0 -0
  157. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/utils/config_hash.py +0 -0
  158. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/utils/data_paths.py +0 -0
  159. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/utils/domain_handlers.py +0 -0
  160. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  161. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  162. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/utils/operation_manager.py +0 -0
  163. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/utils/python_sandbox.py +0 -0
  164. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/utils/skill_loader.py +0 -0
  165. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/utils/usage_logger.py +0 -0
  166. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/visibility/__init__.py +0 -0
  167. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/visibility/model.py +0 -0
  168. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/visibility/persistence.py +0 -0
  169. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp/visibility/resolver.py +0 -0
  170. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  171. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  172. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  173. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  174. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  175. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/tests/__init__.py +0 -0
  176. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/tests/test_constants.py +0 -0
  177. {ha_mcp_dev-7.12.3.dev1940 → ha_mcp_dev-7.12.3.dev1946}/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: 7.12.3.dev1940
3
+ Version: 7.12.3.dev1946
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
@@ -41,7 +41,7 @@ Dynamic: license-file
41
41
  <!-- mcp-name: io.github.homeassistant-ai/ha-mcp -->
42
42
 
43
43
  <p align="center">
44
- <img src="https://img.shields.io/badge/tools-88-blue" alt="95+ Tools">
44
+ <img src="https://img.shields.io/badge/tools-87-blue" alt="95+ Tools">
45
45
  <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>
46
46
  <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>
47
47
  <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
  |----------|-------|
@@ -278,7 +278,7 @@ Spend less time configuring, more time enjoying your smart home.
278
278
  | **Service & Device Control** | `ha_bulk_control`, `ha_call_event`, `ha_call_service`, `ha_get_operation_status`, `ha_list_services` |
279
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` |
280
280
  | **Todo Lists** | `ha_get_todo`, `ha_remove_todo_item`, `ha_set_todo_item` |
281
- | **Utilities** | `ha_eval_template`, `ha_install_mcp_tools` *(beta)*, `ha_report_issue` |
281
+ | **Utilities** | `ha_eval_template`, `ha_report_issue` |
282
282
  | **Zones** | `ha_get_zone`, `ha_remove_zone`, `ha_set_zone` |
283
283
 
284
284
  <!-- TOOLS_TABLE_END -->
@@ -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>
@@ -214,7 +214,7 @@ Spend less time configuring, more time enjoying your smart home.
214
214
  <details>
215
215
  <!-- TOOLS_TABLE_START -->
216
216
 
217
- <summary><b>Complete Tool List (88 tools)</b></summary>
217
+ <summary><b>Complete Tool List (87 tools)</b></summary>
218
218
 
219
219
  | Category | Tools |
220
220
  |----------|-------|
@@ -245,7 +245,7 @@ Spend less time configuring, more time enjoying your smart home.
245
245
  | **Service & Device Control** | `ha_bulk_control`, `ha_call_event`, `ha_call_service`, `ha_get_operation_status`, `ha_list_services` |
246
246
  | **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
247
  | **Todo Lists** | `ha_get_todo`, `ha_remove_todo_item`, `ha_set_todo_item` |
248
- | **Utilities** | `ha_eval_template`, `ha_install_mcp_tools` *(beta)*, `ha_report_issue` |
248
+ | **Utilities** | `ha_eval_template`, `ha_report_issue` |
249
249
  | **Zones** | `ha_get_zone`, `ha_remove_zone`, `ha_set_zone` |
250
250
 
251
251
  <!-- TOOLS_TABLE_END -->
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "7.12.3.dev1940"
7
+ version = "7.12.3.dev1946"
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
@@ -347,6 +347,26 @@ class Settings(BaseSettings):
347
347
  7, ge=1, le=365, alias="HAMCP_AUTO_BACKUP_CALENDAR_LOOKAHEAD_DAYS"
348
348
  )
349
349
 
350
+ # Snapshot-tarball deletion gate (#1861). Off by default: an agent
351
+ # deleting a full HA snapshot is categorically riskier than the
352
+ # lightweight `edits`-scope auto-backups (which already delete freely),
353
+ # since a snapshot may be the last recovery point after the agent
354
+ # itself broke something. A human must opt in via env var, the web
355
+ # settings UI override file, or (in the add-on) the Supervisor options
356
+ # — never something the agent can flip on itself.
357
+ enable_snapshot_delete: bool = Field(False, alias="ENABLE_SNAPSHOT_DELETE")
358
+
359
+ # Minimum age (days) a snapshot must have before it's deletable. This is
360
+ # the load-bearing guard, not `enable_snapshot_delete`: a count-based
361
+ # "keep the last N" rule is defeatable by an agent flooding new
362
+ # snapshots before deleting old ones, but it cannot forge a backup's
363
+ # HA-stamped creation date. 0 disables the age floor (still gated by
364
+ # enable_snapshot_delete + the newest-snapshot / automatic-backup
365
+ # guards enforced in tools/backup.py).
366
+ snapshot_delete_min_age_days: int = Field(
367
+ 7, ge=0, le=365, alias="SNAPSHOT_DELETE_MIN_AGE_DAYS"
368
+ )
369
+
350
370
  # Mirror the legacy ``os.getenv("FLAG", "").lower() in ("true", ...)``
351
371
  # semantics for the ex-direct-getenv ``enable_filesystem_tools`` flag (and
352
372
  # its sibling toggles listed above): an empty env var value MUST be treated
@@ -1486,6 +1506,10 @@ BACKUP_OVERRIDE_FIELDS: tuple[BackupOverrideField, ...] = (
1486
1506
  "HAMCP_AUTO_BACKUP_CALENDAR_LOOKAHEAD_DAYS",
1487
1507
  int,
1488
1508
  ),
1509
+ BackupOverrideField("enable_snapshot_delete", "ENABLE_SNAPSHOT_DELETE", bool),
1510
+ BackupOverrideField(
1511
+ "snapshot_delete_min_age_days", "SNAPSHOT_DELETE_MIN_AGE_DAYS", int
1512
+ ),
1489
1513
  )
1490
1514
 
1491
1515
  # Override-file location is the same data dir that holds tool_config.json
@@ -1640,6 +1664,13 @@ def _coerce_backup_int_value(field_name: str, raw: object) -> tuple[bool, Any]:
1640
1664
  coerced,
1641
1665
  )
1642
1666
  return False, None
1667
+ if field_name == "snapshot_delete_min_age_days" and not 0 <= coerced <= 365:
1668
+ logger.warning(
1669
+ "backup_settings.json: snapshot_delete_min_age_days=%d out of "
1670
+ "range 0..365; ignoring",
1671
+ coerced,
1672
+ )
1673
+ return False, None
1643
1674
  return True, coerced
1644
1675
 
1645
1676
 
@@ -632,9 +632,8 @@ class HomeAssistantSmartMCPServer(EnhancedToolsMixin):
632
632
  "Create or update a Home Assistant script.\n\n"
633
633
  "Supports two modes: full `config` replacement, or surgical "
634
634
  "`python_transform` on an existing script (requires "
635
- "`identifier` and `config_hash` from "
636
- "ha_config_get_script). Omit `identifier` to create a new "
637
- "script.\n\n"
635
+ "`config_hash` from ha_config_get_script). `script_id` names "
636
+ "the script in both modes.\n\n"
638
637
  "For schema details and examples, see "
639
638
  "ha_get_skill_guide."
640
639
  ),
@@ -650,19 +649,20 @@ class HomeAssistantSmartMCPServer(EnhancedToolsMixin):
650
649
  "Create or update a Home Assistant scene.\n\n"
651
650
  "Supports two modes: full `config` replacement, or surgical "
652
651
  "`python_transform` on an existing scene (requires "
653
- "`identifier` and `config_hash`).\n\n"
652
+ "`config_hash`). `scene_id` names the scene in both modes.\n\n"
654
653
  "For schema details and examples, see "
655
654
  "ha_get_skill_guide."
656
655
  ),
657
656
  "ha_config_list_helpers": (
658
- "List Home Assistant helpers of a given simple type. "
659
- "Accepts the 12 storage-backed helper types only: "
660
- "input_button, input_boolean, input_select, input_number, "
657
+ "List Home Assistant helpers of a given type, one page per "
658
+ "call (`limit`/`offset`; `total_count` and `has_more` "
659
+ "describe the full set). The 12 storage-backed types "
660
+ "(input_button, input_boolean, input_select, input_number, "
661
661
  "input_text, input_datetime, counter, timer, schedule, "
662
- "zone, person, tag. Flow-based helpers (template, group, "
663
- "utility_meter, derivative, statistics, trend, threshold, "
664
- "filter, switch_as_x, etc.) cannot be listed through this "
665
- "tool — use ha_search.\n\n"
662
+ "zone, person, tag) are listed on every install. Flow-based "
663
+ "types (template, group, utility_meter, derivative, and the "
664
+ "rest) and `helper_type='all'` are served only through the "
665
+ "ha_mcp_tools custom component.\n\n"
666
666
  "For per-type schemas and decision guidance, see "
667
667
  "ha_get_skill_guide."
668
668
  ),
@@ -278,6 +278,7 @@ _BACKUP_INT_BOUNDS: dict[str, tuple[int, int]] = {
278
278
  "auto_backup_throttle_minutes": (0, 1440),
279
279
  "auto_backup_retain_per_entity": (1, 10_000),
280
280
  "auto_backup_calendar_lookahead_days": (1, 365),
281
+ "snapshot_delete_min_age_days": (0, 365),
281
282
  }
282
283
 
283
284
 
@@ -1053,6 +1053,14 @@ const BACKUP_FIELD_LABELS = {
1053
1053
  label: 'Calendar lookahead (days)',
1054
1054
  help: 'How far ahead to query for calendar events when capturing pre-edit snapshots. Range 1–365.',
1055
1055
  },
1056
+ enable_snapshot_delete: {
1057
+ label: 'Allow snapshot deletion',
1058
+ help: 'Lets ha_manage_backup delete full HA snapshot tarballs. Off by default: a snapshot may be the last recovery point after a mistaken change. Even when on, scheduled backups, the newest remaining snapshot, and anything younger than the age floor below stay protected.',
1059
+ },
1060
+ snapshot_delete_min_age_days: {
1061
+ label: 'Minimum snapshot age to delete (days)',
1062
+ help: 'A snapshot must be at least this old before it can be deleted. Range 0–365; 0 disables the floor (the newest-snapshot and scheduled-backup protections still apply).',
1063
+ },
1056
1064
  };
1057
1065
 
1058
1066
  const BACKUP_ORIGIN_LABELS = {
@@ -1104,6 +1112,7 @@ function renderBackupConfig() {
1104
1112
  let max = 10000;
1105
1113
  if (f.field === 'auto_backup_throttle_minutes') { min = 0; max = 1440; }
1106
1114
  else if (f.field === 'auto_backup_calendar_lookahead_days') { min = 1; max = 365; }
1115
+ else if (f.field === 'snapshot_delete_min_age_days') { min = 0; max = 365; }
1107
1116
  controlHtml = `<input type="number" name="backup:${escapeHtml(f.field)}" data-field="${escapeHtml(f.field)}" aria-labelledby="label-backup-${escapeHtml(f.field)}" value="${Number(f.value)}" min="${min}" max="${max}" ${f.editable ? '' : 'disabled'}>`;
1108
1117
  }
1109
1118
  let originMsg;