ha-mcp-dev 7.5.0.dev560__tar.gz → 7.5.0.dev561__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 (113) hide show
  1. {ha_mcp_dev-7.5.0.dev560/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.5.0.dev561}/PKG-INFO +1 -1
  2. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/pyproject.toml +1 -1
  3. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/client/rest_client.py +21 -9
  4. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  5. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/LICENSE +0 -0
  6. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/MANIFEST.in +0 -0
  7. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/README.md +0 -0
  8. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/setup.cfg +0 -0
  9. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/__init__.py +0 -0
  10. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/__main__.py +0 -0
  11. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/_pypi_marker +0 -0
  12. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/_version.py +0 -0
  13. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/auth/__init__.py +0 -0
  14. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/auth/consent_form.py +0 -0
  15. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/auth/provider.py +0 -0
  16. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/client/__init__.py +0 -0
  17. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/client/supervisor_client.py +0 -0
  18. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/client/websocket_client.py +0 -0
  19. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/client/websocket_listener.py +0 -0
  20. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/config.py +0 -0
  21. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/errors.py +0 -0
  22. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/py.typed +0 -0
  23. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  24. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  25. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  26. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  27. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  28. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  29. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  30. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  31. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  32. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  33. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  34. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  35. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  36. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  37. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  38. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  39. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  40. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  41. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  42. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  43. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  44. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  45. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/server.py +0 -0
  46. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/settings_ui.py +0 -0
  47. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/smoke_test.py +0 -0
  48. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/__init__.py +0 -0
  49. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/backup.py +0 -0
  50. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  51. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/device_control.py +0 -0
  52. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/enhanced.py +0 -0
  53. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/helpers.py +0 -0
  54. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/reference_validator.py +0 -0
  55. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/registry.py +0 -0
  56. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/smart_search.py +0 -0
  57. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/tools_addons.py +0 -0
  58. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/tools_areas.py +0 -0
  59. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  60. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  61. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/tools_calendar.py +0 -0
  62. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/tools_camera.py +0 -0
  63. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/tools_categories.py +0 -0
  64. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/tools_code.py +0 -0
  65. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  66. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  67. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/tools_config_entry_flow.py +0 -0
  68. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  69. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  70. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  71. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/tools_energy.py +0 -0
  72. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/tools_entities.py +0 -0
  73. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  74. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/tools_groups.py +0 -0
  75. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/tools_hacs.py +0 -0
  76. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/tools_history.py +0 -0
  77. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/tools_integrations.py +0 -0
  78. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/tools_labels.py +0 -0
  79. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
  80. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/tools_registry.py +0 -0
  81. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/tools_resources.py +0 -0
  82. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/tools_search.py +0 -0
  83. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/tools_service.py +0 -0
  84. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/tools_services.py +0 -0
  85. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/tools_system.py +0 -0
  86. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/tools_todo.py +0 -0
  87. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/tools_traces.py +0 -0
  88. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/tools_updates.py +0 -0
  89. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/tools_utility.py +0 -0
  90. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  91. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  92. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/tools_zones.py +0 -0
  93. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/tools/util_helpers.py +0 -0
  94. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/transforms/__init__.py +0 -0
  95. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/transforms/categorized_search.py +0 -0
  96. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  97. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/utils/__init__.py +0 -0
  98. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/utils/config_hash.py +0 -0
  99. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/utils/data_paths.py +0 -0
  100. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/utils/domain_handlers.py +0 -0
  101. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  102. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  103. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/utils/operation_manager.py +0 -0
  104. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/utils/python_sandbox.py +0 -0
  105. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp/utils/usage_logger.py +0 -0
  106. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  107. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  108. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  109. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  110. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  111. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/tests/__init__.py +0 -0
  112. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/tests/test_constants.py +0 -0
  113. {ha_mcp_dev-7.5.0.dev560 → ha_mcp_dev-7.5.0.dev561}/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.dev560
3
+ Version: 7.5.0.dev561
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.dev560"
7
+ version = "7.5.0.dev561"
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"
@@ -782,6 +782,9 @@ class HomeAssistantClient:
782
782
  else:
783
783
  return False, "Invalid response from Home Assistant"
784
784
  except Exception as e:
785
+ # Intentional broad-catch: is_connected() contract maps any failure
786
+ # to (False, error_msg); styleguide § "broad except at top-level
787
+ # setup/teardown handlers" applies (connection probe is the analog).
785
788
  logger.error(f"Failed to connect to Home Assistant: {e}")
786
789
  return False, str(e)
787
790
 
@@ -823,7 +826,7 @@ class HomeAssistantClient:
823
826
  f"Converted entity_id {identifier} to unique_id {unique_id}"
824
827
  )
825
828
  return str(unique_id)
826
- except Exception as e:
829
+ except HomeAssistantError as e:
827
830
  raise HomeAssistantAPIError(
828
831
  f"Failed to resolve automation {identifier}: {str(e)}",
829
832
  status_code=404,
@@ -853,8 +856,8 @@ class HomeAssistantClient:
853
856
  "GET", f"/config/automation/config/{unique_id}"
854
857
  )
855
858
  return response
856
- except Exception as e:
857
- if "404" in str(e):
859
+ except HomeAssistantAPIError as e:
860
+ if e.status_code == 404:
858
861
  raise HomeAssistantAPIError(
859
862
  f"Automation not found: {identifier} (unique_id: {unique_id})",
860
863
  status_code=404,
@@ -915,18 +918,22 @@ class HomeAssistantClient:
915
918
  if entity_not_verified:
916
919
  result["entity_not_verified"] = True
917
920
  return result
918
- except Exception as e:
919
- if "400" in str(e):
921
+ except HomeAssistantAPIError as e:
922
+ if e.status_code == 400:
920
923
  raise HomeAssistantAPIError(
921
924
  f"Invalid automation configuration: {str(e)}", status_code=400
922
925
  ) from e
923
926
  raise
924
927
 
928
+ # 3-attempt × 6s upper-bound budget; first poll 0.1s catches the
929
+ # typical sub-1s entity-publish window.
930
+ _POLL_CADENCE: tuple[float, ...] = (0.1, 1.0, 4.9)
931
+
925
932
  async def _poll_for_automation_entity(self, unique_id: str) -> str | None:
926
933
  """Poll HA state to find the entity_id assigned to a newly created automation."""
927
934
  try:
928
- for attempt in range(3):
929
- await asyncio.sleep(1 * (attempt + 1))
935
+ for sleep_time in self._POLL_CADENCE:
936
+ await asyncio.sleep(sleep_time)
930
937
  states = await self.get_states()
931
938
  for state in states:
932
939
  if not state.get("entity_id", "").startswith("automation."):
@@ -937,9 +944,14 @@ class HomeAssistantClient:
937
944
  f"Found actual entity_id for unique_id {unique_id}: {entity_id}"
938
945
  )
939
946
  return entity_id
940
- except Exception as e:
947
+ except HomeAssistantError as e:
948
+ # Narrow catch: programming bugs (TypeError/KeyError/etc.) propagate.
949
+ # Mirrors test-side _POLLING_TRANSIENT_ERRORS in
950
+ # tests/src/e2e/utilities/wait_helpers.py and styleguide §
951
+ # "Exception Handling in Test Polling Loops".
941
952
  logger.warning(
942
- f"Failed to query actual entity_id for unique_id {unique_id}: {e}"
953
+ f"Failed to query actual entity_id for unique_id {unique_id}: {e}",
954
+ exc_info=True,
943
955
  )
944
956
  return None
945
957
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 7.5.0.dev560
3
+ Version: 7.5.0.dev561
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