ha-mcp-dev 7.7.0.dev691__tar.gz → 7.7.0.dev692__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 (142) hide show
  1. {ha_mcp_dev-7.7.0.dev691/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.7.0.dev692}/PKG-INFO +1 -1
  2. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/pyproject.toml +1 -1
  3. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_calendar.py +97 -22
  4. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  5. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/LICENSE +0 -0
  6. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/MANIFEST.in +0 -0
  7. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/README.md +0 -0
  8. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/setup.cfg +0 -0
  9. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/__init__.py +0 -0
  10. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/__main__.py +0 -0
  11. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/_pypi_marker +0 -0
  12. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/_version.py +0 -0
  13. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/auth/__init__.py +0 -0
  14. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/auth/consent_form.py +0 -0
  15. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/auth/provider.py +0 -0
  16. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/backup_manager.py +0 -0
  17. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/client/__init__.py +0 -0
  18. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/client/rest_client.py +0 -0
  19. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/client/supervisor_client.py +0 -0
  20. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/client/websocket_client.py +0 -0
  21. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/client/websocket_listener.py +0 -0
  22. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/config.py +0 -0
  23. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  24. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  25. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  26. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/errors.py +0 -0
  27. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/policy/__init__.py +0 -0
  28. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/policy/approval_queue.py +0 -0
  29. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/policy/evaluator.py +0 -0
  30. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/policy/handlers.py +0 -0
  31. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/policy/middleware.py +0 -0
  32. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/policy/model.py +0 -0
  33. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/policy/persistence.py +0 -0
  34. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/policy/value_sources.py +0 -0
  35. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/py.typed +0 -0
  36. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/read_only.py +0 -0
  37. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  38. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  39. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  40. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  41. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  42. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  43. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  44. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  45. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  46. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  47. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  48. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  49. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  50. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  51. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  52. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  53. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  54. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  55. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  56. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  57. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  58. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  59. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/server.py +0 -0
  60. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/settings.css +0 -0
  61. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/settings.js +0 -0
  62. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/settings_ui.py +0 -0
  63. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/smoke_test.py +0 -0
  64. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  65. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/__init__.py +0 -0
  66. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/auto_backup.py +0 -0
  67. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/backup.py +0 -0
  68. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  69. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  70. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/device_control.py +0 -0
  71. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/enhanced.py +0 -0
  72. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/helpers.py +0 -0
  73. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/reference_validator.py +0 -0
  74. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/registry.py +0 -0
  75. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  76. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  77. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  78. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  79. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  80. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  81. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  82. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  83. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  84. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_addons.py +0 -0
  85. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_areas.py +0 -0
  86. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  87. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  88. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_camera.py +0 -0
  89. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_categories.py +0 -0
  90. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_code.py +0 -0
  91. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  92. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  93. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  94. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  95. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  96. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  97. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_energy.py +0 -0
  98. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_entities.py +0 -0
  99. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  100. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_groups.py +0 -0
  101. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_hacs.py +0 -0
  102. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_history.py +0 -0
  103. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_integrations.py +0 -0
  104. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_labels.py +0 -0
  105. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
  106. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_registry.py +0 -0
  107. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_resources.py +0 -0
  108. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_search.py +0 -0
  109. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_service.py +0 -0
  110. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_services.py +0 -0
  111. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_system.py +0 -0
  112. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_themes.py +0 -0
  113. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_todo.py +0 -0
  114. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_traces.py +0 -0
  115. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_updates.py +0 -0
  116. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_utility.py +0 -0
  117. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  118. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  119. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_zones.py +0 -0
  120. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/util_helpers.py +0 -0
  121. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/validation_middleware.py +0 -0
  122. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/transforms/__init__.py +0 -0
  123. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/transforms/categorized_search.py +0 -0
  124. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  125. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/utils/__init__.py +0 -0
  126. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/utils/config_hash.py +0 -0
  127. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/utils/data_paths.py +0 -0
  128. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/utils/domain_handlers.py +0 -0
  129. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  130. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  131. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/utils/operation_manager.py +0 -0
  132. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/utils/python_sandbox.py +0 -0
  133. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/utils/skill_loader.py +0 -0
  134. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/utils/usage_logger.py +0 -0
  135. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  136. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  137. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  138. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  139. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  140. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/tests/__init__.py +0 -0
  141. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/tests/test_constants.py +0 -0
  142. {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/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.7.0.dev691
3
+ Version: 7.7.0.dev692
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.7.0.dev691"
7
+ version = "7.7.0.dev692"
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"
@@ -204,11 +204,25 @@ class CalendarTools:
204
204
  location: Annotated[
205
205
  str | None, Field(description="Optional event location", default=None)
206
206
  ] = None,
207
+ rrule: Annotated[
208
+ str | None,
209
+ Field(
210
+ description=(
211
+ "Optional RFC 5545 recurrence rule, without 'RRULE:' prefix "
212
+ "(e.g., 'FREQ=WEEKLY;BYDAY=MO' or 'FREQ=MONTHLY;BYDAY=3SA'). "
213
+ "Creates a recurring event series."
214
+ ),
215
+ default=None,
216
+ ),
217
+ ] = None,
207
218
  ) -> dict[str, Any]:
208
219
  """
209
220
  Create a new event in a calendar.
210
221
 
211
- Creates a calendar event using the calendar.create_event service.
222
+ Creates a one-off event via the calendar.create_event service, or a
223
+ recurring series via the WebSocket ``calendar/event/create`` command
224
+ when ``rrule`` is provided (the REST service schema does not accept
225
+ recurrence rules).
212
226
 
213
227
  **Parameters:**
214
228
  - entity_id: Calendar entity ID (e.g., 'calendar.family')
@@ -217,6 +231,7 @@ class CalendarTools:
217
231
  - end: Event end datetime in ISO format
218
232
  - description: Optional event description
219
233
  - location: Optional event location
234
+ - rrule: Optional RFC 5545 recurrence rule (creates a recurring series)
220
235
 
221
236
  **Example Usage:**
222
237
  ```python
@@ -228,17 +243,21 @@ class CalendarTools:
228
243
  end="2024-01-15T15:00:00"
229
244
  )
230
245
 
231
- # Create an event with details
246
+ # Create a recurring event (every Monday, 10 occurrences)
232
247
  result = ha_config_set_calendar_event(
233
248
  "calendar.work",
234
249
  summary="Team meeting",
235
- start="2024-01-16T10:00:00",
236
- end="2024-01-16T11:00:00",
237
- description="Weekly sync meeting",
238
- location="Conference Room A"
250
+ start="2024-01-15T10:00:00",
251
+ end="2024-01-15T11:00:00",
252
+ rrule="FREQ=WEEKLY;BYDAY=MO;COUNT=10"
239
253
  )
240
254
  ```
241
255
 
256
+ **Note:**
257
+ Not every calendar integration supports event creation; recurring
258
+ events additionally require the integration to support recurrence
259
+ (the built-in Local Calendar does).
260
+
242
261
  **Returns:**
243
262
  - Success status and event details
244
263
  """
@@ -257,23 +276,71 @@ class CalendarTools:
257
276
  )
258
277
  )
259
278
 
260
- # Build service data
261
- service_data: dict[str, Any] = {
262
- "entity_id": entity_id,
263
- "summary": summary,
264
- "start_date_time": start,
265
- "end_date_time": end,
266
- }
267
-
268
- if description:
269
- service_data["description"] = description
270
- if location:
271
- service_data["location"] = location
279
+ if rrule:
280
+ # The ``calendar.create_event`` service schema has no rrule
281
+ # field — recurrence is only accepted by the WebSocket
282
+ # command ``calendar/event/create`` (see HA Core
283
+ # ``homeassistant/components/calendar/__init__.py``), the
284
+ # same split that forces the delete tool below onto the
285
+ # WebSocket API.
286
+ event: dict[str, Any] = {
287
+ "summary": summary,
288
+ "dtstart": start,
289
+ "dtend": end,
290
+ "rrule": rrule,
291
+ }
292
+ if description:
293
+ event["description"] = description
294
+ if location:
295
+ event["location"] = location
296
+
297
+ ws_client, conn_error = await get_connected_ws_client(
298
+ self._client.base_url,
299
+ self._client.token,
300
+ verify_ssl=self._client.verify_ssl,
301
+ )
302
+ if conn_error or ws_client is None:
303
+ raise_tool_error(
304
+ conn_error
305
+ or create_error_response(
306
+ ErrorCode.CONNECTION_FAILED,
307
+ "Failed to connect to Home Assistant WebSocket",
308
+ context={"entity_id": entity_id},
309
+ )
310
+ )
272
311
 
273
- # Call the calendar.create_event service
274
- result = await self._client.call_service(
275
- "calendar", "create_event", service_data
276
- )
312
+ try:
313
+ result = await ws_client.send_command(
314
+ "calendar/event/create", entity_id=entity_id, event=event
315
+ )
316
+ finally:
317
+ # Guard disconnect: a transport-teardown error here would
318
+ # otherwise replace the original send_command exception.
319
+ try:
320
+ await ws_client.disconnect()
321
+ except Exception as disconnect_error:
322
+ logger.debug(
323
+ f"WebSocket disconnect after create_event for "
324
+ f"{entity_id}: {disconnect_error}"
325
+ )
326
+ else:
327
+ # Build service data
328
+ service_data: dict[str, Any] = {
329
+ "entity_id": entity_id,
330
+ "summary": summary,
331
+ "start_date_time": start,
332
+ "end_date_time": end,
333
+ }
334
+
335
+ if description:
336
+ service_data["description"] = description
337
+ if location:
338
+ service_data["location"] = location
339
+
340
+ # Call the calendar.create_event service
341
+ result = await self._client.call_service(
342
+ "calendar", "create_event", service_data
343
+ )
277
344
 
278
345
  return {
279
346
  "success": True,
@@ -284,6 +351,7 @@ class CalendarTools:
284
351
  "end": end,
285
352
  "description": description,
286
353
  "location": location,
354
+ "rrule": rrule,
287
355
  },
288
356
  "result": result,
289
357
  "message": f"Successfully created event '{summary}' in {entity_id}",
@@ -300,6 +368,13 @@ class CalendarTools:
300
368
  "Ensure end time is after start time",
301
369
  "Some calendar integrations may be read-only",
302
370
  ]
371
+ if rrule:
372
+ suggestions.insert(
373
+ 0,
374
+ "Check RRULE syntax (RFC 5545, without the 'RRULE:' prefix, "
375
+ "e.g. 'FREQ=WEEKLY;BYDAY=MO') and that this calendar "
376
+ "integration supports recurring events",
377
+ )
303
378
 
304
379
  error_str = str(error)
305
380
  if "404" in error_str or "not found" in error_str.lower():
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 7.7.0.dev691
3
+ Version: 7.7.0.dev692
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