ha-mcp-dev 7.2.0.dev367__tar.gz → 7.2.0.dev369__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.2.0.dev367/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.2.0.dev369}/PKG-INFO +2 -2
  2. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/README.md +1 -1
  3. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/pyproject.toml +1 -1
  4. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/tools_history.py +10 -3
  5. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/tools_yaml_config.py +23 -22
  6. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369/src/ha_mcp_dev.egg-info}/PKG-INFO +2 -2
  7. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/LICENSE +0 -0
  8. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/MANIFEST.in +0 -0
  9. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/setup.cfg +0 -0
  10. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/__init__.py +0 -0
  11. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/__main__.py +0 -0
  12. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/_pypi_marker +0 -0
  13. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/auth/__init__.py +0 -0
  14. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/auth/consent_form.py +0 -0
  15. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/auth/provider.py +0 -0
  16. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/client/__init__.py +0 -0
  17. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/client/rest_client.py +0 -0
  18. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/client/websocket_client.py +0 -0
  19. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/client/websocket_listener.py +0 -0
  20. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/config.py +0 -0
  21. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/errors.py +0 -0
  22. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/py.typed +0 -0
  23. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  24. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  25. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  26. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  27. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  28. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  29. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  30. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  31. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  32. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  33. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  34. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  35. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  36. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  37. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  38. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  39. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  40. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  41. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  42. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  43. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/server.py +0 -0
  44. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/smoke_test.py +0 -0
  45. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/__init__.py +0 -0
  46. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/backup.py +0 -0
  47. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  48. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/device_control.py +0 -0
  49. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/enhanced.py +0 -0
  50. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/helpers.py +0 -0
  51. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/registry.py +0 -0
  52. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/smart_search.py +0 -0
  53. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/tools_addons.py +0 -0
  54. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/tools_areas.py +0 -0
  55. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  56. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  57. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/tools_calendar.py +0 -0
  58. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/tools_camera.py +0 -0
  59. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/tools_categories.py +0 -0
  60. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  61. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  62. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/tools_config_entry_flow.py +0 -0
  63. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  64. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  65. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/tools_entities.py +0 -0
  66. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  67. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/tools_groups.py +0 -0
  68. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/tools_hacs.py +0 -0
  69. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/tools_integrations.py +0 -0
  70. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/tools_labels.py +0 -0
  71. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
  72. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/tools_registry.py +0 -0
  73. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/tools_resources.py +0 -0
  74. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/tools_search.py +0 -0
  75. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/tools_service.py +0 -0
  76. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/tools_services.py +0 -0
  77. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/tools_system.py +0 -0
  78. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/tools_todo.py +0 -0
  79. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/tools_traces.py +0 -0
  80. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/tools_updates.py +0 -0
  81. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/tools_utility.py +0 -0
  82. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  83. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/tools_zones.py +0 -0
  84. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/tools/util_helpers.py +0 -0
  85. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/transforms/__init__.py +0 -0
  86. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/transforms/categorized_search.py +0 -0
  87. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/utils/__init__.py +0 -0
  88. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/utils/config_hash.py +0 -0
  89. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/utils/domain_handlers.py +0 -0
  90. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  91. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/utils/operation_manager.py +0 -0
  92. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/utils/python_sandbox.py +0 -0
  93. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp/utils/usage_logger.py +0 -0
  94. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  95. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  96. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  97. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  98. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  99. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/tests/__init__.py +0 -0
  100. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/tests/test_constants.py +0 -0
  101. {ha_mcp_dev-7.2.0.dev367 → ha_mcp_dev-7.2.0.dev369}/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.2.0.dev367
3
+ Version: 7.2.0.dev369
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
@@ -203,7 +203,7 @@ Spend less time configuring, more time enjoying your smart home.
203
203
  | **Scripts** | `ha_config_get_script`, `ha_config_remove_script`, `ha_config_set_script` |
204
204
  | **Search & Discovery** | `ha_deep_search`, `ha_get_overview`, `ha_get_state`, `ha_search_entities` |
205
205
  | **Service & Device Control** | `ha_bulk_control`, `ha_call_service`, `ha_get_operation_status`, `ha_list_services` |
206
- | **System** | `ha_backup_create`, `ha_backup_restore`, `ha_check_config`, `ha_config_set_yaml`, `ha_get_system_health`, `ha_get_updates`, `ha_reload_core`, `ha_restart` |
206
+ | **System** | `ha_backup_create`, `ha_backup_restore`, `ha_check_config`, `ha_config_set_yaml` *(beta)*, `ha_get_system_health`, `ha_get_updates`, `ha_reload_core`, `ha_restart` |
207
207
  | **Todo Lists** | `ha_get_todo`, `ha_remove_todo_item`, `ha_set_todo_item` |
208
208
  | **Utilities** | `ha_eval_template`, `ha_install_mcp_tools`, `ha_report_issue` |
209
209
  | **Zones** | `ha_get_zone`, `ha_remove_zone`, `ha_set_zone` |
@@ -174,7 +174,7 @@ Spend less time configuring, more time enjoying your smart home.
174
174
  | **Scripts** | `ha_config_get_script`, `ha_config_remove_script`, `ha_config_set_script` |
175
175
  | **Search & Discovery** | `ha_deep_search`, `ha_get_overview`, `ha_get_state`, `ha_search_entities` |
176
176
  | **Service & Device Control** | `ha_bulk_control`, `ha_call_service`, `ha_get_operation_status`, `ha_list_services` |
177
- | **System** | `ha_backup_create`, `ha_backup_restore`, `ha_check_config`, `ha_config_set_yaml`, `ha_get_system_health`, `ha_get_updates`, `ha_reload_core`, `ha_restart` |
177
+ | **System** | `ha_backup_create`, `ha_backup_restore`, `ha_check_config`, `ha_config_set_yaml` *(beta)*, `ha_get_system_health`, `ha_get_updates`, `ha_reload_core`, `ha_restart` |
178
178
  | **Todo Lists** | `ha_get_todo`, `ha_remove_todo_item`, `ha_set_todo_item` |
179
179
  | **Utilities** | `ha_eval_template`, `ha_install_mcp_tools`, `ha_report_issue` |
180
180
  | **Zones** | `ha_get_zone`, `ha_remove_zone`, `ha_set_zone` |
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "7.2.0.dev367"
7
+ version = "7.2.0.dev369"
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"
@@ -591,7 +591,7 @@ async def _fetch_statistics(
591
591
 
592
592
  # Parse statistic_types
593
593
  stat_types_list: list[str] | None = None
594
- if statistic_types:
594
+ if statistic_types is not None:
595
595
  if isinstance(statistic_types, str):
596
596
  if statistic_types.startswith("["):
597
597
  stat_types_list = parse_string_list_param(statistic_types, "statistic_types")
@@ -603,8 +603,15 @@ async def _fetch_statistics(
603
603
  stat_types_list = list(statistic_types)
604
604
 
605
605
  valid_types = ["mean", "min", "max", "sum", "state", "change"]
606
- if stat_types_list is None:
607
- stat_types_list = []
606
+ assert stat_types_list is not None
607
+ if not stat_types_list:
608
+ raise_tool_error(create_error_response(
609
+ ErrorCode.VALIDATION_INVALID_PARAMETER,
610
+ "statistic_types cannot be an empty list. "
611
+ "Omit the parameter to retrieve all types, or specify at least one valid type.",
612
+ context={"parameter": "statistic_types", "value": statistic_types},
613
+ suggestions=[f"Use one or more of: {', '.join(valid_types)}"],
614
+ ))
608
615
  invalid_types = [t for t in stat_types_list if t not in valid_types]
609
616
  if invalid_types:
610
617
  raise_tool_error(create_error_response(
@@ -44,11 +44,11 @@ def register_yaml_config_tools(mcp: Any, client: Any, **kwargs: Any) -> None:
44
44
  logger.info("YAML config editing tools enabled")
45
45
 
46
46
  @mcp.tool(
47
- tags={"System"},
47
+ tags={"System", "beta"},
48
48
  annotations={
49
49
  "destructiveHint": True,
50
50
  "idempotentHint": False,
51
- "title": "Set YAML Config",
51
+ "title": "Raw YAML Config Edit",
52
52
  },
53
53
  )
54
54
  @log_tool_usage
@@ -57,8 +57,11 @@ def register_yaml_config_tools(mcp: Any, client: Any, **kwargs: Any) -> None:
57
57
  str,
58
58
  Field(
59
59
  description=(
60
- "Top-level YAML key to modify (e.g., 'template', 'sensor', "
61
- "'input_boolean'). Only whitelisted keys are allowed."
60
+ "Top-level YAML key to modify. Only a narrow allowlist of "
61
+ "YAML-only integration keys is accepted (e.g., 'command_line', "
62
+ "'rest', 'shell_command', 'notify'). Not for template sensors "
63
+ "(use ha_set_config_entry_helper), automations, scripts, "
64
+ "scenes, or input_* helpers — those have dedicated tools."
62
65
  ),
63
66
  ),
64
67
  ],
@@ -103,30 +106,28 @@ def register_yaml_config_tools(mcp: Any, client: Any, **kwargs: Any) -> None:
103
106
  ),
104
107
  ] = True,
105
108
  ) -> dict[str, Any]:
106
- """Add, replace, or remove a top-level key in configuration.yaml or package files.
109
+ """Update raw YAML configuration in configuration.yaml or packages/*.yaml (LAST RESORT).
107
110
 
108
- IMPORTANT: Only use when NO UI or API alternative exists. Prefer:
109
- - Template sensors -> ha_config_set_helper (Template Helper)
111
+ **WARNING:** Destructive, disabled by default. Dedicated tools exist for
112
+ almost every use case and should be preferred:
113
+
114
+ - Template sensors (state-based or trigger-based) ->
115
+ ha_set_config_entry_helper(helper_type='template')
110
116
  - Automations -> ha_config_set_automation
111
117
  - Scripts -> ha_config_set_script
112
- - Input helpers -> ha_config_set_helper
113
118
  - Scenes -> ha_config_set_scene
119
+ - Input helpers -> ha_config_set_helper
120
+ - Groups, min/max, threshold, derivative, statistics, utility_meter,
121
+ trend, filter, switch_as_x -> ha_set_config_entry_helper
114
122
 
115
- This tool is for YAML-only features with no UI/API path (e.g.,
116
- command_line sensors, platform-based MQTT sensors in YAML, rest
117
- sensors defined in packages).
118
-
119
- Safeguards: file backup, YAML validation, top-level key whitelist,
120
- path traversal blocking, post-edit config check.
121
-
122
- IMPORTANT: Check 'post_action' in the response. Most keys require
123
- a full HA restart ('restart_required'). Only template, mqtt, and
124
- group support reload ('reload_available' with 'reload_service').
123
+ Intended for YAML-only integrations with no config-flow or API
124
+ equivalent (command_line, rest, shell_command, notify platforms).
125
+ Check ``post_action`` in the response: most keys need a full HA
126
+ restart; template, mqtt, and group support reload. Preserves YAML
127
+ comments and HA tags (``!include``, ``!secret``) on round-trip;
128
+ ``replace`` swaps the subtree as-is.
125
129
 
126
- Preserves YAML comments on sibling keys, file-level comments,
127
- and Home Assistant tags (!include, !secret, etc.). The 'replace' action
128
- substitutes the subtree as-is, so comments from the old subtree
129
- do not carry over.
130
+ For detailed routing guidance, use ha_get_skill_home_assistant_best_practices.
130
131
  """
131
132
  try:
132
133
  # Validate action
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 7.2.0.dev367
3
+ Version: 7.2.0.dev369
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
@@ -203,7 +203,7 @@ Spend less time configuring, more time enjoying your smart home.
203
203
  | **Scripts** | `ha_config_get_script`, `ha_config_remove_script`, `ha_config_set_script` |
204
204
  | **Search & Discovery** | `ha_deep_search`, `ha_get_overview`, `ha_get_state`, `ha_search_entities` |
205
205
  | **Service & Device Control** | `ha_bulk_control`, `ha_call_service`, `ha_get_operation_status`, `ha_list_services` |
206
- | **System** | `ha_backup_create`, `ha_backup_restore`, `ha_check_config`, `ha_config_set_yaml`, `ha_get_system_health`, `ha_get_updates`, `ha_reload_core`, `ha_restart` |
206
+ | **System** | `ha_backup_create`, `ha_backup_restore`, `ha_check_config`, `ha_config_set_yaml` *(beta)*, `ha_get_system_health`, `ha_get_updates`, `ha_reload_core`, `ha_restart` |
207
207
  | **Todo Lists** | `ha_get_todo`, `ha_remove_todo_item`, `ha_set_todo_item` |
208
208
  | **Utilities** | `ha_eval_template`, `ha_install_mcp_tools`, `ha_report_issue` |
209
209
  | **Zones** | `ha_get_zone`, `ha_remove_zone`, `ha_set_zone` |