ha-mcp-dev 7.13.0.dev1994__tar.gz → 7.13.0.dev1997__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 (187) hide show
  1. {ha_mcp_dev-7.13.0.dev1994/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.13.0.dev1997}/PKG-INFO +1 -1
  2. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/pyproject.toml +1 -1
  3. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_labels.py +82 -16
  4. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  5. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/LICENSE +0 -0
  6. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/MANIFEST.in +0 -0
  7. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/README.md +0 -0
  8. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/setup.cfg +0 -0
  9. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/__init__.py +0 -0
  10. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/__main__.py +0 -0
  11. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/_pypi_marker +0 -0
  12. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/_version.py +0 -0
  13. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/auth/__init__.py +0 -0
  14. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/auth/consent_form.py +0 -0
  15. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/auth/provider.py +0 -0
  16. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/backup_manager.py +0 -0
  17. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/browser_landing.py +0 -0
  18. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/client/__init__.py +0 -0
  19. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/client/rest_client.py +0 -0
  20. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/client/supervisor_client.py +0 -0
  21. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/client/websocket_client.py +0 -0
  22. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/client/websocket_listener.py +0 -0
  23. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/config.py +0 -0
  24. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  25. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  26. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  27. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  28. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  29. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
  30. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/errors.py +0 -0
  31. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/llm_exposure.py +0 -0
  32. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/policy/__init__.py +0 -0
  33. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/policy/approval_queue.py +0 -0
  34. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/policy/evaluator.py +0 -0
  35. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/policy/handlers.py +0 -0
  36. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/policy/middleware.py +0 -0
  37. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/policy/model.py +0 -0
  38. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/policy/persistence.py +0 -0
  39. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/policy/value_sources.py +0 -0
  40. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/py.typed +0 -0
  41. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/read_only.py +0 -0
  42. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  43. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  44. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  45. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  46. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  47. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  48. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  49. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  50. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  51. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  52. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  53. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  54. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  55. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  56. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  57. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  58. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  59. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  60. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  61. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  62. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  63. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  64. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  65. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  66. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  67. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/server.py +0 -0
  68. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/settings_ui/__init__.py +0 -0
  69. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
  70. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
  71. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  72. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  73. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  74. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  75. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/settings_ui/_i18n.py +0 -0
  76. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  77. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  78. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/settings_ui/_theme.py +0 -0
  79. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
  80. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/settings_ui/locales/README.md +0 -0
  81. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/settings_ui/locales/de.json +0 -0
  82. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/settings_ui/locales/en.json +0 -0
  83. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
  84. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/settings_ui/settings.css +0 -0
  85. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/settings_ui/settings.html +0 -0
  86. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/settings_ui/settings.js +0 -0
  87. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/smoke_test.py +0 -0
  88. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  89. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/strict_bps.py +0 -0
  90. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/__init__.py +0 -0
  91. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/auto_backup.py +0 -0
  92. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/backup.py +0 -0
  93. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  94. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/component_api.py +0 -0
  95. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/component_config_reads.py +0 -0
  96. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/component_devices.py +0 -0
  97. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/component_registries.py +0 -0
  98. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
  99. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  100. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/device_control.py +0 -0
  101. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/enhanced.py +0 -0
  102. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/helpers.py +0 -0
  103. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/radio/__init__.py +0 -0
  104. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/radio/base.py +0 -0
  105. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/radio/matter.py +0 -0
  106. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/radio/thread.py +0 -0
  107. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  108. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/radio/zwave.py +0 -0
  109. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/reference_validator.py +0 -0
  110. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/registry.py +0 -0
  111. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  112. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  113. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  114. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  115. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  116. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  117. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  118. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  119. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  120. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  121. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_addons.py +0 -0
  122. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_areas.py +0 -0
  123. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  124. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  125. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_calendar.py +0 -0
  126. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_camera.py +0 -0
  127. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_categories.py +0 -0
  128. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_code.py +0 -0
  129. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  130. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  131. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  132. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  133. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  134. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  135. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_dev.py +0 -0
  136. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_energy.py +0 -0
  137. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_entities.py +0 -0
  138. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  139. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_groups.py +0 -0
  140. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_hacs.py +0 -0
  141. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_history.py +0 -0
  142. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_integrations.py +0 -0
  143. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_radio.py +0 -0
  144. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_registry.py +0 -0
  145. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_resources.py +0 -0
  146. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_search.py +0 -0
  147. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_service.py +0 -0
  148. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_services.py +0 -0
  149. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_system.py +0 -0
  150. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_themes.py +0 -0
  151. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_todo.py +0 -0
  152. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_traces.py +0 -0
  153. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_updates.py +0 -0
  154. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_utility.py +0 -0
  155. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  156. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  157. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
  158. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/tools_zones.py +0 -0
  159. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/util_helpers.py +0 -0
  160. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/tools/validation_middleware.py +0 -0
  161. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/transforms/__init__.py +0 -0
  162. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/transforms/categorized_search.py +0 -0
  163. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  164. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/transport_security.py +0 -0
  165. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/update_check.py +0 -0
  166. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/utils/__init__.py +0 -0
  167. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/utils/config_hash.py +0 -0
  168. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/utils/data_paths.py +0 -0
  169. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/utils/domain_handlers.py +0 -0
  170. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  171. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  172. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/utils/operation_manager.py +0 -0
  173. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/utils/python_sandbox.py +0 -0
  174. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/utils/skill_loader.py +0 -0
  175. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/utils/usage_logger.py +0 -0
  176. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/visibility/__init__.py +0 -0
  177. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/visibility/model.py +0 -0
  178. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/visibility/persistence.py +0 -0
  179. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp/visibility/resolver.py +0 -0
  180. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  181. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  182. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  183. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  184. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  185. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/tests/__init__.py +0 -0
  186. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/tests/test_constants.py +0 -0
  187. {ha_mcp_dev-7.13.0.dev1994 → ha_mcp_dev-7.13.0.dev1997}/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.13.0.dev1994
3
+ Version: 7.13.0.dev1997
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.13.0.dev1994"
7
+ version = "7.13.0.dev1997"
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
@@ -31,6 +31,73 @@ class LabelTools:
31
31
  def __init__(self, client: Any) -> None:
32
32
  self._client = client
33
33
 
34
+ async def _list_labels(
35
+ self, context: dict[str, Any] | None = None
36
+ ) -> list[dict[str, Any]]:
37
+ """Return all labels from the registry (shared by get/set).
38
+
39
+ Raises ToolError (SERVICE_CALL_FAILED) if the list call fails or returns
40
+ an unexpected non-list envelope — a degraded response must not collapse
41
+ to an empty registry, or callers would confidently report a real label
42
+ as missing (mirrors ``backup_manager._require_list``).
43
+ """
44
+ result = await self._client.send_websocket_message(
45
+ {"type": "config/label_registry/list"}
46
+ )
47
+ if not result.get("success"):
48
+ raise_tool_error(
49
+ create_error_response(
50
+ ErrorCode.SERVICE_CALL_FAILED,
51
+ result.get("error", "Failed to get labels"),
52
+ context=context,
53
+ )
54
+ )
55
+ # No ``[]`` default: a success envelope that omits ``result`` (or sends
56
+ # a non-list) is a degraded response, not an empty registry — defaulting
57
+ # would let callers confidently report a real label as missing.
58
+ labels = result.get("result")
59
+ if not isinstance(labels, list):
60
+ raise_tool_error(
61
+ create_error_response(
62
+ ErrorCode.SERVICE_CALL_FAILED,
63
+ "Label registry returned a missing or non-list result",
64
+ context=context,
65
+ )
66
+ )
67
+ return labels
68
+
69
+ async def _require_existing_label(self, label_id: str, name: str) -> None:
70
+ """Raise RESOURCE_NOT_FOUND if ``label_id`` is not in the registry.
71
+
72
+ Enforces the strict update-only contract (issue #1860): update of an
73
+ unknown id yields an opaque "Unknown error", and create cannot honor a
74
+ caller-supplied id (HA derives it from the name), so an unknown id is a
75
+ clear error with a create hint rather than a silently divergent upsert.
76
+ """
77
+ existing = await self._list_labels(context={"name": name, "label_id": label_id})
78
+ if any(lbl.get("label_id") == label_id for lbl in existing):
79
+ return
80
+ raise_tool_error(
81
+ create_error_response(
82
+ ErrorCode.RESOURCE_NOT_FOUND,
83
+ f"Label not found: {label_id}",
84
+ context={
85
+ "name": name,
86
+ "label_id": label_id,
87
+ "available_label_ids": [
88
+ lbl.get("label_id") for lbl in existing[:10]
89
+ ],
90
+ },
91
+ suggestions=[
92
+ "To create a new label, omit label_id — Home Assistant "
93
+ + "derives the id from the name (e.g. 'vendor:tapo' becomes "
94
+ + "'vendor_tapo')",
95
+ "To update an existing label, pass its exact current "
96
+ + "label_id (list all with ha_config_get_label())",
97
+ ],
98
+ )
99
+ )
100
+
34
101
  @tool(
35
102
  name="ha_config_get_label",
36
103
  tags={"Labels & Categories"},
@@ -82,22 +149,7 @@ class LabelTools:
82
149
  ],
83
150
  context={"action": "get"},
84
151
  )
85
- message: dict[str, Any] = {
86
- "type": "config/label_registry/list",
87
- }
88
-
89
- result = await self._client.send_websocket_message(message)
90
-
91
- if not result.get("success"):
92
- raise_tool_error(
93
- create_error_response(
94
- ErrorCode.SERVICE_CALL_FAILED,
95
- result.get("error", "Failed to get labels"),
96
- context={"label_id": label_id},
97
- )
98
- )
99
-
100
- labels = result.get("result", [])
152
+ labels = await self._list_labels(context={"label_id": label_id})
101
153
 
102
154
  if label_id is None:
103
155
  return {
@@ -223,6 +275,13 @@ class LabelTools:
223
275
  ],
224
276
  context={"action": "set", "name": name},
225
277
  )
278
+ # Strict update-only contract (issue #1860): routing to
279
+ # label_registry/update with an unknown id returns an opaque
280
+ # "Unknown error", and label_registry/create cannot honor a
281
+ # caller-supplied id (HA derives it from the name). Verify the
282
+ # id exists up front and return actionable guidance instead of
283
+ # dispatching an update that fails cryptically.
284
+ await self._require_existing_label(label_id, name)
226
285
  action = "update" if label_id else "create"
227
286
 
228
287
  message: dict[str, Any] = {
@@ -254,6 +313,13 @@ class LabelTools:
254
313
  "message": f"Successfully {action_past} label: {name}",
255
314
  }
256
315
  else:
316
+ # The unknown-id case is caught up front by
317
+ # _require_existing_label. This substring match only catches HA
318
+ # error texts containing "not found"/"doesn't exist"; HA's label
319
+ # update does NOT emit those for an unknown/deleted id (it
320
+ # surfaces "Unknown error"), so it is a best-effort guard for
321
+ # other/future phrasings only — the check-then-update delete race
322
+ # is not handled here and still surfaces as SERVICE_CALL_FAILED.
257
323
  error_str = str(result.get("error", "")).lower()
258
324
  if "not found" in error_str or "doesn't exist" in error_str:
259
325
  raise_tool_error(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 7.13.0.dev1994
3
+ Version: 7.13.0.dev1997
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