ha-mcp-dev 7.1.0.dev300__tar.gz → 7.1.0.dev301__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 (101) hide show
  1. {ha_mcp_dev-7.1.0.dev300/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.1.0.dev301}/PKG-INFO +4 -4
  2. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/README.md +3 -3
  3. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/pyproject.toml +2 -2
  4. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/config.py +5 -3
  5. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/errors.py +3 -3
  6. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +3 -1
  7. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/resources/skills-vendor/AGENTS.md +2 -0
  8. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +2 -0
  9. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +5 -1
  10. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +27 -10
  11. ha_mcp_dev-7.1.0.dev301/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +53 -0
  12. ha_mcp_dev-7.1.0.dev301/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +36 -0
  13. ha_mcp_dev-7.1.0.dev301/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +405 -0
  14. ha_mcp_dev-7.1.0.dev301/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +43 -0
  15. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +105 -0
  16. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +81 -4
  17. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +72 -5
  18. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/tools_config_automations.py +4 -4
  19. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/tools_config_dashboards.py +4 -191
  20. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/tools_config_helpers.py +2 -2
  21. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/tools_config_scripts.py +5 -5
  22. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/tools_service.py +2 -2
  23. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/tools_utility.py +0 -68
  24. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301/src/ha_mcp_dev.egg-info}/PKG-INFO +4 -4
  25. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp_dev.egg-info/SOURCES.txt +4 -3
  26. ha_mcp_dev-7.1.0.dev300/src/ha_mcp/resources/card_types.json +0 -48
  27. ha_mcp_dev-7.1.0.dev300/src/ha_mcp/resources/dashboard_guide.md +0 -574
  28. ha_mcp_dev-7.1.0.dev300/src/ha_mcp/tools/tools_config_info.py +0 -258
  29. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/LICENSE +0 -0
  30. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/MANIFEST.in +0 -0
  31. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/setup.cfg +0 -0
  32. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/__init__.py +0 -0
  33. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/__main__.py +0 -0
  34. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/_pypi_marker +0 -0
  35. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/auth/__init__.py +0 -0
  36. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/auth/consent_form.py +0 -0
  37. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/auth/provider.py +0 -0
  38. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/client/__init__.py +0 -0
  39. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/client/rest_client.py +0 -0
  40. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/client/websocket_client.py +0 -0
  41. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/client/websocket_listener.py +0 -0
  42. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/py.typed +0 -0
  43. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  44. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  45. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  46. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  47. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  48. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  49. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  50. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  51. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/server.py +0 -0
  52. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/smoke_test.py +0 -0
  53. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/__init__.py +0 -0
  54. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/backup.py +0 -0
  55. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  56. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/device_control.py +0 -0
  57. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/enhanced.py +0 -0
  58. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/helpers.py +0 -0
  59. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/registry.py +0 -0
  60. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/smart_search.py +0 -0
  61. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/tools_addons.py +0 -0
  62. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/tools_areas.py +0 -0
  63. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  64. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  65. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/tools_calendar.py +0 -0
  66. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/tools_camera.py +0 -0
  67. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/tools_config_entry_flow.py +0 -0
  68. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/tools_entities.py +0 -0
  69. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  70. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/tools_groups.py +0 -0
  71. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/tools_hacs.py +0 -0
  72. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/tools_history.py +0 -0
  73. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/tools_integrations.py +0 -0
  74. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/tools_labels.py +0 -0
  75. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
  76. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/tools_registry.py +0 -0
  77. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/tools_resources.py +0 -0
  78. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/tools_search.py +0 -0
  79. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/tools_services.py +0 -0
  80. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/tools_system.py +0 -0
  81. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/tools_todo.py +0 -0
  82. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/tools_traces.py +0 -0
  83. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/tools_updates.py +0 -0
  84. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  85. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/tools_zones.py +0 -0
  86. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/tools/util_helpers.py +0 -0
  87. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/transforms/__init__.py +0 -0
  88. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/transforms/categorized_search.py +0 -0
  89. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/utils/__init__.py +0 -0
  90. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/utils/domain_handlers.py +0 -0
  91. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  92. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/utils/operation_manager.py +0 -0
  93. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/utils/python_sandbox.py +0 -0
  94. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp/utils/usage_logger.py +0 -0
  95. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  96. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  97. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  98. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  99. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/tests/__init__.py +0 -0
  100. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/tests/test_constants.py +0 -0
  101. {ha_mcp_dev-7.1.0.dev300 → ha_mcp_dev-7.1.0.dev301}/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.1.0.dev300
3
+ Version: 7.1.0.dev301
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
@@ -167,7 +167,7 @@ Spend less time configuring, more time enjoying your smart home.
167
167
  | **Automations** | `ha_config_get_automation`, `ha_config_set_automation`, `ha_config_remove_automation` |
168
168
  | **Scripts** | `ha_config_get_script`, `ha_config_set_script`, `ha_config_remove_script` |
169
169
  | **Helper Entities** | `ha_config_list_helpers`, `ha_config_set_helper`, `ha_config_remove_helper` |
170
- | **Dashboards** | `ha_config_get_dashboard`, `ha_config_set_dashboard`, `ha_config_delete_dashboard`, `ha_get_dashboard_guide`, `ha_get_card_documentation` |
170
+ | **Dashboards** | `ha_config_get_dashboard`, `ha_config_set_dashboard`, `ha_config_delete_dashboard` + dashboard skill references |
171
171
  | **Areas & Floors** | `ha_config_list_areas`, `ha_config_set_area`, `ha_config_remove_area`, `ha_config_list_floors`, `ha_config_set_floor`, `ha_config_remove_floor` |
172
172
  | **Labels** | `ha_config_get_label`, `ha_config_set_label`, `ha_config_remove_label`, `ha_manage_entity_labels` |
173
173
  | **Zones** | `ha_get_zone`, `ha_set_zone`, `ha_remove_zone` |
@@ -183,7 +183,7 @@ Spend less time configuring, more time enjoying your smart home.
183
183
  | **Automation Traces** | `ha_get_automation_traces` |
184
184
  | **System & Updates** | `ha_check_config`, `ha_restart`, `ha_reload_core`, `ha_get_system_info`, `ha_get_system_health`, `ha_get_updates` |
185
185
  | **Backup & Restore** | `ha_backup_create`, `ha_backup_restore` |
186
- | **Utility** | `ha_get_logbook`, `ha_eval_template`, `ha_get_domain_docs`, `ha_get_integration` |
186
+ | **Utility** | `ha_get_logbook`, `ha_eval_template`, `ha_get_integration` |
187
187
 
188
188
  </details>
189
189
 
@@ -202,7 +202,7 @@ Skills from `homeassistant-ai/skills` are bundled and served as [MCP resources](
202
202
  | Setting | Default | Description |
203
203
  |---------|---------|-------------|
204
204
  | `ENABLE_SKILLS` | `true` | Serve skills as MCP resources. Resources are not auto-injected into context — clients must explicitly request them. |
205
- | `ENABLE_SKILLS_AS_TOOLS` | `false` | Also expose skills via `list_resources`/`read_resource` tools for clients that don't support MCP resources natively. |
205
+ | `ENABLE_SKILLS_AS_TOOLS` | `true` | Expose skills and doc resources via `list_resources`/`read_resource` tools. Resource-capable clients can set to `false` to reduce tool count. |
206
206
 
207
207
  Skills can still be installed manually for clients that prefer local skill files — see the [skills repo](https://github.com/homeassistant-ai/skills) for instructions.
208
208
 
@@ -138,7 +138,7 @@ Spend less time configuring, more time enjoying your smart home.
138
138
  | **Automations** | `ha_config_get_automation`, `ha_config_set_automation`, `ha_config_remove_automation` |
139
139
  | **Scripts** | `ha_config_get_script`, `ha_config_set_script`, `ha_config_remove_script` |
140
140
  | **Helper Entities** | `ha_config_list_helpers`, `ha_config_set_helper`, `ha_config_remove_helper` |
141
- | **Dashboards** | `ha_config_get_dashboard`, `ha_config_set_dashboard`, `ha_config_delete_dashboard`, `ha_get_dashboard_guide`, `ha_get_card_documentation` |
141
+ | **Dashboards** | `ha_config_get_dashboard`, `ha_config_set_dashboard`, `ha_config_delete_dashboard` + dashboard skill references |
142
142
  | **Areas & Floors** | `ha_config_list_areas`, `ha_config_set_area`, `ha_config_remove_area`, `ha_config_list_floors`, `ha_config_set_floor`, `ha_config_remove_floor` |
143
143
  | **Labels** | `ha_config_get_label`, `ha_config_set_label`, `ha_config_remove_label`, `ha_manage_entity_labels` |
144
144
  | **Zones** | `ha_get_zone`, `ha_set_zone`, `ha_remove_zone` |
@@ -154,7 +154,7 @@ Spend less time configuring, more time enjoying your smart home.
154
154
  | **Automation Traces** | `ha_get_automation_traces` |
155
155
  | **System & Updates** | `ha_check_config`, `ha_restart`, `ha_reload_core`, `ha_get_system_info`, `ha_get_system_health`, `ha_get_updates` |
156
156
  | **Backup & Restore** | `ha_backup_create`, `ha_backup_restore` |
157
- | **Utility** | `ha_get_logbook`, `ha_eval_template`, `ha_get_domain_docs`, `ha_get_integration` |
157
+ | **Utility** | `ha_get_logbook`, `ha_eval_template`, `ha_get_integration` |
158
158
 
159
159
  </details>
160
160
 
@@ -173,7 +173,7 @@ Skills from `homeassistant-ai/skills` are bundled and served as [MCP resources](
173
173
  | Setting | Default | Description |
174
174
  |---------|---------|-------------|
175
175
  | `ENABLE_SKILLS` | `true` | Serve skills as MCP resources. Resources are not auto-injected into context — clients must explicitly request them. |
176
- | `ENABLE_SKILLS_AS_TOOLS` | `false` | Also expose skills via `list_resources`/`read_resource` tools for clients that don't support MCP resources natively. |
176
+ | `ENABLE_SKILLS_AS_TOOLS` | `true` | Expose skills and doc resources via `list_resources`/`read_resource` tools. Resource-capable clients can set to `false` to reduce tool count. |
177
177
 
178
178
  Skills can still be installed manually for clients that prefer local skill files — see the [skills repo](https://github.com/homeassistant-ai/skills) for instructions.
179
179
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "7.1.0.dev300"
7
+ version = "7.1.0.dev301"
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"
@@ -52,7 +52,7 @@ package-dir = {"" = "src", "tests" = "tests"}
52
52
  packages = { find = { where = ["src", "."], include = ["ha_mcp*", "tests"] } }
53
53
 
54
54
  [tool.setuptools.package-data]
55
- ha_mcp = ["py.typed", "_pypi_marker", "resources/*.md", "resources/*.json", "resources/skills-vendor/**/*"]
55
+ ha_mcp = ["py.typed", "_pypi_marker", "resources/skills-vendor/**/*"]
56
56
 
57
57
  [tool.mypy]
58
58
  python_version = "3.13"
@@ -90,9 +90,11 @@ class Settings(BaseSettings):
90
90
  # Resources are not auto-injected — clients must explicitly request them.
91
91
  enable_skills: bool = Field(True, alias="ENABLE_SKILLS")
92
92
 
93
- # Expose skills as tools (list_resources/read_resource) for clients
94
- # that don't support MCP resources natively.
95
- enable_skills_as_tools: bool = Field(False, alias="ENABLE_SKILLS_AS_TOOLS")
93
+ # Expose skills and doc resources as tools (list_resources/read_resource)
94
+ # for clients that don't support MCP resources natively.
95
+ # Defaults to True so all clients can access documentation and skills.
96
+ # Resource-capable clients can set to False to reduce tool count.
97
+ enable_skills_as_tools: bool = Field(True, alias="ENABLE_SKILLS_AS_TOOLS")
96
98
 
97
99
  # Tool search transform — replaces the full tool catalog with a unified
98
100
  # BM25 search tool and categorized call proxies (read/write/delete).
@@ -137,7 +137,7 @@ DEFAULT_SUGGESTIONS: dict[ErrorCode, list[str]] = {
137
137
  "Entity domain must match the original domain",
138
138
  ],
139
139
  ErrorCode.SERVICE_NOT_FOUND: [
140
- "Use ha_get_domain_docs() to see available services",
140
+ "Use ha_get_skill_home_assistant_best_practices for documentation",
141
141
  "Check the service name spelling",
142
142
  "Verify the domain supports this service",
143
143
  ],
@@ -148,7 +148,7 @@ DEFAULT_SUGGESTIONS: dict[ErrorCode, list[str]] = {
148
148
  ErrorCode.SERVICE_INVALID_ACTION: [
149
149
  "Check available actions for this domain",
150
150
  "Common actions: turn_on, turn_off, toggle",
151
- "Use ha_get_domain_docs() for service documentation",
151
+ "Use ha_get_skill_home_assistant_best_practices for documentation",
152
152
  ],
153
153
  ErrorCode.SERVICE_CALL_FAILED: [
154
154
  "Check the service parameters are correct",
@@ -161,7 +161,7 @@ DEFAULT_SUGGESTIONS: dict[ErrorCode, list[str]] = {
161
161
  ],
162
162
  ErrorCode.CONFIG_INVALID: [
163
163
  "Review the configuration format",
164
- "Use ha_get_domain_docs() for configuration help",
164
+ "Use ha_get_skill_home_assistant_best_practices for configuration help",
165
165
  ],
166
166
  ErrorCode.CONFIG_MISSING_REQUIRED_FIELDS: [
167
167
  "Check documentation for required fields",
@@ -1,5 +1,7 @@
1
1
  {
2
- "enabledPlugins": {},
2
+ "enabledPlugins": {
3
+ "skill-creator@claude-plugins-official": true
4
+ },
3
5
  "extraKnownMarketplaces": {
4
6
  "anthropic-agent-skills": {
5
7
  "source": {
@@ -26,6 +26,7 @@ description: >
26
26
 
27
27
  Constraints from CONTRIBUTING.md:
28
28
  - 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)
29
30
  - Reference files must be **one level deep** only (e.g. `references/example.yaml`)
30
31
  - Use **forward slashes** in all file paths
31
32
  - Optional subdirectories: `references/` (additional docs), `scripts/` (utility scripts), `assets/` (static resources)
@@ -36,6 +37,7 @@ Constraints from CONTRIBUTING.md:
36
37
  - **Conciseness** — provide patterns and quick-reference tables, not tutorials
37
38
  - **Consistent terminology** — one term per concept throughout a skill
38
39
  - **Symptom-based triggering** — the `description` frontmatter should describe observable agent behaviors that signal the skill is needed
40
+ - **No tool names** — reference HA REST APIs and concepts, never specific MCP tool names (e.g. `ha_rename_entity`); tool names vary by agent setup
39
41
 
40
42
  ## Validation
41
43
 
@@ -26,6 +26,7 @@ description: >
26
26
 
27
27
  Constraints from CONTRIBUTING.md:
28
28
  - 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)
29
30
  - Reference files must be **one level deep** only (e.g. `references/example.yaml`)
30
31
  - Use **forward slashes** in all file paths
31
32
  - Optional subdirectories: `references/` (additional docs), `scripts/` (utility scripts), `assets/` (static resources)
@@ -36,6 +37,7 @@ Constraints from CONTRIBUTING.md:
36
37
  - **Conciseness** — provide patterns and quick-reference tables, not tutorials
37
38
  - **Consistent terminology** — one term per concept throughout a skill
38
39
  - **Symptom-based triggering** — the `description` frontmatter should describe observable agent behaviors that signal the skill is needed
40
+ - **No tool names** — reference HA REST APIs and concepts, never specific MCP tool names (e.g. `ha_rename_entity`); tool names vary by agent setup
39
41
 
40
42
  ## Validation
41
43
 
@@ -18,7 +18,7 @@ skills/
18
18
  ### SKILL.md requirements
19
19
 
20
20
  - **YAML frontmatter** with `name` (letters, numbers, hyphens only; 64 chars max) and `description` (1024 chars max).
21
- - **`metadata.version`** using [semver](https://semver.org/) (e.g. `"1.0.0"`). Bump the version in every PR that changes skill content. CI enforces this.
21
+ - **`metadata.version`** a monotonically incrementing integer (e.g. `1`). Set to `0` when creating a new skill CI assigns the real version automatically on merge. Do not edit this field manually.
22
22
  - **`description`** in third person. Describe what the skill does and when to use it. Include keywords that help agents match tasks. Don't summarize the skill's workflow.
23
23
  - **Body** under 500 lines. Split into reference files if approaching this limit.
24
24
  - **Reference files** one level deep from SKILL.md—no nested references.
@@ -34,6 +34,10 @@ See Anthropic's [skill authoring best practices](https://docs.anthropic.com/en/d
34
34
 
35
35
  **Consistent terminology.** Choose one term for each concept and stick to it throughout the skill.
36
36
 
37
+ **Don't couple skills to specific tool names.** Reference HA concepts and REST APIs instead of naming specific MCP tools (e.g. `ha_rename_entity`, `ha_get_integration`). Tool names change and not all agents have the same toolset; the underlying HA APIs and concepts are stable.
38
+
39
+ **No opinionated conventions.** Skills in this repo are applied to any HA installation. Naming conventions, code style preferences, and other user-space opinions belong in a personal skill or instance-level `CLAUDE.md`, not here. Only include guidance that reflects official HA behaviour or well-established community consensus.
40
+
37
41
  ## Reporting Skill Problems
38
42
 
39
43
  When a skill misleads your agent — broken dashboards, failed automations, wrong configurations — first search existing issues for the same skill and failure. If a matching issue exists, react with thumbs-up or comment with additional context. Otherwise, open a new issue with the **Report Bad Skill Advice** template. Let the agent fill it out — it holds the full context and can trace the failure to its source in the skill.
@@ -1,22 +1,27 @@
1
1
  ---
2
2
  name: home-assistant-best-practices
3
3
  description: >
4
- Best practices for Home Assistant automations, helpers, scripts, and device controls.
4
+ Best practices for HA automations, helpers, scripts, device controls, and dashboards.
5
5
 
6
6
  TRIGGER THIS SKILL WHEN:
7
- - Creating or editing HA automations, scripts, or scenes
7
+ - Creating/editing automations, scripts, scenes, or dashboards
8
8
  - Choosing between template sensors and built-in helpers
9
9
  - Writing or restructuring triggers, conditions, or automation modes
10
10
  - Setting up Zigbee button/remote automations (ZHA or Zigbee2MQTT)
11
- - Renaming entities or migrating device_id references to entity_id
12
-
13
- SYMPTOMS THAT TRIGGER THIS SKILL:
14
- - Agent uses Jinja2 templates where native conditions, triggers, or helpers exist
15
- - Agent uses device_id instead of entity_id in triggers/actions
16
- - Agent modifies entity IDs or config objects without checking all consumers
11
+ - Renaming entities or migrating device_id to entity_id
12
+ - Configuring dashboard cards or picking helpers to feed them
13
+ - Looking up card types or domain-specific documentation
14
+
15
+ SYMPTOMS:
16
+ - Agent uses Jinja2 templates where native conditions/triggers/helpers exist
17
+ - Agent uses device_id instead of entity_id
18
+ - Agent modifies entity IDs without checking consumers
17
19
  - Agent chooses wrong automation mode (e.g., single for motion lights)
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
22
+ - Agent tells user to edit configuration.yaml for UI-configured integrations
18
23
  metadata:
19
- version: "1.0.0"
24
+ version: 2
20
25
  ---
21
26
 
22
27
  # Home Assistant Best Practices
@@ -42,7 +47,7 @@ Before writing any template, check `references/automation-patterns.md` for nativ
42
47
  - `{{ now().hour >= 9 }}` → `condition: time` with `after: "09:00:00"`
43
48
  - `wait_template: "{{ is_state(...) }}"` → `wait_for_trigger` with state trigger (caveat: different behavior when state is already true — see `references/safe-refactoring.md#trigger-restructuring`)
44
49
 
45
- ### 2. Check for built-in helper
50
+ ### 2. Check for built-in helper or Template Helper
46
51
  Before creating a template sensor, check `references/helper-selection.md`.
47
52
 
48
53
  **Common substitutions:**
@@ -52,6 +57,11 @@ Before creating a template sensor, check `references/helper-selection.md`.
52
57
  - Cross threshold detection → `threshold` integration
53
58
  - Consumption tracking → `utility_meter` helper
54
59
 
60
+ **If no built-in helper fits, use a Template Helper — not YAML.**
61
+ Create it via the HA config flow (MCP tool or API) or via the UI:
62
+ Settings → Devices & Services → Helpers → Create Helper → Template.
63
+ Only write `template:` YAML if explicitly requested or if neither path is available.
64
+
55
65
  ### 3. Select correct automation mode
56
66
  Default `single` mode is often wrong. See `references/automation-patterns.md#automation-modes`.
57
67
 
@@ -86,6 +96,10 @@ See `references/device-control.md#zigbee-buttonremote-patterns`.
86
96
  | Template sensor for sum/mean | `min_max` helper | Declarative, handles unavailable states | `references/helper-selection.md#numeric-aggregation` |
87
97
  | Template binary sensor with threshold | `threshold` helper | Built-in hysteresis support | `references/helper-selection.md#threshold` |
88
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
+ | `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 | — |
101
+ | 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
+ | 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 | — |
89
103
 
90
104
  ---
91
105
 
@@ -100,4 +114,7 @@ Read these when you need detailed information:
100
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` |
101
115
  | `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` |
102
116
  | `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
+ | `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
+ | `references/dashboard-cards.md` | Looking up available card types or fetching card-specific documentation | — |
119
+ | `references/domain-docs.md` | Looking up integration or domain documentation for service calls, entity attributes, or configuration | — |
103
120
  | `references/examples.yaml` | Need compound examples combining multiple best practices | — |
@@ -0,0 +1,53 @@
1
+ {
2
+ "skill_name": "home-assistant-best-practices",
3
+ "evals": [
4
+ {
5
+ "id": 1,
6
+ "eval_name": "vacuum-last-clean",
7
+ "prompt": "create a sensor that shows my vacuum's last clean time in a human-readable format",
8
+ "expected_output": "Recommends creating a Template Helper (via UI or config flow/MCP), NOT writing a template: block in configuration.yaml",
9
+ "assertions": [
10
+ {
11
+ "id": "recommends_template_helper",
12
+ "description": "Response recommends Template Helper (UI or API/MCP) rather than YAML template: block"
13
+ },
14
+ {
15
+ "id": "no_yaml_template_first",
16
+ "description": "Response does NOT lead with or exclusively suggest writing template: YAML in configuration.yaml"
17
+ }
18
+ ]
19
+ },
20
+ {
21
+ "id": 2,
22
+ "eval_name": "media-player-song",
23
+ "prompt": "I want a sensor showing my media player's current song title",
24
+ "expected_output": "Recommends creating a Template Helper (via UI or config flow/MCP) for attribute extraction, not YAML",
25
+ "assertions": [
26
+ {
27
+ "id": "recommends_template_helper",
28
+ "description": "Response recommends Template Helper (UI or API/MCP) rather than YAML template: block"
29
+ },
30
+ {
31
+ "id": "no_yaml_template_first",
32
+ "description": "Response does NOT lead with or exclusively suggest writing template: YAML in configuration.yaml"
33
+ }
34
+ ]
35
+ },
36
+ {
37
+ "id": 3,
38
+ "eval_name": "avg-temperature",
39
+ "prompt": "create a sensor that averages my 3 room temperature sensors",
40
+ "expected_output": "Recommends min_max helper (built-in integration), NOT Template Helper or YAML template",
41
+ "assertions": [
42
+ {
43
+ "id": "recommends_min_max",
44
+ "description": "Response recommends the min_max integration helper with type: mean"
45
+ },
46
+ {
47
+ "id": "no_template_needed",
48
+ "description": "Response does NOT recommend a template sensor (YAML or UI helper) as the primary solution"
49
+ }
50
+ ]
51
+ }
52
+ ]
53
+ }
@@ -0,0 +1,36 @@
1
+ # Dashboard Card Types
2
+
3
+ Home Assistant provides 37 built-in card types. For card-specific documentation, fetch from GitHub on demand.
4
+
5
+ ## Available Card Types
6
+
7
+ alarm-panel, area, button, calendar, clock, conditional, energy, entities, entity-filter, entity, gauge, glance, grid, heading, history-graph, horizontal-stack, humidifier, iframe, light, logbook, map, markdown, media-control, picture-elements, picture-entity, picture-glance, picture, plant-status, sensor, shopping-list, statistic, statistics-graph, thermostat, tile, todo-list, vertical-stack, weather-forecast
8
+
9
+ **Note:** The HA docs URL pattern also covers 4 view types (`masonry`, `panel`, `sections`, `sidebar`) — these are set at the view level via `"type"` in view config, NOT inside card arrays. See `references/dashboard-guide.md#view-types`.
10
+
11
+ ## Fetching Card Documentation
12
+
13
+ To get detailed documentation for a specific card type, fetch from the Home Assistant docs:
14
+
15
+ ```
16
+ https://raw.githubusercontent.com/home-assistant/home-assistant.io/refs/heads/current/source/_dashboards/{card_type}.markdown
17
+ ```
18
+
19
+ Replace `{card_type}` with the card name from the list above (e.g., `tile`, `grid`, `button`).
20
+
21
+ If the MCP server registers resource URI templates for card docs, prefer those over raw GitHub fetches.
22
+
23
+ ## Quick Card Selection Guide
24
+
25
+ | Need | Card |
26
+ |------|------|
27
+ | Control any entity | `tile` (modern default) |
28
+ | Layout multiple cards in columns | `grid` |
29
+ | Navigation button | `button` with `tap_action: navigate` |
30
+ | Room overview with controls | `area` |
31
+ | Historical data graph | `history-graph` or `statistics-graph` |
32
+ | Sensor value display | `sensor` or `gauge` |
33
+ | Show/hide cards conditionally | `conditional` |
34
+ | Embed external page | `iframe` |
35
+ | Rich text / instructions | `markdown` |
36
+ | Camera or image with overlays | `picture-elements` |