ha-mcp-dev 7.4.1.dev487__tar.gz → 7.4.1.dev488__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 (110) hide show
  1. {ha_mcp_dev-7.4.1.dev487/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.4.1.dev488}/PKG-INFO +1 -1
  2. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/pyproject.toml +1 -1
  3. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/tools_service.py +109 -0
  4. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  5. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/LICENSE +0 -0
  6. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/MANIFEST.in +0 -0
  7. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/README.md +0 -0
  8. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/setup.cfg +0 -0
  9. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/__init__.py +0 -0
  10. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/__main__.py +0 -0
  11. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/_pypi_marker +0 -0
  12. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/_version.py +0 -0
  13. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/auth/__init__.py +0 -0
  14. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/auth/consent_form.py +0 -0
  15. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/auth/provider.py +0 -0
  16. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/client/__init__.py +0 -0
  17. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/client/rest_client.py +0 -0
  18. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/client/supervisor_client.py +0 -0
  19. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/client/websocket_client.py +0 -0
  20. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/client/websocket_listener.py +0 -0
  21. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/config.py +0 -0
  22. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/errors.py +0 -0
  23. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/py.typed +0 -0
  24. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  25. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  26. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  27. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  28. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  29. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  30. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  31. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  32. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  33. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  34. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  35. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  36. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  37. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  38. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  39. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  40. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  41. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  42. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  43. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  44. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/server.py +0 -0
  45. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/settings_ui.py +0 -0
  46. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/smoke_test.py +0 -0
  47. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/__init__.py +0 -0
  48. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/backup.py +0 -0
  49. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  50. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/device_control.py +0 -0
  51. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/enhanced.py +0 -0
  52. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/helpers.py +0 -0
  53. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/reference_validator.py +0 -0
  54. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/registry.py +0 -0
  55. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/smart_search.py +0 -0
  56. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/tools_addons.py +0 -0
  57. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/tools_areas.py +0 -0
  58. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  59. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  60. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/tools_calendar.py +0 -0
  61. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/tools_camera.py +0 -0
  62. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/tools_categories.py +0 -0
  63. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/tools_code.py +0 -0
  64. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  65. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  66. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/tools_config_entry_flow.py +0 -0
  67. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  68. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  69. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  70. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/tools_energy.py +0 -0
  71. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/tools_entities.py +0 -0
  72. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  73. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/tools_groups.py +0 -0
  74. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/tools_hacs.py +0 -0
  75. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/tools_history.py +0 -0
  76. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/tools_integrations.py +0 -0
  77. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/tools_labels.py +0 -0
  78. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
  79. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/tools_registry.py +0 -0
  80. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/tools_resources.py +0 -0
  81. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/tools_search.py +0 -0
  82. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/tools_services.py +0 -0
  83. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/tools_system.py +0 -0
  84. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/tools_todo.py +0 -0
  85. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/tools_traces.py +0 -0
  86. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/tools_updates.py +0 -0
  87. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/tools_utility.py +0 -0
  88. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  89. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  90. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/tools_zones.py +0 -0
  91. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/tools/util_helpers.py +0 -0
  92. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/transforms/__init__.py +0 -0
  93. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/transforms/categorized_search.py +0 -0
  94. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/utils/__init__.py +0 -0
  95. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/utils/config_hash.py +0 -0
  96. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/utils/data_paths.py +0 -0
  97. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/utils/domain_handlers.py +0 -0
  98. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  99. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  100. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/utils/operation_manager.py +0 -0
  101. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/utils/python_sandbox.py +0 -0
  102. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp/utils/usage_logger.py +0 -0
  103. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  104. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  105. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  106. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  107. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  108. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/tests/__init__.py +0 -0
  109. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/tests/test_constants.py +0 -0
  110. {ha_mcp_dev-7.4.1.dev487 → ha_mcp_dev-7.4.1.dev488}/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.dev487
3
+ Version: 7.4.1.dev488
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.dev487"
7
+ version = "7.4.1.dev488"
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"
@@ -431,6 +431,115 @@ class ServiceTools:
431
431
  )
432
432
  return cast(dict[str, Any], result)
433
433
 
434
+ @tool(
435
+ name="ha_call_event",
436
+ tags={"Service & Device Control"},
437
+ annotations={
438
+ "destructiveHint": True,
439
+ "idempotentHint": False,
440
+ "title": "Call Event",
441
+ },
442
+ )
443
+ @log_tool_usage
444
+ async def ha_call_event(
445
+ self,
446
+ event_type: str,
447
+ data: str | dict[str, Any] | None = None,
448
+ ) -> dict[str, Any]:
449
+ """Execute a custom event on the Home Assistant event bus.
450
+
451
+ When NOT to use: for controlling entities (lights, switches, climate) — use
452
+ ha_call_service instead. For triggering automations by name, use
453
+ ha_call_service("automation", "trigger").
454
+
455
+ Use this to publish custom event types consumed by event-triggered automations,
456
+ Node-RED flows, or custom integrations that subscribe to specific event types.
457
+
458
+ Caveats: Events are fire-and-forget; this tool confirms the event was accepted
459
+ by the bus but does not verify whether any automation or subscriber acted on it.
460
+ """
461
+ # Validate event_type before hitting the wire — empty strings or path separators
462
+ # produce malformed URLs at POST /api/events/{event_type}.
463
+ if not event_type or not event_type.strip():
464
+ raise_tool_error(
465
+ create_validation_error(
466
+ "event_type cannot be empty or whitespace",
467
+ parameter="event_type",
468
+ )
469
+ )
470
+ if "/" in event_type or "\\" in event_type:
471
+ raise_tool_error(
472
+ create_validation_error(
473
+ "event_type cannot contain path separators",
474
+ parameter="event_type",
475
+ details=f"Received: {event_type!r}",
476
+ )
477
+ )
478
+
479
+ parsed_data: dict[str, Any] | None = None
480
+ if data is not None:
481
+ raw: Any = None
482
+ try:
483
+ raw = parse_json_param(data, "data")
484
+ except ValueError as e:
485
+ raise_tool_error(
486
+ create_validation_error(
487
+ f"Invalid data parameter: {e}",
488
+ parameter="data",
489
+ invalid_json=True,
490
+ )
491
+ )
492
+ if raw is not None:
493
+ if not isinstance(raw, dict):
494
+ raise_tool_error(
495
+ create_validation_error(
496
+ "Event data must be a JSON object (dict)",
497
+ parameter="data",
498
+ details=f"Received type: {type(raw).__name__}",
499
+ )
500
+ )
501
+ parsed_data = raw
502
+
503
+ try:
504
+ response = await self._client.fire_event(event_type, parsed_data)
505
+ except HomeAssistantConnectionError as error:
506
+ if isinstance(error.__cause__, httpx.TimeoutException):
507
+ return {
508
+ "success": True,
509
+ "partial": True,
510
+ "event_type": event_type,
511
+ "message": (
512
+ f"Event {event_type} was dispatched but Home Assistant "
513
+ "did not respond within the timeout period."
514
+ ),
515
+ "warning": (
516
+ "Response timed out. The event was dispatched and may still "
517
+ "have been delivered to subscribers."
518
+ ),
519
+ }
520
+ exception_to_structured_error(
521
+ error,
522
+ context={"event_type": event_type},
523
+ suggestions=["Check Home Assistant connection"],
524
+ )
525
+ except ToolError:
526
+ raise
527
+ except Exception as e:
528
+ exception_to_structured_error(
529
+ e,
530
+ context={"event_type": event_type},
531
+ suggestions=[
532
+ "Check Home Assistant connection",
533
+ "Verify event_type is a valid identifier",
534
+ ],
535
+ )
536
+
537
+ return {
538
+ "success": True,
539
+ "event_type": event_type,
540
+ "message": response.get("message", f"Event {event_type} fired."),
541
+ }
542
+
434
543
 
435
544
  def register_service_tools(mcp: Any, client: Any, **kwargs: Any) -> None:
436
545
  """Register service call and operation monitoring tools with the MCP server."""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 7.4.1.dev487
3
+ Version: 7.4.1.dev488
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