ha-mcp-dev 7.14.2.dev2146__tar.gz → 7.14.2.dev2152__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 (192) hide show
  1. {ha_mcp_dev-7.14.2.dev2146/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.14.2.dev2152}/PKG-INFO +1 -1
  2. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/pyproject.toml +4 -1
  3. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/server.py +4 -4
  4. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/_tools_meta.py +32 -9
  5. ha_mcp_dev-7.14.2.dev2152/src/ha_mcp/settings_ui/locales/es.json +808 -0
  6. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/locales/zh-Hans.json +808 -813
  7. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_filesystem.py +12 -1
  8. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/transforms/categorized_search.py +17 -6
  9. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  10. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp_dev.egg-info/SOURCES.txt +1 -0
  11. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/tests/test_constants.py +1 -1
  12. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/LICENSE +0 -0
  13. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/MANIFEST.in +0 -0
  14. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/README.md +0 -0
  15. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/setup.cfg +0 -0
  16. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/__init__.py +0 -0
  17. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/__main__.py +0 -0
  18. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/_pypi_marker +0 -0
  19. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/_version.py +0 -0
  20. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/auth/__init__.py +0 -0
  21. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/auth/consent_form.py +0 -0
  22. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/auth/provider.py +0 -0
  23. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/backup_manager.py +0 -0
  24. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/browser_landing.py +0 -0
  25. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/client/__init__.py +0 -0
  26. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/client/rest_client.py +0 -0
  27. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/client/supervisor_client.py +0 -0
  28. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/client/websocket_client.py +0 -0
  29. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/client/websocket_listener.py +0 -0
  30. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/config.py +0 -0
  31. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  32. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  33. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  34. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  35. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  36. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
  37. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/errors.py +0 -0
  38. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/llm_exposure.py +0 -0
  39. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/policy/__init__.py +0 -0
  40. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/policy/approval_queue.py +0 -0
  41. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/policy/evaluator.py +0 -0
  42. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/policy/handlers.py +0 -0
  43. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/policy/middleware.py +0 -0
  44. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/policy/model.py +0 -0
  45. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/policy/persistence.py +0 -0
  46. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/policy/value_sources.py +0 -0
  47. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/py.typed +0 -0
  48. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/read_only.py +0 -0
  49. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  50. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  51. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  52. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  53. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  54. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  55. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  56. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  57. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  58. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  59. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  60. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  61. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  62. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  63. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  64. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  65. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  66. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  67. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  68. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  69. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  70. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  71. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  72. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  73. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  74. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/__init__.py +0 -0
  75. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
  76. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
  77. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  78. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  79. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  80. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  81. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/_i18n.py +0 -0
  82. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  83. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  84. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/_theme.py +0 -0
  85. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/locales/README.md +0 -0
  86. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/locales/de.json +0 -0
  87. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/locales/en.json +0 -0
  88. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
  89. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
  90. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/settings.css +0 -0
  91. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/settings.html +0 -0
  92. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/settings_ui/settings.js +0 -0
  93. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/smoke_test.py +0 -0
  94. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  95. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/strict_bps.py +0 -0
  96. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/__init__.py +0 -0
  97. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/auto_backup.py +0 -0
  98. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/backup.py +0 -0
  99. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  100. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/component_api.py +0 -0
  101. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/component_config_reads.py +0 -0
  102. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/component_devices.py +0 -0
  103. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/component_registries.py +0 -0
  104. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
  105. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  106. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/device_control.py +0 -0
  107. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/enhanced.py +0 -0
  108. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/helpers.py +0 -0
  109. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/radio/__init__.py +0 -0
  110. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/radio/base.py +0 -0
  111. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/radio/matter.py +0 -0
  112. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/radio/thread.py +0 -0
  113. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  114. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/radio/zwave.py +0 -0
  115. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/reference_validator.py +0 -0
  116. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/registry.py +0 -0
  117. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  118. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  119. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  120. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  121. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  122. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  123. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  124. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  125. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  126. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  127. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_addons.py +0 -0
  128. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_areas.py +0 -0
  129. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  130. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  131. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_calendar.py +0 -0
  132. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_camera.py +0 -0
  133. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_categories.py +0 -0
  134. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_code.py +0 -0
  135. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  136. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  137. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  138. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  139. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  140. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  141. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_dev.py +0 -0
  142. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_energy.py +0 -0
  143. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_entities.py +0 -0
  144. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_groups.py +0 -0
  145. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_hacs.py +0 -0
  146. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_history.py +0 -0
  147. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_integrations.py +0 -0
  148. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_labels.py +0 -0
  149. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_radio.py +0 -0
  150. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_registry.py +0 -0
  151. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_resources.py +0 -0
  152. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_search.py +0 -0
  153. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_service.py +0 -0
  154. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_services.py +0 -0
  155. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_system.py +0 -0
  156. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_themes.py +0 -0
  157. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_todo.py +0 -0
  158. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_traces.py +0 -0
  159. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_updates.py +0 -0
  160. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_utility.py +0 -0
  161. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  162. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  163. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
  164. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/tools_zones.py +0 -0
  165. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/util_helpers.py +0 -0
  166. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/tools/validation_middleware.py +0 -0
  167. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/transforms/__init__.py +0 -0
  168. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  169. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/transport_security.py +0 -0
  170. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/update_check.py +0 -0
  171. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/utils/__init__.py +0 -0
  172. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/utils/config_hash.py +0 -0
  173. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/utils/config_write_lock.py +0 -0
  174. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/utils/data_paths.py +0 -0
  175. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/utils/domain_handlers.py +0 -0
  176. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  177. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  178. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/utils/operation_manager.py +0 -0
  179. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/utils/python_sandbox.py +0 -0
  180. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/utils/skill_loader.py +0 -0
  181. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/utils/usage_logger.py +0 -0
  182. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/visibility/__init__.py +0 -0
  183. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/visibility/enforcement.py +0 -0
  184. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/visibility/model.py +0 -0
  185. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/visibility/persistence.py +0 -0
  186. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp/visibility/resolver.py +0 -0
  187. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  188. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  189. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  190. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  191. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/tests/__init__.py +0 -0
  192. {ha_mcp_dev-7.14.2.dev2146 → ha_mcp_dev-7.14.2.dev2152}/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.14.2.dev2146
3
+ Version: 7.14.2.dev2152
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.14.2.dev2146"
7
+ version = "7.14.2.dev2152"
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
@@ -173,6 +173,9 @@ testpaths = ["tests"]
173
173
  python_files = ["test_*.py", "*_test.py"]
174
174
  python_classes = ["Test*"]
175
175
  python_functions = ["test_*"]
176
+ # See tests/pytest.ini: an empty parametrize list is a guard that stopped
177
+ # running, and the default mark hides it as a skip the summary ignores.
178
+ empty_parameter_set_mark = "fail_at_collect"
176
179
  addopts = [
177
180
  "--strict-markers",
178
181
  "--strict-config",
@@ -422,10 +422,10 @@ class HomeAssistantSmartMCPServer(EnhancedToolsMixin):
422
422
  "again \u2014 call it directly.\n\n"
423
423
  f"A few default tools are listed directly "
424
424
  f"({', '.join(DEFAULT_PINNED_TOOLS)}) — these are the "
425
- f"starting pins, but users can unpin any of them via the "
426
- f"Tools tab in the settings UI, so the actual visible set "
427
- f"may be a subset of this list. Everything else must be "
428
- f"discovered via search.\n\n"
425
+ f"starting pins, and users can unpin the non-mandatory "
426
+ f"ones via the Tools tab in the settings UI, so the "
427
+ f"actual visible set may be a subset of this list. "
428
+ f"Everything else must be discovered via search.\n\n"
429
429
  "DO NOT assume a capability is unavailable because you "
430
430
  "don't see a direct tool for it. ALWAYS search first."
431
431
  )
@@ -15,6 +15,7 @@ families and ``__init__`` can depend on it without cycles.
15
15
  from __future__ import annotations
16
16
 
17
17
  import logging
18
+ from collections.abc import Iterable
18
19
  from typing import TYPE_CHECKING, Any, NamedTuple, NotRequired, TypedDict
19
20
 
20
21
  from ..transforms import categorize_capability
@@ -50,10 +51,37 @@ class ToolStub(TypedDict):
50
51
 
51
52
  _VALID_STATES = frozenset({"enabled", "disabled", "pinned"})
52
53
 
54
+ # Groups not considered "primary" when choosing a tool's canonical group —
55
+ # these are cross-cutting tags (e.g. Z-Wave, Zigbee) that should not
56
+ # override the tool's real domain group.
57
+ SECONDARY_TAGS = frozenset({"Z-Wave", "Zigbee"})
58
+
59
+
60
+ def primary_tag(tags: Iterable[str]) -> str:
61
+ """Return the group heading the settings UI files a tool under.
62
+
63
+ The first tag that is not cross-cutting wins, in sorted order; a tool
64
+ tagged only with cross-cutting tags falls back to its first tag, and an
65
+ untagged tool to ``Other``. Exported so the locale check in
66
+ tests/src/unit/test_locale_parity.py derives the set of reachable group
67
+ names from this rule itself — a copy of the rule drifts even when the
68
+ set it reads cannot.
69
+ """
70
+ ordered = sorted(tags)
71
+ primary = [tag for tag in ordered if tag not in SECONDARY_TAGS]
72
+ if primary:
73
+ return primary[0]
74
+ return ordered[0] if ordered else "Other"
75
+
76
+
53
77
  # Tools that are always enabled regardless of saved config — the server
54
- # strips them out of any disable list before applying. Four of these
55
- # overlap with DEFAULT_PINNED_TOOLS in transforms/categorized_search.py
56
- # (ha_search, ha_get_overview, ha_report_issue, ha_manage_backup);
78
+ # strips them out of any disable list before applying. The settings UI
79
+ # additionally locks the pin toggle for mandatory tools, so the four
80
+ # that overlap with DEFAULT_PINNED_TOOLS in
81
+ # transforms/categorized_search.py
82
+ # (ha_search, ha_get_overview, ha_report_issue, ha_manage_backup)
83
+ # cannot be unpinned either — always pinned, not just always enabled
84
+ # (#2058);
57
85
  # ha_get_state is mandatory but not pinned-by-default because it is
58
86
  # reachable via the ha_call_read_tool proxy when tool search is on.
59
87
  # ha_get_skill_guide is conditionally mandatory via BPS_MANDATORY_TOOLS
@@ -239,16 +267,11 @@ async def _get_tool_metadata(
239
267
  list as of v3.2.0.
240
268
  """
241
269
  tools: list[dict[str, Any]] = []
242
- # Groups not considered "primary" when choosing a tool's canonical group —
243
- # these are cross-cutting tags (e.g. Z-Wave, Zigbee) that should not
244
- # override the tool's real domain group.
245
- secondary_tags = {"Z-Wave", "Zigbee"}
246
270
 
247
271
  registered = await server.mcp.local_provider._list_tools()
248
272
  for tool in registered:
249
273
  tags = sorted(tool.tags) if tool.tags else []
250
- primary_tags = [t for t in tags if t not in secondary_tags]
251
- primary = primary_tags[0] if primary_tags else (tags[0] if tags else "Other")
274
+ primary = primary_tag(tags)
252
275
  read_only = bool(
253
276
  tool.annotations and getattr(tool.annotations, "readOnlyHint", None)
254
277
  )