ha-mcp-dev 7.14.2.dev2173__tar.gz → 7.14.2.dev2175__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 (192) hide show
  1. {ha_mcp_dev-7.14.2.dev2173/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.14.2.dev2175}/PKG-INFO +1 -1
  2. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/pyproject.toml +1 -1
  3. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/__main__.py +6 -2
  4. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/auth/provider.py +1 -1
  5. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/utils/data_paths.py +63 -9
  6. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  7. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/LICENSE +0 -0
  8. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/MANIFEST.in +0 -0
  9. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/README.md +0 -0
  10. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/setup.cfg +0 -0
  11. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/__init__.py +0 -0
  12. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/_pypi_marker +0 -0
  13. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/_version.py +0 -0
  14. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/auth/__init__.py +0 -0
  15. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/auth/consent_form.py +0 -0
  16. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/backup_manager.py +0 -0
  17. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/browser_landing.py +0 -0
  18. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/client/__init__.py +0 -0
  19. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/client/rest_client.py +0 -0
  20. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/client/supervisor_client.py +0 -0
  21. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/client/websocket_client.py +0 -0
  22. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/client/websocket_listener.py +0 -0
  23. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/config.py +0 -0
  24. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  25. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  26. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  27. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  28. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  29. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
  30. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/errors.py +0 -0
  31. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/llm_exposure.py +0 -0
  32. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/policy/__init__.py +0 -0
  33. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/policy/approval_queue.py +0 -0
  34. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/policy/evaluator.py +0 -0
  35. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/policy/handlers.py +0 -0
  36. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/policy/middleware.py +0 -0
  37. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/policy/model.py +0 -0
  38. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/policy/persistence.py +0 -0
  39. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/policy/value_sources.py +0 -0
  40. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/py.typed +0 -0
  41. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/read_only.py +0 -0
  42. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  43. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  44. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  45. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  46. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  47. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  48. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  49. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  50. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  51. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  52. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  53. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  54. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  55. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  56. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  57. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  58. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  59. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  60. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  61. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  62. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  63. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  64. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  65. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  66. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  67. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/server.py +0 -0
  68. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/settings_ui/__init__.py +0 -0
  69. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
  70. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
  71. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  72. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  73. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  74. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  75. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/settings_ui/_i18n.py +0 -0
  76. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  77. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  78. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/settings_ui/_theme.py +0 -0
  79. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
  80. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/settings_ui/locales/README.md +0 -0
  81. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/settings_ui/locales/de.json +0 -0
  82. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/settings_ui/locales/en.json +0 -0
  83. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/settings_ui/locales/es.json +0 -0
  84. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
  85. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/settings_ui/locales/it.json +0 -0
  86. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
  87. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
  88. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/settings_ui/settings.css +0 -0
  89. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/settings_ui/settings.html +0 -0
  90. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/settings_ui/settings.js +0 -0
  91. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/smoke_test.py +0 -0
  92. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  93. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/strict_bps.py +0 -0
  94. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/__init__.py +0 -0
  95. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/auto_backup.py +0 -0
  96. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/backup.py +0 -0
  97. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  98. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/component_api.py +0 -0
  99. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/component_config_reads.py +0 -0
  100. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/component_devices.py +0 -0
  101. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/component_registries.py +0 -0
  102. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
  103. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  104. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/device_control.py +0 -0
  105. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/helpers.py +0 -0
  106. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/radio/__init__.py +0 -0
  107. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/radio/base.py +0 -0
  108. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/radio/matter.py +0 -0
  109. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/radio/thread.py +0 -0
  110. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  111. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/radio/zwave.py +0 -0
  112. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/reference_validator.py +0 -0
  113. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/registry.py +0 -0
  114. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  115. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  116. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  117. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  118. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  119. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  120. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  121. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  122. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  123. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  124. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_addons.py +0 -0
  125. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_areas.py +0 -0
  126. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  127. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  128. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_calendar.py +0 -0
  129. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_camera.py +0 -0
  130. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_categories.py +0 -0
  131. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_code.py +0 -0
  132. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  133. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  134. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  135. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  136. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  137. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  138. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_dev.py +0 -0
  139. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_energy.py +0 -0
  140. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_entities.py +0 -0
  141. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  142. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_groups.py +0 -0
  143. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_hacs.py +0 -0
  144. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_history.py +0 -0
  145. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_integrations.py +0 -0
  146. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_labels.py +0 -0
  147. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_radio.py +0 -0
  148. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_registry.py +0 -0
  149. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_resources.py +0 -0
  150. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_search.py +0 -0
  151. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_service.py +0 -0
  152. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_services.py +0 -0
  153. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_system.py +0 -0
  154. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_themes.py +0 -0
  155. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_todo.py +0 -0
  156. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_traces.py +0 -0
  157. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_updates.py +0 -0
  158. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_utility.py +0 -0
  159. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  160. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  161. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
  162. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/tools_zones.py +0 -0
  163. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/util_helpers.py +0 -0
  164. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/tools/validation_middleware.py +0 -0
  165. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/transforms/__init__.py +0 -0
  166. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/transforms/categorized_search.py +0 -0
  167. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  168. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/transport_security.py +0 -0
  169. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/update_check.py +0 -0
  170. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/utils/__init__.py +0 -0
  171. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/utils/config_hash.py +0 -0
  172. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/utils/config_write_lock.py +0 -0
  173. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/utils/domain_handlers.py +0 -0
  174. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  175. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  176. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/utils/operation_manager.py +0 -0
  177. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/utils/python_sandbox.py +0 -0
  178. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/utils/skill_loader.py +0 -0
  179. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/utils/usage_logger.py +0 -0
  180. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/visibility/__init__.py +0 -0
  181. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/visibility/enforcement.py +0 -0
  182. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/visibility/model.py +0 -0
  183. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/visibility/persistence.py +0 -0
  184. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp/visibility/resolver.py +0 -0
  185. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  186. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  187. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  188. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  189. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  190. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/tests/__init__.py +0 -0
  191. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/tests/test_constants.py +0 -0
  192. {ha_mcp_dev-7.14.2.dev2173 → ha_mcp_dev-7.14.2.dev2175}/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.14.2.dev2173
3
+ Version: 7.14.2.dev2175
4
4
  Summary: Home Assistant MCP Server - Complete control of Home Assistant through MCP
5
5
  Author-email: Julien <github@qc-h.net>
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "7.14.2.dev2173"
7
+ version = "7.14.2.dev2175"
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
@@ -155,13 +155,17 @@ This typically happens when running Docker without the -i flag:
155
155
  To fix this, use one of the following options:
156
156
 
157
157
  1. Add the -i flag to enable interactive stdin:
158
- docker run -i -e HOMEASSISTANT_URL=... -e HOMEASSISTANT_TOKEN=... \\
158
+ docker run -i -v ha-mcp-data:/home/mcpuser/.ha-mcp \\
159
+ -e HOMEASSISTANT_URL=... -e HOMEASSISTANT_TOKEN=... \\
159
160
  ghcr.io/homeassistant-ai/ha-mcp:latest
160
161
 
161
162
  2. Use HTTP mode instead (recommended for servers/automation):
162
- docker run -d -p 8086:8086 -e HOMEASSISTANT_URL=... -e HOMEASSISTANT_TOKEN=... \\
163
+ docker run -d -p 8086:8086 -v ha-mcp-data:/home/mcpuser/.ha-mcp \\
164
+ -e HOMEASSISTANT_URL=... -e HOMEASSISTANT_TOKEN=... \\
163
165
  ghcr.io/homeassistant-ai/ha-mcp:latest ha-mcp-web
164
166
 
167
+ The -v flag keeps your settings when the container is re-created.
168
+
165
169
  For more information, see:
166
170
  https://github.com/homeassistant-ai/ha-mcp#-docker
167
171
 
@@ -222,7 +222,7 @@ class HomeAssistantOAuthProvider(OAuthProvider):
222
222
  "Failed to persist OAuth client registry to %s (%s: %s). "
223
223
  "Clients will need to re-register after the next restart. "
224
224
  "Mount a persistent volume to fix this: "
225
- "docker run -v ha_mcp_data:/home/mcpuser/.ha-mcp ...",
225
+ "docker run -v ha-mcp-data:/home/mcpuser/.ha-mcp ...",
226
226
  path,
227
227
  type(exc).__name__,
228
228
  exc,
@@ -7,6 +7,7 @@ JSONL).
7
7
 
8
8
  from __future__ import annotations
9
9
 
10
+ import contextlib
10
11
  import functools
11
12
  import logging
12
13
  import os
@@ -34,11 +35,15 @@ def get_data_dir() -> Path:
34
35
  location", and silently writing to ``$HOME`` instead would surprise
35
36
  users who chose the override deliberately.
36
37
  4. ``<tempdir>/ha-mcp`` — last-resort fallback when the previously
37
- chosen step fails (read-only filesystem; ``HOME`` unset so
38
- ``Path.home()`` resolves to ``/``; or ``HA_MCP_CONFIG_DIR`` set but
39
- its mkdir raises). Loses persistence across restarts but lets the
40
- server start; users wanting persistence should set
41
- ``HA_MCP_CONFIG_DIR`` to a writable path.
38
+ chosen step cannot be created *or written to* (read-only filesystem;
39
+ ``HOME`` unset so ``Path.home()`` resolves to ``/``; a Docker volume
40
+ whose mount point ended up owned by another user; or
41
+ ``HA_MCP_CONFIG_DIR`` set but unusable). Loses persistence across
42
+ restarts but lets the server start; users wanting persistence should
43
+ set ``HA_MCP_CONFIG_DIR`` to a writable path.
44
+
45
+ Each candidate is probed with a real write, not just a ``mkdir`` — see
46
+ :func:`_try_write` for why existence alone is not enough.
42
47
 
43
48
  Memoized so the fallback warning typically emits once at startup
44
49
  rather than on every save/load HTTP request. ``lru_cache`` serializes
@@ -53,11 +58,57 @@ def get_data_dir() -> Path:
53
58
 
54
59
 
55
60
  def _try_mkdir(path: Path) -> OSError | None:
56
- """Create ``path`` (idempotent); return the ``OSError`` on failure, else ``None``."""
61
+ """Create ``path`` and confirm it is writable.
62
+
63
+ Returns the ``OSError`` on failure, else ``None``.
64
+ """
57
65
  try:
58
66
  path.mkdir(parents=True, exist_ok=True)
59
67
  except OSError as e:
60
68
  return e
69
+ return _try_write(path)
70
+
71
+
72
+ def _try_write(path: Path) -> OSError | None:
73
+ """Confirm ``path`` actually accepts writes; return the ``OSError``, else ``None``.
74
+
75
+ ``Path.mkdir(exist_ok=True)`` reports success for a directory that already
76
+ exists no matter who owns it or whether the filesystem is read-only — it
77
+ only re-stats the path. So "mkdir worked" does not mean "we can write
78
+ here", and Docker deployments live entirely inside that gap: the mount
79
+ point always exists by the time Python runs, because the image ships it
80
+ and Docker creates it when mounting a volume. Without this probe a
81
+ root-owned volume, a ``read_only: true`` filesystem or a ``--user``
82
+ override would each resolve as a perfectly good data dir and the fallback
83
+ warning below would never fire — persistence would just vanish with no
84
+ startup signal, which is the failure issue #2078 reported.
85
+
86
+ Probes by creating a real file rather than calling ``os.access``.
87
+ ``access(2)`` answers for the real UID rather than the effective one, and
88
+ it reports success for a process holding ``CAP_DAC_OVERRIDE`` (root in a
89
+ default container) whose writes a later ``--user`` drop would reject. It
90
+ does catch a read-only mount — Linux returns ``EROFS`` for ``W_OK`` — so
91
+ that is not the reason to avoid it. ``mkstemp`` is chosen because it
92
+ exercises the same syscalls the actual writes use (see
93
+ ``settings_ui._persistence``), which no permission query can stand in for.
94
+ """
95
+ try:
96
+ fd, name = tempfile.mkstemp(prefix=".ha-mcp-write-probe-", dir=path)
97
+ except OSError as e:
98
+ return e
99
+ try:
100
+ os.close(fd)
101
+ # Removing the probe is part of the check, not just cleanup: the real
102
+ # writers finish with ``os.replace`` onto the target name, so a share
103
+ # or ACL that grants create but denies unlink/replace (seen on some
104
+ # SMB/NFS exports) cannot actually persist anything. Letting either
105
+ # call raise out of here instead of returning it would abort startup
106
+ # rather than fall back.
107
+ os.unlink(name)
108
+ except OSError as e:
109
+ with contextlib.suppress(OSError):
110
+ os.unlink(name)
111
+ return e
61
112
  return None
62
113
 
63
114
 
@@ -82,7 +133,9 @@ def _prepare_fallback(preferred: Path | None) -> Path:
82
133
  )
83
134
  else:
84
135
  logger.warning(
85
- "Cannot write ha-mcp data to %s (read-only filesystem or HOME unset). "
136
+ "Cannot write ha-mcp data to %s (read-only filesystem, HOME unset, "
137
+ "or the directory is owned by another user — a Docker volume "
138
+ "mounted there must be writable by the container's user). "
86
139
  "Falling back to %s — data will NOT persist across restarts. "
87
140
  "Set HA_MCP_CONFIG_DIR to a writable path for persistence.",
88
141
  preferred,
@@ -104,8 +157,9 @@ def _resolve_data_dir() -> Path:
104
157
  if err is None:
105
158
  return custom_dir
106
159
  logger.warning(
107
- "HA_MCP_CONFIG_DIR=%s could not be prepared (%s: %s); "
108
- "falling back to a tmpdir.",
160
+ "HA_MCP_CONFIG_DIR=%s is not usable it must exist or be "
161
+ "creatable AND be writable by this process (%s: %s). It will NOT "
162
+ "be read from either; falling back to a tmpdir.",
109
163
  custom_dir,
110
164
  type(err).__name__,
111
165
  err,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 7.14.2.dev2173
3
+ Version: 7.14.2.dev2175
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