ha-mcp-dev 7.4.1.dev433__tar.gz → 7.4.1.dev434__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.dev433/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.4.1.dev434}/PKG-INFO +1 -1
  2. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/pyproject.toml +1 -1
  3. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/tools_config_automations.py +2 -0
  4. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/tools_config_dashboards.py +2 -0
  5. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/tools_config_scripts.py +2 -0
  6. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/utils/config_hash.py +9 -0
  7. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  8. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/LICENSE +0 -0
  9. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/MANIFEST.in +0 -0
  10. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/README.md +0 -0
  11. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/setup.cfg +0 -0
  12. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/__init__.py +0 -0
  13. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/__main__.py +0 -0
  14. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/_pypi_marker +0 -0
  15. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/_version.py +0 -0
  16. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/auth/__init__.py +0 -0
  17. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/auth/consent_form.py +0 -0
  18. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/auth/provider.py +0 -0
  19. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/client/__init__.py +0 -0
  20. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/client/rest_client.py +0 -0
  21. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/client/websocket_client.py +0 -0
  22. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/client/websocket_listener.py +0 -0
  23. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/config.py +0 -0
  24. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/errors.py +0 -0
  25. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/py.typed +0 -0
  26. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  27. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  28. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  29. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  30. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  31. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  32. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  33. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  34. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  35. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  36. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  37. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  38. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  39. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  40. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  41. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  42. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  43. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  44. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  45. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  46. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/server.py +0 -0
  47. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/settings_ui.py +0 -0
  48. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/smoke_test.py +0 -0
  49. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/__init__.py +0 -0
  50. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/backup.py +0 -0
  51. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  52. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/device_control.py +0 -0
  53. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/enhanced.py +0 -0
  54. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/helpers.py +0 -0
  55. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/reference_validator.py +0 -0
  56. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/registry.py +0 -0
  57. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/smart_search.py +0 -0
  58. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/tools_addons.py +0 -0
  59. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/tools_areas.py +0 -0
  60. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  61. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  62. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/tools_calendar.py +0 -0
  63. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/tools_camera.py +0 -0
  64. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/tools_categories.py +0 -0
  65. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/tools_config_entry_flow.py +0 -0
  66. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  67. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/tools_energy.py +0 -0
  68. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/tools_entities.py +0 -0
  69. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  70. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/tools_groups.py +0 -0
  71. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/tools_hacs.py +0 -0
  72. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/tools_history.py +0 -0
  73. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/tools_integrations.py +0 -0
  74. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/tools_labels.py +0 -0
  75. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
  76. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/tools_registry.py +0 -0
  77. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/tools_resources.py +0 -0
  78. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/tools_search.py +0 -0
  79. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/tools_service.py +0 -0
  80. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/tools_services.py +0 -0
  81. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/tools_system.py +0 -0
  82. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/tools_todo.py +0 -0
  83. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/tools_traces.py +0 -0
  84. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/tools_updates.py +0 -0
  85. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/tools_utility.py +0 -0
  86. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  87. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  88. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/tools_zones.py +0 -0
  89. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/tools/util_helpers.py +0 -0
  90. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/transforms/__init__.py +0 -0
  91. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/transforms/categorized_search.py +0 -0
  92. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/utils/__init__.py +0 -0
  93. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/utils/domain_handlers.py +0 -0
  94. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  95. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  96. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/utils/operation_manager.py +0 -0
  97. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/utils/python_sandbox.py +0 -0
  98. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp/utils/usage_logger.py +0 -0
  99. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  100. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  101. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  102. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  103. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  104. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/tests/__init__.py +0 -0
  105. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/tests/test_constants.py +0 -0
  106. {ha_mcp_dev-7.4.1.dev433 → ha_mcp_dev-7.4.1.dev434}/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.dev433
3
+ Version: 7.4.1.dev434
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.dev433"
7
+ version = "7.4.1.dev434"
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"
@@ -248,6 +248,8 @@ class AutomationConfigTools:
248
248
 
249
249
  Returns the complete configuration including triggers, conditions, actions, and mode settings.
250
250
 
251
+ The returned `config_hash` is stable across consecutive reads of an unchanged config — `compute_config_hash` documents the underlying contract.
252
+
251
253
  EXAMPLES:
252
254
  - Get automation: ha_config_get_automation("automation.morning_routine")
253
255
  - Get by unique_id: ha_config_get_automation("my_unique_automation_id")
@@ -483,6 +483,8 @@ def register_config_dashboard_tools(mcp: Any, client: Any, **kwargs: Any) -> Non
483
483
  Returns the full Lovelace dashboard config, defaulting to the
484
484
  main dashboard if url_path is omitted.
485
485
 
486
+ Return a stable `config_hash` (Get and Search modes only; not present in list_only mode) across consecutive reads of an unchanged config — `compute_config_hash` documents the underlying contract.
487
+
486
488
  EXAMPLES:
487
489
  - List all dashboards: ha_config_get_dashboard(list_only=True)
488
490
  - Get default dashboard: ha_config_get_dashboard(url_path="default")
@@ -95,6 +95,8 @@ class ConfigScriptTools:
95
95
 
96
96
  Returns the complete configuration for a script, including sequence, mode, fields, and other settings.
97
97
 
98
+ The returned `config_hash` is stable across consecutive reads of an unchanged config — `compute_config_hash` documents the underlying contract.
99
+
98
100
  EXAMPLES:
99
101
  - Get script: ha_config_get_script("morning_routine")
100
102
  - Get script: ha_config_get_script("backup_script")
@@ -13,6 +13,15 @@ def compute_config_hash(config: dict[str, Any]) -> str:
13
13
 
14
14
  Uses SHA256 truncated to 16 hex characters (64 bits). Deterministic
15
15
  via sorted keys and minimal separators.
16
+
17
+ Stability across reads is the caller's contract, not this function's.
18
+ Automations canonicalize via ``_normalize_config_for_roundtrip`` before
19
+ hashing; scripts and dashboards hash raw HA responses, so their
20
+ stability depends on HA returning structurally identical responses on
21
+ consecutive reads (``sort_keys=True`` canonicalizes dict-key order but
22
+ not list-element order). The ``test_config_hash_stable_across_reads``
23
+ E2E tests pin this for each tool family. See issue #980 for the
24
+ contract analysis.
16
25
  """
17
26
  config_str = json.dumps(config, sort_keys=True, separators=(",", ":"))
18
27
  return hashlib.sha256(config_str.encode()).hexdigest()[:16]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 7.4.1.dev433
3
+ Version: 7.4.1.dev434
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