ha-mcp-dev 7.4.1.dev505__tar.gz → 7.5.0.dev508__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.4.1.dev505/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.5.0.dev508}/PKG-INFO +1 -1
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/pyproject.toml +1 -1
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/client/rest_client.py +36 -12
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/tools_addons.py +445 -51
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/tools_utility.py +71 -29
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/LICENSE +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/MANIFEST.in +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/README.md +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/setup.cfg +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/__init__.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/__main__.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/_pypi_marker +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/_version.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/auth/__init__.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/auth/consent_form.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/auth/provider.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/client/__init__.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/client/supervisor_client.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/client/websocket_client.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/client/websocket_listener.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/config.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/errors.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/py.typed +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/server.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/settings_ui.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/smoke_test.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/__init__.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/backup.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/best_practice_checker.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/device_control.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/enhanced.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/helpers.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/reference_validator.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/registry.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/smart_search.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/tools_areas.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/tools_blueprints.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/tools_bug_report.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/tools_calendar.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/tools_camera.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/tools_categories.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/tools_code.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/tools_config_automations.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/tools_config_entry_flow.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/tools_energy.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/tools_entities.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/tools_filesystem.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/tools_groups.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/tools_hacs.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/tools_history.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/tools_integrations.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/tools_labels.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/tools_registry.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/tools_resources.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/tools_search.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/tools_service.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/tools_services.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/tools_system.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/tools_todo.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/tools_traces.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/tools_updates.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/tools_zones.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/tools/util_helpers.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/transforms/__init__.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/transforms/categorized_search.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/utils/__init__.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/utils/config_hash.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/utils/data_paths.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/utils/domain_handlers.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/utils/fuzzy_search.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/utils/operation_manager.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/utils/python_sandbox.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp/utils/usage_logger.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/tests/__init__.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/tests/test_constants.py +0 -0
- {ha_mcp_dev-7.4.1.dev505 → ha_mcp_dev-7.5.0.dev508}/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
|
+
version = "7.5.0.dev508"
|
|
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"
|
|
@@ -527,7 +527,7 @@ class HomeAssistantClient:
|
|
|
527
527
|
|
|
528
528
|
- ``"addons/<slug>"`` for add-on container logs
|
|
529
529
|
- ``"<service>"`` (where service ∈ {supervisor, host, core, dns, audio,
|
|
530
|
-
multicast, observer}) for system-service logs
|
|
530
|
+
cli, multicast, observer}) for system-service logs
|
|
531
531
|
|
|
532
532
|
Bypasses ``HomeAssistantClient.httpx_client`` because the Supervisor
|
|
533
533
|
endpoint uses a different base URL (``http://supervisor``) and a
|
|
@@ -645,18 +645,42 @@ class HomeAssistantClient:
|
|
|
645
645
|
return await self._supervisor_logs_get(f"addons/{slug}")
|
|
646
646
|
|
|
647
647
|
async def _get_system_service_logs(self, service: str) -> str:
|
|
648
|
-
"""Fetch HA system-service logs
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
``
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
648
|
+
"""Fetch HA system-service logs.
|
|
649
|
+
|
|
650
|
+
``service`` must be one of the eight Supervisor-managed services:
|
|
651
|
+
``supervisor``, ``host``, ``core``, ``dns``, ``audio``, ``cli``,
|
|
652
|
+
``multicast``, ``observer``. Caller is responsible for validating
|
|
653
|
+
``service`` against the allowed set; this helper does no validation
|
|
654
|
+
and will raise ``HomeAssistantAPIError`` on any unknown path (404).
|
|
655
|
+
|
|
656
|
+
Branch on ``is_running_in_addon()`` — mirror of ``get_addon_logs``:
|
|
657
|
+
inside the addon container goes directly to Supervisor at
|
|
658
|
+
``http://supervisor/{service}/logs`` with the Supervisor token
|
|
659
|
+
(``hassio_role: manager`` required). On non-addon installs (Docker
|
|
660
|
+
without Supervisor, pyinstaller, pip pointing at a normal HA URL),
|
|
661
|
+
falls back to the HA Core proxy at ``/api/hassio/{service}/logs``.
|
|
662
|
+
|
|
663
|
+
All seven slugs are whitelisted in HA Core's hassio proxy
|
|
664
|
+
(``homeassistant/components/hassio/http.py`` — ``PATHS_ADMIN``), so
|
|
665
|
+
an admin LLA is sufficient to reach any of them from outside the
|
|
666
|
+
addon.
|
|
667
|
+
|
|
668
|
+
Closes #1260: pre-fix this method had only the addon-direct branch,
|
|
669
|
+
so non-addon installs (the Docker image, uvx ha-mcp, etc.) hit the
|
|
670
|
+
``SUPERVISOR_TOKEN``-absent fail-fast in ``_supervisor_logs_get`` for
|
|
671
|
+
every service, while the sibling ``source="supervisor"`` (addon
|
|
672
|
+
logs) call kept working through its own Core-proxy fallback.
|
|
658
673
|
"""
|
|
659
|
-
|
|
674
|
+
if is_running_in_addon():
|
|
675
|
+
return await self._supervisor_logs_get(service)
|
|
676
|
+
|
|
677
|
+
logger.debug(f"Fetching {service} logs via HA Core proxy")
|
|
678
|
+
response = await self._raw_request(
|
|
679
|
+
"GET",
|
|
680
|
+
f"/hassio/{service}/logs",
|
|
681
|
+
headers={"Accept": "text/plain"},
|
|
682
|
+
)
|
|
683
|
+
return response.text
|
|
660
684
|
|
|
661
685
|
async def test_connection(self) -> tuple[bool, str | None]:
|
|
662
686
|
"""
|