ha-mcp-dev 7.5.0.dev567__tar.gz → 7.5.0.dev569__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.dev567/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.5.0.dev569}/PKG-INFO +1 -1
  2. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/pyproject.toml +1 -1
  3. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/client/rest_client.py +24 -0
  4. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  5. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/LICENSE +0 -0
  6. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/MANIFEST.in +0 -0
  7. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/README.md +0 -0
  8. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/setup.cfg +0 -0
  9. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/__init__.py +0 -0
  10. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/__main__.py +0 -0
  11. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/_pypi_marker +0 -0
  12. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/_version.py +0 -0
  13. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/auth/__init__.py +0 -0
  14. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/auth/consent_form.py +0 -0
  15. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/auth/provider.py +0 -0
  16. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/client/__init__.py +0 -0
  17. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/client/supervisor_client.py +0 -0
  18. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/client/websocket_client.py +0 -0
  19. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/client/websocket_listener.py +0 -0
  20. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/config.py +0 -0
  21. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/errors.py +0 -0
  22. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/py.typed +0 -0
  23. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  24. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  25. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  26. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  27. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  28. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  29. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  30. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  31. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  32. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  33. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  34. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  35. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  36. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  37. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  38. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  39. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  40. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  41. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  42. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  43. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  44. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/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.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/server.py +0 -0
  46. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/settings_ui.py +0 -0
  47. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/smoke_test.py +0 -0
  48. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/__init__.py +0 -0
  49. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/backup.py +0 -0
  50. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  51. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/device_control.py +0 -0
  52. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/enhanced.py +0 -0
  53. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/helpers.py +0 -0
  54. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/reference_validator.py +0 -0
  55. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/registry.py +0 -0
  56. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/smart_search.py +0 -0
  57. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/tools_addons.py +0 -0
  58. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/tools_areas.py +0 -0
  59. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  60. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  61. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/tools_calendar.py +0 -0
  62. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/tools_camera.py +0 -0
  63. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/tools_categories.py +0 -0
  64. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/tools_code.py +0 -0
  65. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  66. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  67. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/tools_config_entry_flow.py +0 -0
  68. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  69. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  70. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  71. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/tools_energy.py +0 -0
  72. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/tools_entities.py +0 -0
  73. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  74. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/tools_groups.py +0 -0
  75. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/tools_hacs.py +0 -0
  76. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/tools_history.py +0 -0
  77. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/tools_integrations.py +0 -0
  78. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/tools_labels.py +0 -0
  79. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
  80. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/tools_registry.py +0 -0
  81. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/tools_resources.py +0 -0
  82. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/tools_search.py +0 -0
  83. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/tools_service.py +0 -0
  84. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/tools_services.py +0 -0
  85. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/tools_system.py +0 -0
  86. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/tools_todo.py +0 -0
  87. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/tools_traces.py +0 -0
  88. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/tools_updates.py +0 -0
  89. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/tools_utility.py +0 -0
  90. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  91. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  92. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/tools_zones.py +0 -0
  93. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/tools/util_helpers.py +0 -0
  94. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/transforms/__init__.py +0 -0
  95. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/transforms/categorized_search.py +0 -0
  96. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  97. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/utils/__init__.py +0 -0
  98. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/utils/config_hash.py +0 -0
  99. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/utils/data_paths.py +0 -0
  100. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/utils/domain_handlers.py +0 -0
  101. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  102. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  103. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/utils/operation_manager.py +0 -0
  104. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/utils/python_sandbox.py +0 -0
  105. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp/utils/usage_logger.py +0 -0
  106. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  107. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  108. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  109. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  110. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  111. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/tests/__init__.py +0 -0
  112. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/tests/test_constants.py +0 -0
  113. {ha_mcp_dev-7.5.0.dev567 → ha_mcp_dev-7.5.0.dev569}/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.dev567
3
+ Version: 7.5.0.dev569
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.dev567"
7
+ version = "7.5.0.dev569"
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"
@@ -906,6 +906,30 @@ class HomeAssistantClient:
906
906
  operation = "updated"
907
907
  logger.debug(f"Updating automation with unique_id: {unique_id}")
908
908
 
909
+ # Reject mismatch between resolved storage key and inner ``config["id"]``.
910
+ # HA stores by the inner id field even though the URL carries one too —
911
+ # a divergence silently overwrites the automation whose unique_id matches
912
+ # the inner id, while reporting success for the URL target (#1404).
913
+ config_id = config.get("id")
914
+ if config_id is not None and str(config_id) != str(unique_id):
915
+ if identifier is None:
916
+ raise HomeAssistantAPIError(
917
+ "Cannot create automation with explicit config['id']="
918
+ f"{config_id!r}: Home Assistant stores by the inner id, "
919
+ "which would silently overwrite an existing automation. "
920
+ "Omit 'id' from config to auto-generate, or pass identifier "
921
+ "to update an existing automation.",
922
+ status_code=400,
923
+ )
924
+ raise HomeAssistantAPIError(
925
+ f"Mismatched automation id: identifier={identifier!r} resolves "
926
+ f"to unique_id={unique_id!r}, but config['id']={config_id!r}. "
927
+ "Refusing to write to prevent overwriting the wrong automation. "
928
+ f"Remove 'id' from config or set it to the resolved unique_id "
929
+ f"({unique_id!r}).",
930
+ status_code=400,
931
+ )
932
+
909
933
  # Add unique_id to config for updates
910
934
  if unique_id and "id" not in config:
911
935
  config = {**config, "id": unique_id}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 7.5.0.dev567
3
+ Version: 7.5.0.dev569
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