ha-mcp-dev 7.5.0.dev557__tar.gz → 7.5.0.dev559__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 (114) hide show
  1. {ha_mcp_dev-7.5.0.dev557/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.5.0.dev559}/PKG-INFO +4 -3
  2. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/README.md +3 -2
  3. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/pyproject.toml +1 -1
  4. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +2 -2
  5. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +1 -1
  6. ha_mcp_dev-7.5.0.dev559/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +8 -0
  7. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/resources/skills-vendor/AGENTS.md +10 -4
  8. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +10 -4
  9. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +2 -1
  10. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/resources/skills-vendor/README.md +10 -4
  11. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +16 -7
  12. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +48 -0
  13. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +245 -27
  14. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +4 -3
  15. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +20 -3
  16. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +55 -33
  17. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +12 -12
  18. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +265 -13
  19. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +72 -0
  20. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +16 -14
  21. ha_mcp_dev-7.5.0.dev559/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +21 -0
  22. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/tools_config_automations.py +18 -8
  23. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/tools_utility.py +20 -20
  24. ha_mcp_dev-7.5.0.dev559/src/ha_mcp/tools/tools_voice_assistant.py +695 -0
  25. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/util_helpers.py +7 -0
  26. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559/src/ha_mcp_dev.egg-info}/PKG-INFO +4 -3
  27. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp_dev.egg-info/SOURCES.txt +2 -0
  28. ha_mcp_dev-7.5.0.dev557/src/ha_mcp/tools/tools_voice_assistant.py +0 -189
  29. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/LICENSE +0 -0
  30. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/MANIFEST.in +0 -0
  31. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/setup.cfg +0 -0
  32. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/__init__.py +0 -0
  33. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/__main__.py +0 -0
  34. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/_pypi_marker +0 -0
  35. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/_version.py +0 -0
  36. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/auth/__init__.py +0 -0
  37. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/auth/consent_form.py +0 -0
  38. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/auth/provider.py +0 -0
  39. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/client/__init__.py +0 -0
  40. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/client/rest_client.py +0 -0
  41. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/client/supervisor_client.py +0 -0
  42. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/client/websocket_client.py +0 -0
  43. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/client/websocket_listener.py +0 -0
  44. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/config.py +0 -0
  45. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/errors.py +0 -0
  46. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/py.typed +0 -0
  47. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  48. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  49. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  50. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  51. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/server.py +0 -0
  52. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/settings_ui.py +0 -0
  53. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/smoke_test.py +0 -0
  54. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/__init__.py +0 -0
  55. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/backup.py +0 -0
  56. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  57. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/device_control.py +0 -0
  58. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/enhanced.py +0 -0
  59. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/helpers.py +0 -0
  60. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/reference_validator.py +0 -0
  61. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/registry.py +0 -0
  62. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/smart_search.py +0 -0
  63. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/tools_addons.py +0 -0
  64. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/tools_areas.py +0 -0
  65. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  66. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  67. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/tools_calendar.py +0 -0
  68. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/tools_camera.py +0 -0
  69. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/tools_categories.py +0 -0
  70. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/tools_code.py +0 -0
  71. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  72. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/tools_config_entry_flow.py +0 -0
  73. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  74. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  75. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  76. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/tools_energy.py +0 -0
  77. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/tools_entities.py +0 -0
  78. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  79. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/tools_groups.py +0 -0
  80. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/tools_hacs.py +0 -0
  81. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/tools_history.py +0 -0
  82. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/tools_integrations.py +0 -0
  83. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/tools_labels.py +0 -0
  84. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
  85. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/tools_registry.py +0 -0
  86. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/tools_resources.py +0 -0
  87. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/tools_search.py +0 -0
  88. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/tools_service.py +0 -0
  89. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/tools_services.py +0 -0
  90. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/tools_system.py +0 -0
  91. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/tools_todo.py +0 -0
  92. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/tools_traces.py +0 -0
  93. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/tools_updates.py +0 -0
  94. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  95. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/tools/tools_zones.py +0 -0
  96. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/transforms/__init__.py +0 -0
  97. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/transforms/categorized_search.py +0 -0
  98. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  99. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/utils/__init__.py +0 -0
  100. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/utils/config_hash.py +0 -0
  101. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/utils/data_paths.py +0 -0
  102. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/utils/domain_handlers.py +0 -0
  103. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  104. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  105. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/utils/operation_manager.py +0 -0
  106. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/utils/python_sandbox.py +0 -0
  107. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp/utils/usage_logger.py +0 -0
  108. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  109. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  110. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  111. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  112. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/tests/__init__.py +0 -0
  113. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/tests/test_constants.py +0 -0
  114. {ha_mcp_dev-7.5.0.dev557 → ha_mcp_dev-7.5.0.dev559}/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.5.0.dev557
3
+ Version: 7.5.0.dev559
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
@@ -38,7 +38,7 @@ Dynamic: license-file
38
38
  <!-- mcp-name: io.github.homeassistant-ai/ha-mcp -->
39
39
 
40
40
  <p align="center">
41
- <img src="https://img.shields.io/badge/tools-88-blue" alt="95+ Tools">
41
+ <img src="https://img.shields.io/badge/tools-89-blue" alt="95+ Tools">
42
42
  <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>
43
43
  <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>
44
44
  <a href="LICENSE.md"><img src="https://img.shields.io/github/license/homeassistant-ai/ha-mcp.svg" alt="License"></a>
@@ -181,12 +181,13 @@ Spend less time configuring, more time enjoying your smart home.
181
181
  <details>
182
182
  <!-- TOOLS_TABLE_START -->
183
183
 
184
- <summary><b>Complete Tool List (88 tools)</b></summary>
184
+ <summary><b>Complete Tool List (89 tools)</b></summary>
185
185
 
186
186
  | Category | Tools |
187
187
  |----------|-------|
188
188
  | **Add-ons** | `ha_get_addon`, `ha_manage_addon` |
189
189
  | **Areas & Floors** | `ha_config_list_areas`, `ha_config_list_floors`, `ha_list_floors_areas`, `ha_remove_area_or_floor`, `ha_set_area_or_floor` |
190
+ | **Assist** | `ha_manage_pipeline` |
190
191
  | **Automations** | `ha_config_get_automation`, `ha_config_remove_automation`, `ha_config_set_automation` |
191
192
  | **Blueprints** | `ha_get_blueprint`, `ha_import_blueprint` |
192
193
  | **Calendar** | `ha_config_get_calendar_events`, `ha_config_remove_calendar_event`, `ha_config_set_calendar_event` |
@@ -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-89-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>
@@ -151,12 +151,13 @@ Spend less time configuring, more time enjoying your smart home.
151
151
  <details>
152
152
  <!-- TOOLS_TABLE_START -->
153
153
 
154
- <summary><b>Complete Tool List (88 tools)</b></summary>
154
+ <summary><b>Complete Tool List (89 tools)</b></summary>
155
155
 
156
156
  | Category | Tools |
157
157
  |----------|-------|
158
158
  | **Add-ons** | `ha_get_addon`, `ha_manage_addon` |
159
159
  | **Areas & Floors** | `ha_config_list_areas`, `ha_config_list_floors`, `ha_list_floors_areas`, `ha_remove_area_or_floor`, `ha_set_area_or_floor` |
160
+ | **Assist** | `ha_manage_pipeline` |
160
161
  | **Automations** | `ha_config_get_automation`, `ha_config_remove_automation`, `ha_config_set_automation` |
161
162
  | **Blueprints** | `ha_get_blueprint`, `ha_import_blueprint` |
162
163
  | **Calendar** | `ha_config_get_calendar_events`, `ha_config_remove_calendar_event`, `ha_config_set_calendar_event` |
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "7.5.0.dev557"
7
+ version = "7.5.0.dev559"
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"
@@ -5,13 +5,13 @@
5
5
  "email": ""
6
6
  },
7
7
  "metadata": {
8
- "description": "Agent skills for Home Assistant: best practices for automations, helpers, templates, and device control",
8
+ "description": "Agent skills for Home Assistant: best practices for automations, helpers, templates, device control, and dashboards",
9
9
  "version": "0.1.0"
10
10
  },
11
11
  "plugins": [
12
12
  {
13
13
  "name": "home-assistant-skills",
14
- "description": "Best practices for Home Assistant automations, helpers, scripts, and device controls",
14
+ "description": "Best practices for Home Assistant automations, helpers, scripts, device controls, and dashboards",
15
15
  "source": "./"
16
16
  }
17
17
  ]
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "home-assistant-skills",
3
- "description": "Agent skills for Home Assistant: best practices for automations, helpers, templates, and device control.",
3
+ "description": "Agent skills for Home Assistant: best practices for automations, helpers, templates, device control, and dashboards.",
4
4
  "version": "0.1.0",
5
5
  "repository": "https://github.com/homeassistant-ai/skills",
6
6
  "license": "MIT"
@@ -0,0 +1,8 @@
1
+ ## What does this PR do?
2
+
3
+ <!-- Describe what your change does and why. -->
4
+
5
+ ## Checklist
6
+
7
+ - [ ] Tested with real scenarios (if changing skill content)
8
+ - [ ] `README.md` Skill Contents table updated (if reference files were added or removed)
@@ -11,6 +11,9 @@ This is a community-contributed collection of **Agent Skills** for Home Assistan
11
11
  - `skills/<skill-name>/SKILL.md` — each skill lives in its own folder with a `SKILL.md` file
12
12
  - `CONTRIBUTING.md` — skill authoring guidelines and submission workflow
13
13
  - `.claude-plugin/plugin.json` — Claude Code plugin metadata
14
+ - `.claude-plugin/marketplace.json` — marketplace metadata for plugin discovery
15
+ - `AGENTS.md` — symlink to `CLAUDE.md` (for agents that use `AGENTS.md` convention)
16
+ - `.github/ISSUE_TEMPLATE/skill-rca.md` — "Report Bad Skill Advice" issue template
14
17
 
15
18
  ## Skill Format
16
19
 
@@ -26,7 +29,7 @@ description: >
26
29
 
27
30
  Constraints from CONTRIBUTING.md:
28
31
  - Max **500 lines** per SKILL.md
29
- - `metadata.version` must be `0` on new skills (CI assigns real version on merge; do not edit manually)
32
+ - `metadata.version` must be `0` on new skills (do not edit manually)
30
33
  - Reference files must be **one level deep** only (e.g. `references/example.yaml`)
31
34
  - Use **forward slashes** in all file paths
32
35
  - Optional subdirectories: `references/` (additional docs), `scripts/` (utility scripts), `assets/` (static resources)
@@ -41,9 +44,12 @@ Constraints from CONTRIBUTING.md:
41
44
 
42
45
  ## Validation
43
46
 
44
- CI runs `skills-ref validate` on every PR and push to `main` that touches `skills/**`. To validate locally:
47
+ CI runs two workflows on PRs and pushes to `main`:
48
+ - **validate-skills** — runs `skills-ref validate` on every skill when `skills/**` changes
49
+ - **validate-plugin** — validates `.claude-plugin/` metadata
50
+
51
+ To validate locally:
45
52
 
46
53
  ```bash
47
- pip install skills-ref
48
- python -m skills_ref.cli validate skills/<skill-name>
54
+ uvx skills-ref validate skills/<skill-name>
49
55
  ```
@@ -11,6 +11,9 @@ This is a community-contributed collection of **Agent Skills** for Home Assistan
11
11
  - `skills/<skill-name>/SKILL.md` — each skill lives in its own folder with a `SKILL.md` file
12
12
  - `CONTRIBUTING.md` — skill authoring guidelines and submission workflow
13
13
  - `.claude-plugin/plugin.json` — Claude Code plugin metadata
14
+ - `.claude-plugin/marketplace.json` — marketplace metadata for plugin discovery
15
+ - `AGENTS.md` — symlink to `CLAUDE.md` (for agents that use `AGENTS.md` convention)
16
+ - `.github/ISSUE_TEMPLATE/skill-rca.md` — "Report Bad Skill Advice" issue template
14
17
 
15
18
  ## Skill Format
16
19
 
@@ -26,7 +29,7 @@ description: >
26
29
 
27
30
  Constraints from CONTRIBUTING.md:
28
31
  - Max **500 lines** per SKILL.md
29
- - `metadata.version` must be `0` on new skills (CI assigns real version on merge; do not edit manually)
32
+ - `metadata.version` must be `0` on new skills (do not edit manually)
30
33
  - Reference files must be **one level deep** only (e.g. `references/example.yaml`)
31
34
  - Use **forward slashes** in all file paths
32
35
  - Optional subdirectories: `references/` (additional docs), `scripts/` (utility scripts), `assets/` (static resources)
@@ -41,9 +44,12 @@ Constraints from CONTRIBUTING.md:
41
44
 
42
45
  ## Validation
43
46
 
44
- CI runs `skills-ref validate` on every PR and push to `main` that touches `skills/**`. To validate locally:
47
+ CI runs two workflows on PRs and pushes to `main`:
48
+ - **validate-skills** — runs `skills-ref validate` on every skill when `skills/**` changes
49
+ - **validate-plugin** — validates `.claude-plugin/` metadata
50
+
51
+ To validate locally:
45
52
 
46
53
  ```bash
47
- pip install skills-ref
48
- python -m skills_ref.cli validate skills/<skill-name>
54
+ uvx skills-ref validate skills/<skill-name>
49
55
  ```
@@ -50,4 +50,5 @@ The template covers five sections: context, timeline, root cause, impact, and en
50
50
  2. Create a folder under `skills/` with your skill name.
51
51
  3. Write a `SKILL.md` following the format above.
52
52
  4. Test your skill with real scenarios.
53
- 5. Submit a pull request describing what your skill teaches and what problems it solves.
53
+ 5. If you added or removed reference files, update the **Skill Contents** table in `README.md`.
54
+ 6. Submit a pull request describing what your skill teaches and what problems it solves.
@@ -9,7 +9,7 @@ This repository provides an Agent Skill for Home Assistant, following the open [
9
9
 
10
10
  ## Included Skill
11
11
 
12
- **[home-assistant-best-practices](skills/home-assistant-best-practices/):** Native HA constructs over templates, helper selection, automation modes, Zigbee button patterns, device control best practices, and safe refactoring.
12
+ **[home-assistant-best-practices](skills/home-assistant-best-practices/):** Native HA constructs over templates, helper selection, automation modes, Zigbee button patterns, device control best practices, YAML-only integration management, dashboard configuration, and safe refactoring.
13
13
 
14
14
  ## Installation
15
15
 
@@ -34,13 +34,15 @@ Run each command separately inside Claude Code:
34
34
  /plugin install home-assistant-skills@homeassistant-ai-skills
35
35
  ```
36
36
 
37
- Restart Claude Code after installation for the skill to take effect.
37
+ Run `/reload-plugins` or restart Claude Code for the skill to take effect.
38
38
 
39
39
  ### Claude Desktop / claude.ai
40
40
 
41
41
  1. Download or clone this repository
42
42
  2. Zip the skill folder: `cd skills && zip -r home-assistant-best-practices.zip home-assistant-best-practices/`
43
- 3. **Settings → Capabilities → Skills → Upload skill** → select the `.zip` file
43
+ 3. Upload to:
44
+ - **Claude Desktop:** Customize (left sidebar) → Skills → + → Create skill
45
+ - **claude.ai:** [claude.ai/customize/skills](https://claude.ai/customize/skills) → Upload
44
46
 
45
47
  ## Skill Contents
46
48
 
@@ -52,8 +54,12 @@ The `home-assistant-best-practices` skill includes:
52
54
  | `references/safe-refactoring.md` | Safe workflow for renaming entities, replacing helpers, restructuring automations |
53
55
  | `references/automation-patterns.md` | Native conditions, triggers, waits, automation modes |
54
56
  | `references/helper-selection.md` | Built-in helpers vs template sensors (with decision matrix) |
55
- | `references/template-guidelines.md` | When templates are the right choice |
57
+ | `references/template-guidelines.md` | When to use templates, when to avoid them, and sensor best practices |
58
+ | `references/yaml-only-integrations.md` | YAML-only integration types, post-edit actions (reload vs restart) |
56
59
  | `references/device-control.md` | Service calls, entity_id vs device_id, Zigbee buttons |
60
+ | `references/dashboard-guide.md` | Dashboard layout, view types, sections, custom cards, CSS styling |
61
+ | `references/dashboard-cards.md` | Card type lookup and card-specific documentation |
62
+ | `references/domain-docs.md` | Integration and domain documentation for service calls, entity attributes |
57
63
  | `references/examples.yaml` | Compound examples combining multiple best practices |
58
64
 
59
65
  ## Contributing
@@ -18,10 +18,10 @@ description: >
18
18
  - Agent modifies entity IDs without checking consumers
19
19
  - Agent chooses wrong automation mode (e.g., single for motion lights)
20
20
  - Agent hard-codes values or picks raw sensor over derived helper
21
- - Agent searches for HA config files on disk or generates YAML snippets
21
+ - Agent edits `.storage/` files, writes raw YAML, or generates YAML snippets
22
22
  - Agent tells user to edit configuration.yaml for UI-configured integrations
23
23
  metadata:
24
- version: 2
24
+ version: 5
25
25
  ---
26
26
 
27
27
  # Home Assistant Best Practices
@@ -93,13 +93,21 @@ See `references/device-control.md#zigbee-buttonremote-patterns`.
93
93
  | `wait_template: "{{ is_state(...) }}"` | `wait_for_trigger` with state trigger | Event-driven, not polling; waits for *change* (see `references/safe-refactoring.md#trigger-restructuring` for semantic differences) | `references/automation-patterns.md#wait-actions` |
94
94
  | `device_id` in triggers | `entity_id` (or `device_ieee` for ZHA) | device_id breaks on re-add | `references/device-control.md#entity-id-vs-device-id` |
95
95
  | `mode: single` for motion lights | `mode: restart` | Re-triggers must reset the timer | `references/automation-patterns.md#automation-modes` |
96
+ | `enabled: false` as a top-level key in `automations.yaml` | `automation.turn_off` (temporary) or entity registry disable (permanent) | Not a valid top-level key — rejected during schema validation; automation loads as `unavailable` | `references/automation-patterns.md#disabling-automations` |
96
97
  | Template sensor for sum/mean | `min_max` helper | Declarative, handles unavailable states | `references/helper-selection.md#numeric-aggregation` |
97
98
  | Template binary sensor with threshold | `threshold` helper | Built-in hysteresis support | `references/helper-selection.md#threshold` |
98
- | Renaming entity IDs without impact analysis | Follow `references/safe-refactoring.md` workflow | Renames break dashboards, scripts, and scenes silently | `references/safe-refactoring.md#entity-renames` |
99
+ | Renaming entity IDs without impact analysis | Follow `references/safe-refactoring.md` workflow | Renames break dashboards, scripts, scenes, Config-Entry data, and storage dashboards silently | `references/safe-refactoring.md#entity-renames` |
100
+ | Renaming members of Config-Entry-based groups (UI groups) without updating membership | Update group membership via Options Flow after the registry rename | The entity registry rename does not update `options.entities` in the Config Entry — group silently breaks | `references/safe-refactoring.md#config-entry-groups` |
101
+ | Renaming entities used by Config-Entry integrations (Better/Generic Thermostat, Min/Max, Threshold) without patching Config-Entry data | Scan and patch `core.config_entries` `data`+`options` fields | These integrations store entity_ids in Config Entry — not updated by entity registry renames | `references/safe-refactoring.md#config-entry-data--blind-spots-for-entity-registry-renames` |
99
102
  | `template:` sensor/binary sensor in YAML | Template Helper (UI or config flow API) | Requires file edit and config reload; harder to manage | `references/template-guidelines.md` |
100
- | Searching for or reading HA config files on disk | Use the HA REST/WebSocket API to manage config programmatically | HA is a remote system accessed via APIs; config files are not on the local filesystem | — |
103
+ | Editing `.storage/` files or other HA internal state directly | Use the HA REST/WebSocket API to manage state and config entries | `.storage/` files are HA's internal state database; direct edits bypass validation, risk corruption, and can be silently overwritten by HA | — |
104
+ | Writing raw YAML to `configuration.yaml` by hand for YAML-only integrations | Use managed YAML config editing with backup and validation | Unmanaged writes risk syntax errors, have no backup, and skip `check_config` — managed editing provides all three | `references/yaml-only-integrations.md` |
101
105
  | Generating YAML snippets for automations/scripts/scenes | Use the HA config API to create automations/scripts programmatically | API calls validate config, avoid syntax errors, and don't require manual file edits or restarts | `references/automation-patterns.md`, `references/examples.yaml` |
102
106
  | Telling user to edit `configuration.yaml` for integrations | Direct user to Settings > Devices & Services in the HA UI | Most integrations are UI-configured; YAML integration config is rare and integration-specific | — |
107
+ | Referring to HA "add-ons" | Use the term "Apps" | HA renamed add-ons to Apps in 2026.2 — "Apps are standalone applications that run alongside Home Assistant" | — |
108
+ | `vacuum.send_command` with vendor room IDs | `vacuum.clean_area` with HA `area_id` (if segments are mapped) | Uses native HA areas, works across integrations — but requires segment-to-area mapping in entity settings first | `references/device-control.md#vacuum-control` |
109
+ | Using `color_temp` (mireds) in light service calls | Use `color_temp_kelvin` | The `color_temp` parameter was removed in 2026.3; only Kelvin is supported | `references/device-control.md#lights` |
110
+ | Person/Device Tracker `entered_home`/`left_home` device triggers or `is_home`/`is_not_home` conditions | `state` trigger `to: home` / `to: not_home`, or `state` condition | These were removed in 2026.5 — state triggers and conditions are the correct replacements | `references/automation-patterns.md#presence-and-person-triggers-and-conditions-removed-in-20265` |
103
111
 
104
112
  ---
105
113
 
@@ -109,10 +117,11 @@ Read these when you need detailed information:
109
117
 
110
118
  | File | When to read | Key sections |
111
119
  |------|--------------|--------------|
112
- | `references/safe-refactoring.md` | Renaming entities, replacing helpers, restructuring automations, or any modification to existing config | `#universal-workflow`, `#entity-renames`, `#helper-replacements`, `#trigger-restructuring` |
113
- | `references/automation-patterns.md` | Writing triggers, conditions, waits, or choosing automation modes | `#native-conditions`, `#trigger-types`, `#wait-actions`, `#automation-modes`, `#ifthen-vs-choose`, `#trigger-ids` |
114
- | `references/helper-selection.md` | Deciding whether to use a built-in helper vs template sensor | `#numeric-aggregation`, `#rate-and-change`, `#time-based-tracking`, `#counting-and-timing`, `#scheduling`, `#entity-grouping`, `#decision-matrix` |
120
+ | `references/safe-refactoring.md` | Renaming entities, replacing helpers, restructuring automations, or any modification to existing config | `#universal-workflow`, `#entity-renames`, `#helper-replacements`, `#trigger-restructuring`, `#config-entry-data--blind-spots-for-entity-registry-renames`, `#storage-mode-dashboards-storagelovelace` |
121
+ | `references/automation-patterns.md` | Writing triggers, conditions, waits, or choosing automation modes; disabling automations | `#native-conditions`, `#trigger-types`, `#wait-actions`, `#automation-modes`, `#continue-on-error`, `#repeat-actions`, `#ifthen-vs-choose`, `#trigger-ids`, `#disabling-automations` |
122
+ | `references/helper-selection.md` | Deciding whether to use a built-in helper vs template sensor | `#menu-based-helpers`, `#numeric-aggregation`, `#rate-and-change`, `#time-based-tracking`, `#counting-and-timing`, `#scheduling`, `#entity-grouping`, `#data-smoothing`, `#random-values`, `#climate-control`, `#domain-conversion`, `#template-helpers`, `#decision-matrix` |
115
123
  | `references/template-guidelines.md` | Confirming templates ARE appropriate for a use case | `#when-templates-are-appropriate`, `#when-to-avoid-templates`, `#template-sensor-best-practices`, `#common-patterns`, `#error-handling` |
124
+ | `references/yaml-only-integrations.md` | Creating or editing YAML-only integrations that have no config flow (e.g. `command_line`, platform-based `mqtt`, `rest`) | `#yaml-only-integration-types`, `#post-edit-actions` |
116
125
  | `references/device-control.md` | Writing service calls, Zigbee button automations, or using target: | `#entity-id-vs-device-id`, `#service-calls-best-practices`, `#zigbee-buttonremote-patterns`, `#domain-specific-patterns` |
117
126
  | `references/dashboard-guide.md` | Designing or modifying Lovelace dashboards — layout, view types, sections, custom cards, CSS styling, HACS | `#dashboard-structure`, `#view-types`, `#built-in-cards`, `#features`, `#custom-cards`, `#css-styling`, `#common-pitfalls` |
118
127
  | `references/dashboard-cards.md` | Looking up available card types or fetching card-specific documentation | — |
@@ -48,6 +48,54 @@
48
48
  "description": "Response does NOT recommend a template sensor (YAML or UI helper) as the primary solution"
49
49
  }
50
50
  ]
51
+ },
52
+ {
53
+ "id": 4,
54
+ "eval_name": "arrive-home-automation",
55
+ "prompt": "create an automation that turns on the lights when I get home",
56
+ "expected_output": "Uses state trigger with to: home on a person entity. Does NOT use the removed entered_home device trigger type.",
57
+ "assertions": [
58
+ {
59
+ "id": "uses_state_trigger",
60
+ "description": "Response uses a state trigger (trigger: state) on a person or device_tracker entity, to: home"
61
+ },
62
+ {
63
+ "id": "no_entered_home_trigger",
64
+ "description": "Response does NOT use the entered_home device trigger type (removed in 2026.5)"
65
+ }
66
+ ]
67
+ },
68
+ {
69
+ "id": 5,
70
+ "eval_name": "timer-finished-automation",
71
+ "prompt": "make an automation that announces on my speaker when my kitchen timer finishes",
72
+ "expected_output": "Uses timer.finished event trigger. Does NOT use a polling template or state trigger workaround.",
73
+ "assertions": [
74
+ {
75
+ "id": "uses_timer_finished_event",
76
+ "description": "Response uses event trigger with event_type: timer.finished (or purpose-specific timer trigger)"
77
+ },
78
+ {
79
+ "id": "no_polling_workaround",
80
+ "description": "Response does NOT suggest polling or a wait_template workaround for detecting timer completion"
81
+ }
82
+ ]
83
+ },
84
+ {
85
+ "id": 6,
86
+ "eval_name": "assist-shortcut-card",
87
+ "prompt": "add a card to my dashboard to quickly launch Assist",
88
+ "expected_output": "Recommends the shortcut card (new in 2026.5) for launching Assist from a dashboard.",
89
+ "assertions": [
90
+ {
91
+ "id": "recommends_shortcut_card",
92
+ "description": "Response recommends the shortcut card type for launching Assist"
93
+ },
94
+ {
95
+ "id": "not_just_button_card",
96
+ "description": "Response does not exclusively recommend a button card with tap_action when shortcut is more appropriate"
97
+ }
98
+ ]
51
99
  }
52
100
  ]
53
101
  }