ha-mcp-dev 7.5.0.dev550__tar.gz → 7.5.0.dev552__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 (111) hide show
  1. {ha_mcp_dev-7.5.0.dev550/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.5.0.dev552}/PKG-INFO +1 -1
  2. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/pyproject.toml +1 -1
  3. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/tools_config_automations.py +59 -6
  4. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  5. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/LICENSE +0 -0
  6. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/MANIFEST.in +0 -0
  7. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/README.md +0 -0
  8. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/setup.cfg +0 -0
  9. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/__init__.py +0 -0
  10. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/__main__.py +0 -0
  11. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/_pypi_marker +0 -0
  12. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/_version.py +0 -0
  13. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/auth/__init__.py +0 -0
  14. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/auth/consent_form.py +0 -0
  15. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/auth/provider.py +0 -0
  16. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/client/__init__.py +0 -0
  17. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/client/rest_client.py +0 -0
  18. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/client/supervisor_client.py +0 -0
  19. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/client/websocket_client.py +0 -0
  20. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/client/websocket_listener.py +0 -0
  21. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/config.py +0 -0
  22. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/errors.py +0 -0
  23. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/py.typed +0 -0
  24. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  25. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  26. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  27. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  28. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  29. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  30. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  31. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  32. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  33. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  34. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  35. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  36. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  37. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  38. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  39. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  40. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  41. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  42. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  43. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  44. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/server.py +0 -0
  45. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/settings_ui.py +0 -0
  46. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/smoke_test.py +0 -0
  47. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/__init__.py +0 -0
  48. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/backup.py +0 -0
  49. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  50. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/device_control.py +0 -0
  51. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/enhanced.py +0 -0
  52. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/helpers.py +0 -0
  53. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/reference_validator.py +0 -0
  54. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/registry.py +0 -0
  55. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/smart_search.py +0 -0
  56. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/tools_addons.py +0 -0
  57. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/tools_areas.py +0 -0
  58. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  59. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  60. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/tools_calendar.py +0 -0
  61. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/tools_camera.py +0 -0
  62. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/tools_categories.py +0 -0
  63. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/tools_code.py +0 -0
  64. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  65. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/tools_config_entry_flow.py +0 -0
  66. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  67. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  68. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  69. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/tools_energy.py +0 -0
  70. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/tools_entities.py +0 -0
  71. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  72. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/tools_groups.py +0 -0
  73. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/tools_hacs.py +0 -0
  74. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/tools_history.py +0 -0
  75. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/tools_integrations.py +0 -0
  76. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/tools_labels.py +0 -0
  77. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
  78. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/tools_registry.py +0 -0
  79. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/tools_resources.py +0 -0
  80. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/tools_search.py +0 -0
  81. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/tools_service.py +0 -0
  82. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/tools_services.py +0 -0
  83. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/tools_system.py +0 -0
  84. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/tools_todo.py +0 -0
  85. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/tools_traces.py +0 -0
  86. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/tools_updates.py +0 -0
  87. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/tools_utility.py +0 -0
  88. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  89. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  90. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/tools_zones.py +0 -0
  91. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/tools/util_helpers.py +0 -0
  92. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/transforms/__init__.py +0 -0
  93. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/transforms/categorized_search.py +0 -0
  94. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  95. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/utils/__init__.py +0 -0
  96. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/utils/config_hash.py +0 -0
  97. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/utils/data_paths.py +0 -0
  98. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/utils/domain_handlers.py +0 -0
  99. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  100. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  101. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/utils/operation_manager.py +0 -0
  102. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/utils/python_sandbox.py +0 -0
  103. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp/utils/usage_logger.py +0 -0
  104. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  105. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  106. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  107. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  108. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  109. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/tests/__init__.py +0 -0
  110. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/tests/test_constants.py +0 -0
  111. {ha_mcp_dev-7.5.0.dev550 → ha_mcp_dev-7.5.0.dev552}/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.dev550
3
+ Version: 7.5.0.dev552
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.5.0.dev550"
7
+ version = "7.5.0.dev552"
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"
@@ -231,6 +231,30 @@ def _normalize_config_for_roundtrip(config: dict[str, Any]) -> dict[str, Any]:
231
231
  return cast(dict[str, Any], normalized)
232
232
 
233
233
 
234
+ def _strip_redundant_identifier_echo(
235
+ result: dict[str, Any],
236
+ *,
237
+ extra_excludes: tuple[str, ...] = (),
238
+ ) -> dict[str, Any]:
239
+ """Strip the redundant ``identifier`` echo from an upsert/delete response.
240
+
241
+ The canonical ``automation_id`` key (resolved entity_id, falling back to
242
+ input identifier or ``unique_id``) makes re-echoing the raw ``identifier``
243
+ redundant noise.
244
+
245
+ ``unique_id`` is intentionally retained — it's HA's internal identifier,
246
+ distinct from ``entity_id``/``automation_id``, and callers track it for
247
+ cleanup. Do not extend ``extra_excludes`` to ``"unique_id"``: that
248
+ regression broke E2E ``test_duplicate_automation_prevention`` at 5fe5338.
249
+
250
+ ``extra_excludes`` lets a call site drop additional internal keys the
251
+ spread shouldn't surface (e.g. ``"success"`` on the python_transform
252
+ branch, where the caller manages that key directly).
253
+ """
254
+ excluded = {"identifier", *extra_excludes}
255
+ return {k: v for k, v in result.items() if k not in excluded}
256
+
257
+
234
258
  class AutomationConfigTools:
235
259
  """Configuration management tools for Home Assistant automations."""
236
260
 
@@ -284,7 +308,9 @@ class AutomationConfigTools:
284
308
 
285
309
  The returned `config_hash` is stable across consecutive reads of an unchanged config — `compute_config_hash` documents the underlying contract.
286
310
 
287
- The returned `automation_id` is the resolved entity_id (canonical form, e.g. `automation.morning_routine`) when the registry lookup succeeds, falling back to the input `identifier` otherwise.
311
+ The returned `automation_id` is the resolved entity_id (canonical
312
+ form, e.g. `automation.morning_routine`) when the registry lookup
313
+ succeeds, falling back to the input `identifier` otherwise.
288
314
 
289
315
  EXAMPLES:
290
316
  - Get automation: ha_config_get_automation("automation.morning_routine")
@@ -406,6 +432,12 @@ class AutomationConfigTools:
406
432
  """
407
433
  Create or update a Home Assistant automation.
408
434
 
435
+ The returned `automation_id` is the resolved entity_id (canonical
436
+ form, e.g. `automation.morning_routine`) when entity registration
437
+ succeeds, falling back to the input `identifier` (update path) or
438
+ the generated `unique_id` from the upsert response (fresh create
439
+ when no identifier was passed).
440
+
409
441
  Before reaching for ``ha_config_set_automation``, consider whether a
410
442
  dedicated tool fits the use case better:
411
443
 
@@ -666,12 +698,15 @@ class AutomationConfigTools:
666
698
  response: dict[str, Any] = {
667
699
  "success": True,
668
700
  "action": "python_transform",
669
- "identifier": identifier,
701
+ "automation_id": (
702
+ entity_id or identifier or result.get("unique_id")
703
+ ),
670
704
  "config_hash": new_config_hash,
671
705
  "python_expression": python_transform,
672
706
  "message": f"Automation {identifier} updated via Python transform",
673
- # Merge upsert result, excluding "success" (we set it ourselves)
674
- **{k: v for k, v in result.items() if k != "success"},
707
+ **_strip_redundant_identifier_echo(
708
+ result, extra_excludes=("success",)
709
+ ),
675
710
  }
676
711
  if bp_warnings:
677
712
  response["best_practice_warnings"] = bp_warnings
@@ -761,9 +796,15 @@ class AutomationConfigTools:
761
796
 
762
797
  merge_validation_meta(result, validation_meta)
763
798
 
799
+ automation_id = entity_id or identifier or result.get("unique_id")
764
800
  return {
765
801
  "success": True,
766
- **result,
802
+ # automation_id omitted when all three fallbacks are falsy —
803
+ # the create path is unguarded by validate_identifier_not_empty,
804
+ # and surfacing automation_id=None would lie about resolvability.
805
+ # HA's upsert contract makes this branch unreachable in practice.
806
+ **({"automation_id": automation_id} if automation_id else {}),
807
+ **_strip_redundant_identifier_echo(result),
767
808
  }
768
809
 
769
810
  except ToolError:
@@ -1001,6 +1042,11 @@ class AutomationConfigTools:
1001
1042
  """
1002
1043
  Delete a Home Assistant automation.
1003
1044
 
1045
+ The returned `automation_id` is the resolved entity_id (canonical
1046
+ form, e.g. `automation.morning_routine`) when the registry lookup
1047
+ succeeded before the delete, falling back to the input
1048
+ `identifier` otherwise.
1049
+
1004
1050
  EXAMPLES:
1005
1051
  - Delete automation: ha_config_remove_automation("automation.old_automation")
1006
1052
  - Delete by unique_id: ha_config_remove_automation("my_unique_id")
@@ -1040,7 +1086,14 @@ class AutomationConfigTools:
1040
1086
  f"Deletion confirmed but removal verification failed: {e}"
1041
1087
  )
1042
1088
 
1043
- return {"success": True, "action": "delete", **result}
1089
+ return {
1090
+ "success": True,
1091
+ "action": "delete",
1092
+ "automation_id": (
1093
+ entity_id_for_wait or identifier or result.get("unique_id")
1094
+ ),
1095
+ **_strip_redundant_identifier_echo(result),
1096
+ }
1044
1097
  except ToolError:
1045
1098
  raise
1046
1099
  except Exception as e:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 7.5.0.dev550
3
+ Version: 7.5.0.dev552
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