ha-mcp-dev 7.8.1.dev716__tar.gz → 7.8.1.dev717__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 (144) hide show
  1. {ha_mcp_dev-7.8.1.dev716/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.8.1.dev717}/PKG-INFO +1 -1
  2. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/pyproject.toml +1 -1
  3. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/read_only.py +2 -2
  4. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_addons.py +39 -12
  5. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  6. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/LICENSE +0 -0
  7. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/MANIFEST.in +0 -0
  8. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/README.md +0 -0
  9. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/setup.cfg +0 -0
  10. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/__init__.py +0 -0
  11. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/__main__.py +0 -0
  12. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/_pypi_marker +0 -0
  13. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/_version.py +0 -0
  14. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/auth/__init__.py +0 -0
  15. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/auth/consent_form.py +0 -0
  16. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/auth/provider.py +0 -0
  17. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/backup_manager.py +0 -0
  18. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/client/__init__.py +0 -0
  19. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/client/rest_client.py +0 -0
  20. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/client/supervisor_client.py +0 -0
  21. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/client/websocket_client.py +0 -0
  22. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/client/websocket_listener.py +0 -0
  23. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/config.py +0 -0
  24. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  25. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  26. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  27. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/errors.py +0 -0
  28. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/policy/__init__.py +0 -0
  29. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/policy/approval_queue.py +0 -0
  30. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/policy/evaluator.py +0 -0
  31. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/policy/handlers.py +0 -0
  32. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/policy/middleware.py +0 -0
  33. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/policy/model.py +0 -0
  34. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/policy/persistence.py +0 -0
  35. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/policy/value_sources.py +0 -0
  36. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/py.typed +0 -0
  37. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  38. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  39. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  40. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  41. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  42. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  43. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  44. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  45. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  46. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  47. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  48. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  49. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  50. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  51. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  52. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  53. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  54. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  55. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  56. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  57. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  58. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  59. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/server.py +0 -0
  60. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/settings.css +0 -0
  61. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/settings.js +0 -0
  62. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/settings_ui.py +0 -0
  63. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/smoke_test.py +0 -0
  64. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  65. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/__init__.py +0 -0
  66. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/auto_backup.py +0 -0
  67. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/backup.py +0 -0
  68. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  69. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  70. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/device_control.py +0 -0
  71. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/enhanced.py +0 -0
  72. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/helpers.py +0 -0
  73. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/reference_validator.py +0 -0
  74. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/registry.py +0 -0
  75. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  76. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  77. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  78. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  79. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  80. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  81. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  82. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  83. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  84. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  85. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_areas.py +0 -0
  86. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  87. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  88. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_calendar.py +0 -0
  89. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_camera.py +0 -0
  90. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_categories.py +0 -0
  91. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_code.py +0 -0
  92. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  93. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  94. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  95. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  96. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  97. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  98. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_energy.py +0 -0
  99. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_entities.py +0 -0
  100. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  101. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_groups.py +0 -0
  102. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_hacs.py +0 -0
  103. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_history.py +0 -0
  104. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_integrations.py +0 -0
  105. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_labels.py +0 -0
  106. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
  107. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_registry.py +0 -0
  108. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_resources.py +0 -0
  109. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_search.py +0 -0
  110. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_service.py +0 -0
  111. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_services.py +0 -0
  112. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_system.py +0 -0
  113. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_themes.py +0 -0
  114. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_todo.py +0 -0
  115. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_traces.py +0 -0
  116. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_updates.py +0 -0
  117. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_utility.py +0 -0
  118. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  119. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  120. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/tools_zones.py +0 -0
  121. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/util_helpers.py +0 -0
  122. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/tools/validation_middleware.py +0 -0
  123. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/transforms/__init__.py +0 -0
  124. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/transforms/categorized_search.py +0 -0
  125. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  126. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/update_check.py +0 -0
  127. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/utils/__init__.py +0 -0
  128. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/utils/config_hash.py +0 -0
  129. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/utils/data_paths.py +0 -0
  130. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/utils/domain_handlers.py +0 -0
  131. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  132. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  133. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/utils/operation_manager.py +0 -0
  134. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/utils/python_sandbox.py +0 -0
  135. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/utils/skill_loader.py +0 -0
  136. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp/utils/usage_logger.py +0 -0
  137. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  138. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  139. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  140. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  141. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  142. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/tests/__init__.py +0 -0
  143. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/tests/test_constants.py +0 -0
  144. {ha_mcp_dev-7.8.1.dev716 → ha_mcp_dev-7.8.1.dev717}/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.8.1.dev716
3
+ Version: 7.8.1.dev717
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.8.1.dev716"
7
+ version = "7.8.1.dev717"
8
8
  description = "Home Assistant MCP Server - Complete control of Home Assistant through MCP"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13,<3.14"
@@ -93,8 +93,8 @@ def _addon_write(args: dict[str, Any]) -> str | None:
93
93
  return "array_patch modification"
94
94
  if args.get("websocket"):
95
95
  # A WebSocket session's initial message can command mutations
96
- # (e.g. ESPHome /compile), so it is not statically classifiable
97
- # as a read — fail closed.
96
+ # (e.g. an ESPHome firmware/compile or devices/update_config command),
97
+ # so it is not statically classifiable as a read — fail closed.
98
98
  return "WebSocket proxy session"
99
99
  method = str(args.get("method") or "GET").strip().upper()
100
100
  if method != "GET":
@@ -958,7 +958,7 @@ async def _call_addon_ws(
958
958
  Args:
959
959
  client: Home Assistant REST client
960
960
  slug: Add-on slug (e.g., "<prefix>_esphome")
961
- path: WebSocket endpoint path (e.g., "/compile", "/validate")
961
+ path: WebSocket endpoint path (e.g., "/ws" for the ESPHome dashboard's command channel)
962
962
  body: Message to send after connecting (JSON-encoded if dict, raw if string)
963
963
  timeout: Max seconds to wait for messages (default 60)
964
964
  debug: Include diagnostic info
@@ -2622,7 +2622,7 @@ def register_addon_tools(mcp: Any, client: HomeAssistantClient, **kwargs: Any) -
2622
2622
  body: Annotated[
2623
2623
  dict[str, Any] | str | None,
2624
2624
  Field(
2625
- description="Proxy mode only. Request body for POST/PUT/PATCH. Pass a JSON object or JSON string.",
2625
+ description="Proxy mode only. Request body for POST/PUT/PATCH — or, with websocket=True, the initial WebSocket message. Pass a JSON object or JSON string.",
2626
2626
  default=None,
2627
2627
  ),
2628
2628
  ] = None,
@@ -2658,17 +2658,20 @@ def register_addon_tools(mcp: Any, client: HomeAssistantClient, **kwargs: Any) -
2658
2658
  websocket: Annotated[
2659
2659
  bool,
2660
2660
  Field(
2661
- description="Proxy mode only. Use WebSocket instead of HTTP. For streaming endpoints "
2662
- "(e.g., ESPHome /compile, /validate). Sends 'body' as initial message, "
2663
- "collects responses. Default: false.",
2661
+ description="Proxy mode only. Use WebSocket instead of HTTP for an add-on's "
2662
+ "WebSocket API (e.g. the ESPHome dashboard's '/ws' command channel; see the "
2663
+ "docstring's ESPHome section). Sends 'body' as the initial message, collects "
2664
+ "responses. Default: false.",
2664
2665
  default=False,
2665
2666
  ),
2666
2667
  ] = False,
2667
2668
  wait_for_close: Annotated[
2668
2669
  bool,
2669
2670
  Field(
2670
- description="Proxy mode only. WebSocket: True: wait for server to close (for compile/validate). "
2671
- "False: return after first response batch (for quick commands). Default: true.",
2671
+ description="Proxy mode only. WebSocket: True: wait for the server to close the stream "
2672
+ "(run-to-completion ops like an ESPHome compile/validate). False: return after the first "
2673
+ "response batch — use for a one-shot command/response or a bounded log capture on a channel "
2674
+ "that stays open (e.g. ESPHome '/ws'). Default: true.",
2672
2675
  default=True,
2673
2676
  ),
2674
2677
  ] = True,
@@ -2839,6 +2842,29 @@ def register_addon_tools(mcp: Any, client: HomeAssistantClient, **kwargs: Any) -
2839
2842
  share Home Assistant's container network (i.e. only the HAOS addon).
2840
2843
  Use ha_get_addon(slug="...") to discover available ports and endpoints.
2841
2844
 
2845
+ **ESPHome Device Builder dashboard (current rewrite):** config and log
2846
+ access is a WebSocket JSON-command API, NOT REST. The legacy endpoints
2847
+ are gone — `GET /edit?configuration=` now returns the dashboard SPA, and
2848
+ the old `/compile` `/validate` `/logs` WebSocket paths (which took
2849
+ `{"type": "spawn", ...}` bodies) reject the upgrade (HTTP 200). Use
2850
+ instead:
2851
+ - HTTP `GET /devices` → JSON list of configured devices; each entry's
2852
+ `configuration` field is the YAML filename to pass below.
2853
+ - WebSocket `path="/ws"` with body
2854
+ `{"command": "<cmd>", "message_id": "1", "args": {...}}`. The server
2855
+ sends a `server_info` message first, then one reply per `message_id`.
2856
+ Wire-confirmed commands: `devices/get_config` `{configuration}` → raw
2857
+ YAML (in the reply's `result`); `devices/logs` (stream)
2858
+ `{configuration, port: "OTA"}` → live device logs. Also exposed by the
2859
+ dashboard frontend (command/arg names not wire-tested here):
2860
+ `devices/update_config` `{configuration, content}` → save,
2861
+ `devices/validate`, `firmware/compile`.
2862
+ - The `/ws` channel stays open, so for a one-shot read or a bounded log
2863
+ capture pass `wait_for_close=False` with `message_limit` (and
2864
+ `message_offset` to skip the server_info / config-banner preamble).
2865
+ Reach the dashboard through Ingress — omit `port`; direct `port=` does
2866
+ not route to it.
2867
+
2842
2868
  **Array-patch mode** (when path AND array_patch are provided):
2843
2869
  Atomic "GET array, mutate, POST array" workflow for addon APIs whose write
2844
2870
  contract is "send the whole resource collection back". Operations are applied
@@ -2847,8 +2873,8 @@ def register_addon_tools(mcp: Any, client: HomeAssistantClient, **kwargs: Any) -
2847
2873
  full array. Designed for Node-RED /flows and similar endpoints.
2848
2874
 
2849
2875
  **Response shaping (proxy mode):**
2850
- - WebSocket streams can be noisy (ESPHome /validate often emits hundreds of
2851
- config-dump lines). By default, `summarize=True` collapses long runs of
2876
+ - WebSocket streams can be noisy (e.g. the ESPHome dashboard's devices/logs
2877
+ dumps the device's full config banner on connect). By default, `summarize=True` collapses long runs of
2852
2878
  non-signal messages into short elision markers; INFO/WARNING/ERROR/exit
2853
2879
  lines always pass through. Pagination via `message_offset` / `message_limit`
2854
2880
  works on the raw collected list before summarize runs.
@@ -2881,9 +2907,10 @@ def register_addon_tools(mcp: Any, client: HomeAssistantClient, **kwargs: Any) -
2881
2907
  - Set boot mode: ha_manage_addon(slug="...", boot="manual")
2882
2908
  - Call HTTP API: ha_manage_addon(slug="...", path="/api/events")
2883
2909
  - Direct port: ha_manage_addon(slug="...", path="/flows", port=1880)
2884
- - WebSocket: ha_manage_addon(slug="...", path="/validate", port=6052, websocket=True, body={"type": "spawn", "configuration": "device.yaml"})
2885
- - Quick WS health check (50 msgs, raw): ha_manage_addon(slug="...", path="/logs", websocket=True, message_limit=50, summarize=False)
2886
- - Filter WS errors only: ha_manage_addon(slug="...", path="/validate", websocket=True, python_transform="response = [m for m in response if 'ERROR' in str(m) or 'WARN' in str(m)]")
2910
+ - ESPHome list devices (HTTP): ha_manage_addon(slug="<prefix>_esphome", path="/devices")
2911
+ - ESPHome read a device's YAML (WS one-shot): ha_manage_addon(slug="<prefix>_esphome", path="/ws", websocket=True, wait_for_close=False, message_limit=2, body={"command": "devices/get_config", "message_id": "1", "args": {"configuration": "device.yaml"}})
2912
+ - ESPHome live logs (WS, bounded): ha_manage_addon(slug="<prefix>_esphome", path="/ws", websocket=True, wait_for_close=False, message_limit=60, body={"command": "devices/logs", "message_id": "1", "args": {"configuration": "device.yaml", "port": "OTA"}})
2913
+ - Filter WS errors only: ha_manage_addon(slug="...", path="/ws", websocket=True, python_transform="response = [m for m in response if 'ERROR' in str(m) or 'WARN' in str(m)]")
2887
2914
  - HTTP subset: ha_manage_addon(slug="...", path="/flows", python_transform="response = [f['id'] for f in response]")
2888
2915
  - Array-patch (Node-RED, rename a node):
2889
2916
  ha_manage_addon(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 7.8.1.dev716
3
+ Version: 7.8.1.dev717
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