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.
- {ha_mcp_dev-7.7.0.dev691/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.7.0.dev692}/PKG-INFO +1 -1
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/pyproject.toml +1 -1
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_calendar.py +97 -22
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/LICENSE +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/MANIFEST.in +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/README.md +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/setup.cfg +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/backup_manager.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/client/rest_client.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/read_only.py +0 -0
- {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
- {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
- {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
- {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
- {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
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/server.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/settings.css +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/settings.js +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/settings_ui.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/auto_backup.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/config_entry_flow.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/enhanced.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_config_automations.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_integrations.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_themes.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/validation_middleware.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
- {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
- {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
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
- {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
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/tests/__init__.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/tests/test_constants.py +0 -0
- {ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/tests/test_env_manager.py +0 -0
|
@@ -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.
|
|
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
|
|
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
|
|
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-
|
|
236
|
-
end="2024-01-
|
|
237
|
-
|
|
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
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
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
|
-
|
|
274
|
-
|
|
275
|
-
|
|
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():
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/dashboard_screenshot/__init__.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/dashboard_screenshot/capture.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/dashboard_screenshot/provision.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/resources/skills-vendor/AGENTS.md
RENAMED
|
File without changes
|
{ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/resources/skills-vendor/CLAUDE.md
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/resources/skills-vendor/LICENSE
RENAMED
|
File without changes
|
{ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/resources/skills-vendor/README.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/best_practice_checker.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/smart_search/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/smart_search/_config.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/smart_search/_entities.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/smart_search/_overview.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/smart_search/_scenes.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/smart_search/_scoring.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_config_automations.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_config_dashboards.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_config_helpers.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_config_scripts.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_dashboard_screenshot.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/tools_voice_assistant.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/tools/validation_middleware.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/transforms/categorized_search.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/transforms/lite_docstrings.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp/utils/kill_signal_diagnostics.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp_dev.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{ha_mcp_dev-7.7.0.dev691 → ha_mcp_dev-7.7.0.dev692}/src/ha_mcp_dev.egg-info/entry_points.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|