ha-mcp-dev 7.4.1.dev429__tar.gz → 7.4.1.dev430__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 (106) hide show
  1. {ha_mcp_dev-7.4.1.dev429/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.4.1.dev430}/PKG-INFO +1 -1
  2. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/pyproject.toml +1 -1
  3. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/tools_integrations.py +85 -31
  4. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  5. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/LICENSE +0 -0
  6. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/MANIFEST.in +0 -0
  7. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/README.md +0 -0
  8. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/setup.cfg +0 -0
  9. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/__init__.py +0 -0
  10. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/__main__.py +0 -0
  11. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/_pypi_marker +0 -0
  12. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/_version.py +0 -0
  13. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/auth/__init__.py +0 -0
  14. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/auth/consent_form.py +0 -0
  15. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/auth/provider.py +0 -0
  16. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/client/__init__.py +0 -0
  17. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/client/rest_client.py +0 -0
  18. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/client/websocket_client.py +0 -0
  19. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/client/websocket_listener.py +0 -0
  20. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/config.py +0 -0
  21. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/errors.py +0 -0
  22. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/py.typed +0 -0
  23. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  24. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  25. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  26. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  27. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  28. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  29. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  30. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  31. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  32. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  33. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  34. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  35. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  36. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  37. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  38. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  39. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  40. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  41. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  42. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  43. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/server.py +0 -0
  44. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/settings_ui.py +0 -0
  45. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/smoke_test.py +0 -0
  46. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/__init__.py +0 -0
  47. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/backup.py +0 -0
  48. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  49. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/device_control.py +0 -0
  50. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/enhanced.py +0 -0
  51. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/helpers.py +0 -0
  52. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/reference_validator.py +0 -0
  53. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/registry.py +0 -0
  54. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/smart_search.py +0 -0
  55. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/tools_addons.py +0 -0
  56. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/tools_areas.py +0 -0
  57. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  58. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  59. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/tools_calendar.py +0 -0
  60. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/tools_camera.py +0 -0
  61. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/tools_categories.py +0 -0
  62. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  63. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  64. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/tools_config_entry_flow.py +0 -0
  65. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  66. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  67. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/tools_energy.py +0 -0
  68. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/tools_entities.py +0 -0
  69. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  70. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/tools_groups.py +0 -0
  71. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/tools_hacs.py +0 -0
  72. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/tools_history.py +0 -0
  73. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/tools_labels.py +0 -0
  74. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
  75. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/tools_registry.py +0 -0
  76. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/tools_resources.py +0 -0
  77. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/tools_search.py +0 -0
  78. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/tools_service.py +0 -0
  79. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/tools_services.py +0 -0
  80. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/tools_system.py +0 -0
  81. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/tools_todo.py +0 -0
  82. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/tools_traces.py +0 -0
  83. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/tools_updates.py +0 -0
  84. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/tools_utility.py +0 -0
  85. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  86. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  87. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/tools_zones.py +0 -0
  88. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/tools/util_helpers.py +0 -0
  89. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/transforms/__init__.py +0 -0
  90. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/transforms/categorized_search.py +0 -0
  91. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/utils/__init__.py +0 -0
  92. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/utils/config_hash.py +0 -0
  93. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/utils/domain_handlers.py +0 -0
  94. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  95. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  96. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/utils/operation_manager.py +0 -0
  97. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/utils/python_sandbox.py +0 -0
  98. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp/utils/usage_logger.py +0 -0
  99. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  100. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  101. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  102. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  103. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  104. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/tests/__init__.py +0 -0
  105. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/tests/test_constants.py +0 -0
  106. {ha_mcp_dev-7.4.1.dev429 → ha_mcp_dev-7.4.1.dev430}/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.4.1.dev429
3
+ Version: 7.4.1.dev430
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.4.1.dev429"
7
+ version = "7.4.1.dev430"
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"
@@ -971,7 +971,8 @@ class IntegrationTools:
971
971
  )
972
972
 
973
973
  try:
974
- # Try to get unique_id with retry logic (race-condition guard)
974
+ # Resolve unique_id via the entity registry, with a retry loop
975
+ # for transient registry failures.
975
976
  unique_id = None
976
977
  registry_result: dict[str, Any] | None = None
977
978
  max_retries = 3
@@ -982,18 +983,18 @@ class IntegrationTools:
982
983
  f"(attempt {attempt + 1}/{max_retries})"
983
984
  )
984
985
 
985
- # Fast state check first
986
+ # State check is informational only — disabled entities are
987
+ # missing from the state machine but resolved via the registry
988
+ # below (issue #1057). Kept as a debug breadcrumb rather than
989
+ # removed; full removal is option 3.2 in #1057, deferred to a
990
+ # separate PR for minimal blast radius here.
986
991
  try:
987
992
  state_check = await client.get_entity_state(entity_id)
988
993
  if not state_check:
989
- if attempt < max_retries - 1:
990
- wait_time = 0.5 * (2**attempt)
991
- logger.debug(
992
- f"Entity {entity_id} not in state, waiting "
993
- f"{wait_time}s before retry..."
994
- )
995
- await asyncio.sleep(wait_time)
996
- continue
994
+ logger.debug(
995
+ f"Entity {entity_id} not in state; "
996
+ "proceeding to registry lookup"
997
+ )
997
998
  except HomeAssistantAPIError as e:
998
999
  # State check is best-effort here; an APIError (e.g. 404)
999
1000
  # is informational. Auth/connection errors must propagate
@@ -1009,8 +1010,8 @@ class IntegrationTools:
1009
1010
  registry_result = await client.send_websocket_message(
1010
1011
  registry_msg
1011
1012
  )
1012
- if registry_result.get("success"):
1013
- entity_entry = registry_result.get("result", {})
1013
+ if (registry_result or {}).get("success"):
1014
+ entity_entry = (registry_result or {}).get("result") or {}
1014
1015
  unique_id = entity_entry.get("unique_id")
1015
1016
  if unique_id:
1016
1017
  logger.info(
@@ -1075,29 +1076,82 @@ class IntegrationTools:
1075
1076
  )
1076
1077
  return response
1077
1078
 
1078
- # Fallback strategy 2: already-deleted check
1079
+ # Fallback strategy 2: already-deleted check. Confirm via the
1080
+ # registry too — a disabled entity is missing from the state
1081
+ # machine but still registry-resident, so state-absence alone
1082
+ # is not enough to declare success.
1079
1083
  try:
1080
1084
  final_state_check = await client.get_entity_state(entity_id)
1081
1085
  if not final_state_check:
1082
- logger.info(
1083
- f"Entity {entity_id} no longer exists; "
1084
- "treating as already deleted"
1086
+ registry_still_has_entry = False
1087
+ try:
1088
+ verify_result = await client.send_websocket_message(
1089
+ {
1090
+ "type": "config/entity_registry/get",
1091
+ "entity_id": entity_id,
1092
+ }
1093
+ )
1094
+ if (verify_result or {}).get("success"):
1095
+ verify_entry = (verify_result or {}).get("result") or {}
1096
+ if verify_entry.get("entity_id"):
1097
+ registry_still_has_entry = True
1098
+ except HomeAssistantAPIError as verify_err:
1099
+ # On verify failure, conservatively assume the
1100
+ # entry is still there rather than silently
1101
+ # short-circuit to already_deleted.
1102
+ logger.debug(
1103
+ f"Registry verify for {entity_id} failed: "
1104
+ f"{verify_err}"
1105
+ )
1106
+ registry_still_has_entry = True
1107
+
1108
+ if not registry_still_has_entry:
1109
+ logger.info(
1110
+ f"Entity {entity_id} absent from state and "
1111
+ "registry; treating as already deleted"
1112
+ )
1113
+ return {
1114
+ "success": True,
1115
+ "action": "delete",
1116
+ "target": target,
1117
+ "helper_type": helper_type,
1118
+ "method": "websocket_delete",
1119
+ "entry_id": None,
1120
+ "entity_ids": [entity_id],
1121
+ "require_restart": False,
1122
+ "message": (
1123
+ f"Helper {target} was already deleted or "
1124
+ "never properly registered."
1125
+ ),
1126
+ "fallback_used": "already_deleted",
1127
+ }
1128
+
1129
+ logger.warning(
1130
+ f"Entity {entity_id} absent from state but still "
1131
+ "in registry; not already_deleted"
1132
+ )
1133
+ raise_tool_error(
1134
+ create_error_response(
1135
+ ErrorCode.SERVICE_CALL_FAILED,
1136
+ (
1137
+ f"Helper {target} could not be deleted: "
1138
+ "registry entry exists but unique_id was "
1139
+ "absent and the direct-id fallback "
1140
+ "delete failed."
1141
+ ),
1142
+ suggestions=[
1143
+ "Re-enable the entity via "
1144
+ "ha_set_entity(enabled=True), then retry "
1145
+ "deletion.",
1146
+ "Or inspect the entity registry entry "
1147
+ "directly to confirm unique_id presence.",
1148
+ ],
1149
+ context={
1150
+ "target": target,
1151
+ "entity_id": entity_id,
1152
+ },
1153
+ )
1085
1154
  )
1086
- return {
1087
- "success": True,
1088
- "action": "delete",
1089
- "target": target,
1090
- "helper_type": helper_type,
1091
- "method": "websocket_delete",
1092
- "entry_id": None,
1093
- "entity_ids": [entity_id],
1094
- "require_restart": False,
1095
- "message": (
1096
- f"Helper {target} was already deleted or "
1097
- "never properly registered."
1098
- ),
1099
- "fallback_used": "already_deleted",
1100
- }
1101
1155
  except HomeAssistantAPIError as e:
1102
1156
  # 404 here means the state-check itself confirmed the
1103
1157
  # entity is gone — treat as a soft signal and continue
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 7.4.1.dev429
3
+ Version: 7.4.1.dev430
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