ha-mcp-dev 7.1.0.dev311__tar.gz → 7.2.0.dev314__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 (100) hide show
  1. {ha_mcp_dev-7.1.0.dev311/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.2.0.dev314}/PKG-INFO +1 -1
  2. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/pyproject.toml +1 -1
  3. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/__init__.py +1 -1
  4. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/tools_entities.py +54 -1
  5. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  6. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/LICENSE +0 -0
  7. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/MANIFEST.in +0 -0
  8. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/README.md +0 -0
  9. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/setup.cfg +0 -0
  10. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/__main__.py +0 -0
  11. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/_pypi_marker +0 -0
  12. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/auth/__init__.py +0 -0
  13. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/auth/consent_form.py +0 -0
  14. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/auth/provider.py +0 -0
  15. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/client/__init__.py +0 -0
  16. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/client/rest_client.py +0 -0
  17. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/client/websocket_client.py +0 -0
  18. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/client/websocket_listener.py +0 -0
  19. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/config.py +0 -0
  20. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/errors.py +0 -0
  21. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/py.typed +0 -0
  22. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  23. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  24. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  25. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  26. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  27. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  28. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  29. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  30. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  31. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  32. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  33. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  34. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  35. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  36. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  37. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  38. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  39. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  40. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  41. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  42. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/server.py +0 -0
  43. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/smoke_test.py +0 -0
  44. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/__init__.py +0 -0
  45. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/backup.py +0 -0
  46. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  47. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/device_control.py +0 -0
  48. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/enhanced.py +0 -0
  49. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/helpers.py +0 -0
  50. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/registry.py +0 -0
  51. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/smart_search.py +0 -0
  52. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/tools_addons.py +0 -0
  53. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/tools_areas.py +0 -0
  54. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  55. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  56. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/tools_calendar.py +0 -0
  57. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/tools_camera.py +0 -0
  58. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/tools_categories.py +0 -0
  59. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  60. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  61. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/tools_config_entry_flow.py +0 -0
  62. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  63. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  64. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  65. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/tools_groups.py +0 -0
  66. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/tools_hacs.py +0 -0
  67. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/tools_history.py +0 -0
  68. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/tools_integrations.py +0 -0
  69. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/tools_labels.py +0 -0
  70. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
  71. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/tools_registry.py +0 -0
  72. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/tools_resources.py +0 -0
  73. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/tools_search.py +0 -0
  74. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/tools_service.py +0 -0
  75. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/tools_services.py +0 -0
  76. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/tools_system.py +0 -0
  77. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/tools_todo.py +0 -0
  78. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/tools_traces.py +0 -0
  79. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/tools_updates.py +0 -0
  80. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/tools_utility.py +0 -0
  81. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  82. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  83. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/tools_zones.py +0 -0
  84. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/tools/util_helpers.py +0 -0
  85. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/transforms/__init__.py +0 -0
  86. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/transforms/categorized_search.py +0 -0
  87. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/utils/__init__.py +0 -0
  88. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/utils/domain_handlers.py +0 -0
  89. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  90. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/utils/operation_manager.py +0 -0
  91. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/utils/python_sandbox.py +0 -0
  92. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp/utils/usage_logger.py +0 -0
  93. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  94. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  95. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  96. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  97. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  98. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/tests/__init__.py +0 -0
  99. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/tests/test_constants.py +0 -0
  100. {ha_mcp_dev-7.1.0.dev311 → ha_mcp_dev-7.2.0.dev314}/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.1.0.dev311
3
+ Version: 7.2.0.dev314
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.1.0.dev311"
7
+ version = "7.2.0.dev314"
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"
@@ -5,7 +5,7 @@ A Model Context Protocol server that provides complete control over Home Assista
5
5
  through REST API and WebSocket integration with 20+ enhanced tools.
6
6
  """
7
7
 
8
- __version__ = "7.1.0"
8
+ __version__ = "7.2.0"
9
9
  __author__ = "Julien"
10
10
  __license__ = "MIT"
11
11
 
@@ -341,7 +341,14 @@ def register_entity_tools(mcp: Any, client: Any, **kwargs: Any) -> None:
341
341
  enabled: Annotated[
342
342
  bool | str | None,
343
343
  Field(
344
- description="True to enable the entity, False to disable it. Single entity only.",
344
+ description=(
345
+ "True to enable the entity, False to disable it. Single entity only. "
346
+ "WARNING: Setting enabled=False is a registry-level disable — it completely "
347
+ "removes the entity from the state machine and hides it from the UI. "
348
+ "A reload or restart is required to restore it after re-enabling. "
349
+ "NOT allowed for automation or script entities — use automation.turn_off / "
350
+ "script.turn_off via ha_call_service() instead."
351
+ ),
345
352
  default=None,
346
353
  ),
347
354
  ] = None,
@@ -431,6 +438,16 @@ def register_entity_tools(mcp: Any, client: Any, **kwargs: Any) -> None:
431
438
  - Expose multiple to Alexa: ha_set_entity(["light.a", "light.b"], expose_to={"cloud.alexa": True})
432
439
 
433
440
  NOTE: To rename an entity_id (e.g., sensor.old -> sensor.new), use ha_rename_entity() instead.
441
+
442
+ ENABLED/DISABLED WARNING:
443
+ Setting enabled=False performs a **registry-level disable** — the entity is completely
444
+ removed from the Home Assistant state machine and hidden from the UI. It will NOT appear
445
+ in state queries, dashboards, or automations until re-enabled AND the integration is
446
+ reloaded. This is NOT the same as "turning off" an entity.
447
+
448
+ For automations and scripts, enabled=False is blocked. Use these instead:
449
+ - ha_call_service("automation", "turn_off", entity_id="automation.xxx")
450
+ - ha_call_service("script", "turn_off", entity_id="script.xxx")
434
451
  """
435
452
  try:
436
453
  # Parse entity_id - determine if bulk operation
@@ -491,6 +508,42 @@ def register_entity_tools(mcp: Any, client: Any, **kwargs: Any) -> None:
491
508
  )
492
509
  )
493
510
 
511
+ # Block registry-disable on automation and script entities.
512
+ # Registry-disabling (enabled=False) removes the entity from the HA
513
+ # state machine entirely, making it invisible in the UI and
514
+ # unqueryable via state APIs until re-enabled AND the integration is
515
+ # reloaded. For automations and scripts the correct way to
516
+ # "disable" them is via their domain services (automation.turn_off /
517
+ # script.turn_off) which simply prevent them from running while
518
+ # keeping them visible and manageable.
519
+ if enabled is not None:
520
+ try:
521
+ _enabled_check = coerce_bool_param(enabled, "enabled")
522
+ except ValueError:
523
+ _enabled_check = None # will be caught by _update_single_entity
524
+
525
+ if _enabled_check is False:
526
+ blocked = [
527
+ eid for eid in entity_ids
528
+ if eid.split(".")[0] in ("automation", "script")
529
+ ]
530
+ if blocked:
531
+ _domain = blocked[0].split(".")[0]
532
+ _service_hint = f"{_domain}.turn_off"
533
+ raise_tool_error(create_error_response(
534
+ ErrorCode.VALIDATION_INVALID_PARAMETER,
535
+ f"Cannot registry-disable {_domain} entities with ha_set_entity(enabled=False). "
536
+ f"This removes the entity from the state machine and hides it from the UI "
537
+ f"until it is re-enabled AND the {_domain}s are reloaded. "
538
+ f"Use ha_call_service('{_domain}', 'turn_off', entity_id='{blocked[0]}') instead "
539
+ f"to disable it without removing it.",
540
+ suggestions=[
541
+ f"Use {_service_hint} to disable the {_domain} (keeps it visible and manageable)",
542
+ f"Use {_domain}.turn_on to re-enable it later",
543
+ "ha_set_entity(enabled=False) is for registry-level disable — it fully hides the entity",
544
+ ],
545
+ ))
546
+
494
547
  # Parse list parameters if provided as strings
495
548
  parsed_aliases = None
496
549
  if aliases is not None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 7.1.0.dev311
3
+ Version: 7.2.0.dev314
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