ha-mcp-dev 7.9.0.dev768__tar.gz → 7.9.0.dev769__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.9.0.dev768/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.9.0.dev769}/PKG-INFO +1 -1
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/pyproject.toml +1 -1
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/validation_middleware.py +21 -6
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/LICENSE +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/MANIFEST.in +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/README.md +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/setup.cfg +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/backup_manager.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/client/rest_client.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/policy/__init__.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/policy/approval_queue.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/policy/evaluator.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/policy/handlers.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/policy/middleware.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/policy/model.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/policy/persistence.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/policy/value_sources.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/read_only.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/server.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/settings_ui/__init__.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/settings_ui/settings.css +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/settings_ui/settings.html +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/settings_ui/settings.js +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/auto_backup.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/config_entry_flow.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/enhanced.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/radio/__init__.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/radio/base.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/radio/matter.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/radio/thread.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/radio/zigbee.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/radio/zwave.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/smart_search/_base.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/smart_search/_config.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_addons.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_config_automations.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_integrations.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_radio.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_themes.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_utility.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/transport_security.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/update_check.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/utils/skill_loader.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/visibility/__init__.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/visibility/model.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/visibility/persistence.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/visibility/resolver.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/tests/__init__.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/tests/test_constants.py +0 -0
- {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/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.9.0.
|
|
7
|
+
version = "7.9.0.dev769"
|
|
8
8
|
description = "Home Assistant MCP Server - Complete control of Home Assistant through MCP"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
# Upper bound widened to <3.15 so the package installs on Home Assistant's
|
{ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/validation_middleware.py
RENAMED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
"""FastMCP middleware that converts Pydantic validation errors to structured ToolErrors.
|
|
2
2
|
|
|
3
3
|
When a model passes the wrong type for a tool parameter (e.g. a JSON string where
|
|
4
|
-
a dict is required), FastMCP
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
a dict is required), FastMCP surfaces a validation error with a raw message like
|
|
5
|
+
"Input should be a valid dictionary" -- a bare ``pydantic.ValidationError`` on
|
|
6
|
+
older FastMCP, or a ``fastmcp.exceptions.ValidationError`` wrapping it (chained
|
|
7
|
+
via ``from e``) on FastMCP >= 3.4.3. This middleware intercepts either shape and
|
|
8
|
+
converts it to ha-mcp's structured format with actionable guidance.
|
|
7
9
|
"""
|
|
8
10
|
|
|
9
11
|
from __future__ import annotations
|
|
@@ -11,6 +13,7 @@ from __future__ import annotations
|
|
|
11
13
|
import logging
|
|
12
14
|
from typing import Any
|
|
13
15
|
|
|
16
|
+
from fastmcp.exceptions import ValidationError as FastMCPValidationError
|
|
14
17
|
from fastmcp.server.middleware.middleware import CallNext, Middleware, MiddlewareContext
|
|
15
18
|
from pydantic import ValidationError as PydanticValidationError
|
|
16
19
|
|
|
@@ -40,9 +43,20 @@ class ValidationErrorMiddleware(Middleware):
|
|
|
40
43
|
self, context: MiddlewareContext, call_next: CallNext
|
|
41
44
|
) -> Any:
|
|
42
45
|
try:
|
|
43
|
-
|
|
44
|
-
except PydanticValidationError as exc:
|
|
45
|
-
|
|
46
|
+
result = await call_next(context)
|
|
47
|
+
except (PydanticValidationError, FastMCPValidationError) as exc:
|
|
48
|
+
# fastmcp >= 3.4.3 re-raises an argument-validation failure as
|
|
49
|
+
# ``fastmcp.exceptions.ValidationError`` wrapping the pydantic error
|
|
50
|
+
# (chained via ``from e``); older fastmcp raises the pydantic error
|
|
51
|
+
# directly. Recover the pydantic errors from whichever shape arrived,
|
|
52
|
+
# and let any other fastmcp ValidationError (e.g. a return-value
|
|
53
|
+
# failure with no pydantic cause) propagate unchanged.
|
|
54
|
+
pydantic_exc = (
|
|
55
|
+
exc if isinstance(exc, PydanticValidationError) else exc.__cause__
|
|
56
|
+
)
|
|
57
|
+
if not isinstance(pydantic_exc, PydanticValidationError):
|
|
58
|
+
raise
|
|
59
|
+
errors = pydantic_exc.errors(include_url=False)
|
|
46
60
|
# Group by the real argument path. A union param like
|
|
47
61
|
# `str | list[str]` emits one error per arm with loc (param, "str"),
|
|
48
62
|
# (param, "list[str]"); without grouping the user saw `param.str` /
|
|
@@ -73,3 +87,4 @@ class ValidationErrorMiddleware(Middleware):
|
|
|
73
87
|
details=", ".join(dict.fromkeys(err["type"] for err in errors)),
|
|
74
88
|
)
|
|
75
89
|
)
|
|
90
|
+
return result
|
|
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.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/dashboard_screenshot/__init__.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/dashboard_screenshot/capture.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/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.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/AGENTS.md
RENAMED
|
File without changes
|
{ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/CLAUDE.md
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/LICENSE
RENAMED
|
File without changes
|
{ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/smart_search/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/smart_search/_config.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/smart_search/_entities.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/smart_search/_overview.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/smart_search/_scenes.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/smart_search/_scoring.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tool_search_hint_middleware.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
|
{ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_config_automations.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_config_dashboards.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_config_helpers.py
RENAMED
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_config_scripts.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/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
|
|
File without changes
|
{ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_voice_assistant.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/transforms/categorized_search.py
RENAMED
|
File without changes
|
{ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/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
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp_dev.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/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
|