ha-mcp-dev 7.12.0.dev1837__tar.gz → 7.12.0.dev1840__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 (162) hide show
  1. {ha_mcp_dev-7.12.0.dev1837/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.12.0.dev1840}/PKG-INFO +1 -1
  2. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/pyproject.toml +1 -1
  3. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/registry.py +56 -18
  4. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_dev.py +6 -2
  5. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  6. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/LICENSE +0 -0
  7. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/MANIFEST.in +0 -0
  8. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/README.md +0 -0
  9. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/setup.cfg +0 -0
  10. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/__init__.py +0 -0
  11. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/__main__.py +0 -0
  12. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/_pypi_marker +0 -0
  13. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/_version.py +0 -0
  14. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/auth/__init__.py +0 -0
  15. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/auth/consent_form.py +0 -0
  16. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/auth/provider.py +0 -0
  17. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/backup_manager.py +0 -0
  18. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/browser_landing.py +0 -0
  19. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/client/__init__.py +0 -0
  20. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/client/rest_client.py +0 -0
  21. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/client/supervisor_client.py +0 -0
  22. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/client/websocket_client.py +0 -0
  23. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/client/websocket_listener.py +0 -0
  24. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/config.py +0 -0
  25. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  26. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  27. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  28. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/errors.py +0 -0
  29. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/policy/__init__.py +0 -0
  30. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/policy/approval_queue.py +0 -0
  31. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/policy/evaluator.py +0 -0
  32. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/policy/handlers.py +0 -0
  33. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/policy/middleware.py +0 -0
  34. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/policy/model.py +0 -0
  35. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/policy/persistence.py +0 -0
  36. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/policy/value_sources.py +0 -0
  37. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/py.typed +0 -0
  38. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/read_only.py +0 -0
  39. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  40. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  41. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  42. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  43. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  44. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  45. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  46. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  47. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  48. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  49. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  50. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  51. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  52. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  53. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  54. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  55. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  56. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  57. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  58. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  59. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  60. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  61. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  62. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  63. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  64. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/server.py +0 -0
  65. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/settings_ui/__init__.py +0 -0
  66. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/settings_ui/settings.css +0 -0
  67. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/settings_ui/settings.html +0 -0
  68. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/settings_ui/settings.js +0 -0
  69. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/smoke_test.py +0 -0
  70. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  71. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/__init__.py +0 -0
  72. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/auto_backup.py +0 -0
  73. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/backup.py +0 -0
  74. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  75. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  76. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/device_control.py +0 -0
  77. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/enhanced.py +0 -0
  78. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/helpers.py +0 -0
  79. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/radio/__init__.py +0 -0
  80. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/radio/base.py +0 -0
  81. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/radio/matter.py +0 -0
  82. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/radio/thread.py +0 -0
  83. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  84. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/radio/zwave.py +0 -0
  85. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/reference_validator.py +0 -0
  86. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  87. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  88. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  89. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  90. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  91. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  92. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  93. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  94. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  95. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  96. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_addons.py +0 -0
  97. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_areas.py +0 -0
  98. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  99. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  100. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_calendar.py +0 -0
  101. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_camera.py +0 -0
  102. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_categories.py +0 -0
  103. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_code.py +0 -0
  104. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  105. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  106. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  107. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  108. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  109. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  110. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_energy.py +0 -0
  111. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_entities.py +0 -0
  112. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  113. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_groups.py +0 -0
  114. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_hacs.py +0 -0
  115. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_history.py +0 -0
  116. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_integrations.py +0 -0
  117. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_labels.py +0 -0
  118. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
  119. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_radio.py +0 -0
  120. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_registry.py +0 -0
  121. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_resources.py +0 -0
  122. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_search.py +0 -0
  123. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_service.py +0 -0
  124. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_services.py +0 -0
  125. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_system.py +0 -0
  126. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_themes.py +0 -0
  127. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_todo.py +0 -0
  128. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_traces.py +0 -0
  129. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_updates.py +0 -0
  130. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_utility.py +0 -0
  131. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  132. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  133. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/tools_zones.py +0 -0
  134. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/util_helpers.py +0 -0
  135. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/tools/validation_middleware.py +0 -0
  136. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/transforms/__init__.py +0 -0
  137. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/transforms/categorized_search.py +0 -0
  138. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  139. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/transport_security.py +0 -0
  140. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/update_check.py +0 -0
  141. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/utils/__init__.py +0 -0
  142. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/utils/config_hash.py +0 -0
  143. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/utils/data_paths.py +0 -0
  144. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/utils/domain_handlers.py +0 -0
  145. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  146. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  147. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/utils/operation_manager.py +0 -0
  148. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/utils/python_sandbox.py +0 -0
  149. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/utils/skill_loader.py +0 -0
  150. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/utils/usage_logger.py +0 -0
  151. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/visibility/__init__.py +0 -0
  152. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/visibility/model.py +0 -0
  153. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/visibility/persistence.py +0 -0
  154. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp/visibility/resolver.py +0 -0
  155. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  156. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  157. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  158. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  159. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  160. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/tests/__init__.py +0 -0
  161. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/tests/test_constants.py +0 -0
  162. {ha_mcp_dev-7.12.0.dev1837 → ha_mcp_dev-7.12.0.dev1840}/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.0.dev1837
3
+ Version: 7.12.0.dev1840
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.12.0.dev1837"
7
+ version = "7.12.0.dev1840"
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
@@ -143,7 +143,8 @@ class ToolsRegistry:
143
143
  When ``func_name`` is given, uses it directly (explicit mode); otherwise scans
144
144
  the module for an attribute matching the ``register_*_tools`` convention.
145
145
  Returns True if registered, False if no register function was found.
146
- Re-raises on import or registration failure (fail-fast).
146
+ Re-raises on import or registration failure; ``register_all_tools``
147
+ contains that failure to the one module (see its docstring).
147
148
  """
148
149
  import importlib
149
150
 
@@ -169,8 +170,8 @@ class ToolsRegistry:
169
170
  logger.warning(f"Module {module_name} has no register_*_tools function")
170
171
  return False
171
172
 
172
- except Exception as e:
173
- logger.error(f"Failed to register tools from {module_name}: {e}")
173
+ except Exception:
174
+ logger.exception(f"Failed to register tools from {module_name}")
174
175
  raise
175
176
 
176
177
  def register_all_tools(self) -> None:
@@ -178,6 +179,14 @@ class ToolsRegistry:
178
179
 
179
180
  Tool modules are imported and registered only when this method is called,
180
181
  which happens after the MCP server is ready to accept connections.
182
+
183
+ A module that fails to import or register is SKIPPED (logged loudly),
184
+ not fatal: the in-process server auto-updates the ha-mcp package inside
185
+ a running Home Assistant, and a mixed old/new module generation — or a
186
+ module needing a newer custom component — previously took the whole
187
+ server down over one module (issues #1783/#1785). Only a TOTAL failure
188
+ (zero modules registered) still raises: a tool-less server "running"
189
+ would hide a genuinely broken install.
181
190
  """
182
191
  if self._modules_registered:
183
192
  logger.debug("Tools already registered, skipping")
@@ -189,23 +198,52 @@ class ToolsRegistry:
189
198
  "device_tools": self.device_tools,
190
199
  }
191
200
 
201
+ # tools_*.py modules by convention, then the explicit modules (those
202
+ # not following the convention) — each only if discovery included it
203
+ # (respects filtering).
204
+ worklist: list[tuple[str, str | None]] = [
205
+ (name, None)
206
+ for name in self._discovered_modules
207
+ if name not in EXPLICIT_MODULES
208
+ ]
209
+ worklist += [
210
+ (name, func_name)
211
+ for name, func_name in EXPLICIT_MODULES.items()
212
+ if name in self._discovered_modules
213
+ ]
214
+
192
215
  registered_count = 0
216
+ failed: list[tuple[str, Exception]] = []
217
+ for module_name, func_name in worklist:
218
+ try:
219
+ if self._import_and_register_module(module_name, kwargs, func_name):
220
+ registered_count += 1
221
+ except Exception as e:
222
+ failed.append((module_name, e))
193
223
 
194
- # Import and register tools_*.py modules
195
- for module_name in self._discovered_modules:
196
- # Skip explicit modules - handled separately
197
- if module_name in EXPLICIT_MODULES:
198
- continue
199
- if self._import_and_register_module(module_name, kwargs):
200
- registered_count += 1
201
-
202
- # Register explicit modules (those not following tools_*.py convention)
203
- # Only register if they were included in discovered modules (respects filtering)
204
- for module_name, func_name in EXPLICIT_MODULES.items():
205
- if module_name not in self._discovered_modules:
206
- continue
207
- if self._import_and_register_module(module_name, kwargs, func_name):
208
- registered_count += 1
224
+ self._raise_or_log_registration_failures(failed, registered_count)
209
225
 
210
226
  self._modules_registered = True
211
227
  logger.info(f"Auto-discovery registered tools from {registered_count} modules")
228
+
229
+ @staticmethod
230
+ def _raise_or_log_registration_failures(
231
+ failed: list[tuple[str, Exception]], registered_count: int
232
+ ) -> None:
233
+ """Raise on a total registration failure, log a summary on a partial one."""
234
+ if not failed:
235
+ return
236
+ if registered_count == 0:
237
+ raise RuntimeError(
238
+ "No tool module could be registered "
239
+ f"({', '.join(name for name, _ in failed)} all failed); "
240
+ "the installed ha-mcp package is broken."
241
+ ) from failed[0][1]
242
+ logger.error(
243
+ "Skipped %d tool module(s) that failed to register: %s. The "
244
+ "server is running without their tools. If this happened right "
245
+ "after a package update, restart Home Assistant so every "
246
+ "module loads from the same package version.",
247
+ len(failed),
248
+ ", ".join(name for name, _ in failed),
249
+ )
@@ -67,11 +67,15 @@ def is_dev_mode_enabled() -> bool:
67
67
 
68
68
  Reads through :func:`config.get_global_settings` so the same
69
69
  env-var / override-file / default precedence path applies as
70
- every other runtime-editable Settings field.
70
+ every other runtime-editable Settings field. ``getattr`` with a
71
+ False default, not attribute access: during an in-process package
72
+ update the cached settings singleton can predate this field
73
+ (issues #1783/#1785), and that stale read must mean "dev mode
74
+ off", never AttributeError.
71
75
  """
72
76
  from ..config import get_global_settings
73
77
 
74
- return bool(get_global_settings().enable_dev_mode)
78
+ return bool(getattr(get_global_settings(), "enable_dev_mode", False))
75
79
 
76
80
 
77
81
  def _spawn_background(coro: Any) -> None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 7.12.0.dev1837
3
+ Version: 7.12.0.dev1840
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