ha-mcp-dev 7.12.3.dev1932__tar.gz → 7.12.3.dev1937__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 (178) hide show
  1. {ha_mcp_dev-7.12.3.dev1932/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.12.3.dev1937}/PKG-INFO +1 -1
  2. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/pyproject.toml +1 -1
  3. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/server.py +1 -0
  4. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/settings_ui/_tools_meta.py +10 -2
  5. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/backup.py +5 -1
  6. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_addons.py +2 -0
  7. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_areas.py +3 -0
  8. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_blueprints.py +6 -1
  9. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_bug_report.py +1 -0
  10. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_calendar.py +3 -0
  11. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_camera.py +1 -0
  12. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_categories.py +7 -1
  13. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_code.py +1 -0
  14. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_config_automations.py +3 -0
  15. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_config_dashboards.py +11 -2
  16. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_config_helpers.py +6 -1
  17. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_config_scenes.py +3 -0
  18. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_config_scripts.py +3 -0
  19. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_dashboard_screenshot.py +1 -0
  20. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_dev.py +10 -2
  21. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_energy.py +1 -0
  22. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_entities.py +3 -0
  23. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_filesystem.py +33 -1
  24. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_groups.py +7 -1
  25. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_hacs.py +2 -0
  26. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_history.py +1 -0
  27. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_integrations.py +7 -1
  28. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_labels.py +7 -1
  29. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_mcp_component.py +5 -1
  30. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_radio.py +1 -0
  31. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_registry.py +7 -1
  32. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_resources.py +3 -0
  33. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_search.py +3 -0
  34. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_service.py +16 -3
  35. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_services.py +1 -0
  36. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_system.py +11 -2
  37. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_themes.py +1 -0
  38. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_todo.py +12 -2
  39. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_traces.py +1 -0
  40. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_utility.py +2 -0
  41. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_voice_assistant.py +2 -0
  42. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_yaml_config.py +1 -0
  43. ha_mcp_dev-7.12.3.dev1937/src/ha_mcp/tools/tools_yaml_read.py +336 -0
  44. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_zones.py +12 -2
  45. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/transforms/categorized_search.py +7 -7
  46. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  47. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp_dev.egg-info/SOURCES.txt +1 -0
  48. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/LICENSE +0 -0
  49. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/MANIFEST.in +0 -0
  50. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/README.md +0 -0
  51. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/setup.cfg +0 -0
  52. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/__init__.py +0 -0
  53. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/__main__.py +0 -0
  54. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/_pypi_marker +0 -0
  55. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/_version.py +0 -0
  56. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/auth/__init__.py +0 -0
  57. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/auth/consent_form.py +0 -0
  58. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/auth/provider.py +0 -0
  59. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/backup_manager.py +0 -0
  60. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/browser_landing.py +0 -0
  61. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/client/__init__.py +0 -0
  62. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/client/rest_client.py +0 -0
  63. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/client/supervisor_client.py +0 -0
  64. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/client/websocket_client.py +0 -0
  65. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/client/websocket_listener.py +0 -0
  66. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/config.py +0 -0
  67. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  68. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  69. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  70. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  71. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  72. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/errors.py +0 -0
  73. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/llm_exposure.py +0 -0
  74. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/policy/__init__.py +0 -0
  75. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/policy/approval_queue.py +0 -0
  76. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/policy/evaluator.py +0 -0
  77. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/policy/handlers.py +0 -0
  78. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/policy/middleware.py +0 -0
  79. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/policy/model.py +0 -0
  80. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/policy/persistence.py +0 -0
  81. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/policy/value_sources.py +0 -0
  82. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/py.typed +0 -0
  83. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/read_only.py +0 -0
  84. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  85. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  86. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  87. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  88. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  89. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  90. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  91. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  92. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  93. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  94. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  95. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  96. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  97. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  98. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  99. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  100. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  101. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  102. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  103. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  104. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  105. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  106. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  107. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  108. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  109. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/settings_ui/__init__.py +0 -0
  110. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
  111. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
  112. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  113. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  114. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  115. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  116. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  117. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  118. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/settings_ui/_theme.py +0 -0
  119. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/settings_ui/settings.css +0 -0
  120. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/settings_ui/settings.html +0 -0
  121. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/settings_ui/settings.js +0 -0
  122. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/smoke_test.py +0 -0
  123. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  124. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/strict_bps.py +0 -0
  125. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/__init__.py +0 -0
  126. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/auto_backup.py +0 -0
  127. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  128. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/component_api.py +0 -0
  129. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  130. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/device_control.py +0 -0
  131. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/enhanced.py +0 -0
  132. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/helpers.py +0 -0
  133. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/radio/__init__.py +0 -0
  134. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/radio/base.py +0 -0
  135. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/radio/matter.py +0 -0
  136. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/radio/thread.py +0 -0
  137. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  138. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/radio/zwave.py +0 -0
  139. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/reference_validator.py +0 -0
  140. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/registry.py +0 -0
  141. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  142. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  143. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  144. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  145. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  146. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  147. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  148. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  149. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  150. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  151. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/tools_updates.py +0 -0
  152. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/util_helpers.py +0 -0
  153. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/tools/validation_middleware.py +0 -0
  154. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/transforms/__init__.py +0 -0
  155. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  156. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/transport_security.py +0 -0
  157. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/update_check.py +0 -0
  158. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/utils/__init__.py +0 -0
  159. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/utils/config_hash.py +0 -0
  160. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/utils/data_paths.py +0 -0
  161. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/utils/domain_handlers.py +0 -0
  162. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  163. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  164. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/utils/operation_manager.py +0 -0
  165. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/utils/python_sandbox.py +0 -0
  166. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/utils/skill_loader.py +0 -0
  167. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/utils/usage_logger.py +0 -0
  168. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/visibility/__init__.py +0 -0
  169. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/visibility/model.py +0 -0
  170. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/visibility/persistence.py +0 -0
  171. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp/visibility/resolver.py +0 -0
  172. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  173. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  174. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  175. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  176. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/tests/__init__.py +0 -0
  177. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/tests/test_constants.py +0 -0
  178. {ha_mcp_dev-7.12.3.dev1932 → ha_mcp_dev-7.12.3.dev1937}/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.12.3.dev1932
3
+ Version: 7.12.3.dev1937
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.12.3.dev1932"
7
+ version = "7.12.3.dev1937"
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
@@ -1349,6 +1349,7 @@ class HomeAssistantSmartMCPServer(EnhancedToolsMixin):
1349
1349
  name=SKILL_TOOL_NAME,
1350
1350
  description=tool_description,
1351
1351
  annotations={
1352
+ "openWorldHint": False,
1352
1353
  "readOnlyHint": True,
1353
1354
  "idempotentHint": True,
1354
1355
  "title": "Get Home Assistant Best Practices Skill Guide",
@@ -89,8 +89,9 @@ TRANSFORM_GENERATED_TOOLS: dict[str, ToolStub] = {}
89
89
  # won't appear in local_provider._list_tools(), so we inject stub entries
90
90
  # into the settings UI so users discover the tool exists and how to enable
91
91
  # it. Keep this dict in sync with the ``"beta"`` tag added to each tool's
92
- # source file (tools_yaml_config.py, tools_filesystem.py, tools_mcp_component.py,
93
- # tools_code.py) — a future rename or removal needs to land in both places.
92
+ # source file (tools_yaml_config.py, tools_yaml_read.py, tools_filesystem.py,
93
+ # tools_mcp_component.py, tools_code.py) — a future rename or removal needs to
94
+ # land in both places.
94
95
  FEATURE_GATED_TOOLS: dict[str, ToolStub] = {
95
96
  "ha_config_set_yaml": {
96
97
  "title": "Set YAML Config",
@@ -99,6 +100,13 @@ FEATURE_GATED_TOOLS: dict[str, ToolStub] = {
99
100
  "disabled_by": "enable_yaml_config_editing",
100
101
  "destructiveHint": True,
101
102
  },
103
+ "ha_config_get_yaml": {
104
+ "title": "Read YAML Config Fragment",
105
+ "primary_tag": "System",
106
+ "description": "Read the YAML fragment under a key in a config file, or find which file defines it.",
107
+ "disabled_by": "enable_filesystem_tools",
108
+ "readOnlyHint": True,
109
+ },
102
110
  "ha_manage_custom_tool": {
103
111
  "title": "Custom Tool",
104
112
  "primary_tag": "System",
@@ -1054,7 +1054,11 @@ def register_backup_tools(
1054
1054
  @mcp.tool(
1055
1055
  description=manage_backup_description,
1056
1056
  tags={"System"},
1057
- annotations={"destructiveHint": True, "title": "Manage Backups"},
1057
+ annotations={
1058
+ "openWorldHint": False,
1059
+ "destructiveHint": True,
1060
+ "title": "Manage Backups",
1061
+ },
1058
1062
  )
1059
1063
  @log_tool_usage
1060
1064
  async def ha_manage_backup(
@@ -2572,6 +2572,7 @@ def register_addon_tools(mcp: Any, client: HomeAssistantClient, **kwargs: Any) -
2572
2572
  @mcp.tool(
2573
2573
  tags={"Add-ons"},
2574
2574
  annotations={
2575
+ "openWorldHint": True,
2575
2576
  "idempotentHint": True,
2576
2577
  "readOnlyHint": True,
2577
2578
  "title": "Get Add-ons",
@@ -2660,6 +2661,7 @@ def register_addon_tools(mcp: Any, client: HomeAssistantClient, **kwargs: Any) -
2660
2661
  @mcp.tool(
2661
2662
  tags={"Add-ons"},
2662
2663
  annotations={
2664
+ "openWorldHint": True,
2663
2665
  "destructiveHint": True,
2664
2666
  "idempotentHint": False,
2665
2667
  "readOnlyHint": False,
@@ -139,6 +139,7 @@ class AreaTools:
139
139
  name="ha_list_floors_areas",
140
140
  tags={"Areas & Floors"},
141
141
  annotations={
142
+ "openWorldHint": False,
142
143
  "idempotentHint": True,
143
144
  "readOnlyHint": True,
144
145
  "title": "List Floors and Areas",
@@ -390,6 +391,7 @@ class AreaTools:
390
391
  name="ha_set_area_or_floor",
391
392
  tags={"Areas & Floors"},
392
393
  annotations={
394
+ "openWorldHint": False,
393
395
  "destructiveHint": True,
394
396
  "title": "Create or Update Area or Floor",
395
397
  },
@@ -640,6 +642,7 @@ class AreaTools:
640
642
  name="ha_remove_area_or_floor",
641
643
  tags={"Areas & Floors"},
642
644
  annotations={
645
+ "openWorldHint": False,
643
646
  "destructiveHint": True,
644
647
  "idempotentHint": True,
645
648
  "title": "Remove Area or Floor",
@@ -76,6 +76,7 @@ class BlueprintTools:
76
76
  name="ha_get_blueprint",
77
77
  tags={"Blueprints"},
78
78
  annotations={
79
+ "openWorldHint": True,
79
80
  "idempotentHint": True,
80
81
  "readOnlyHint": True,
81
82
  "title": "Get Blueprint",
@@ -224,7 +225,11 @@ class BlueprintTools:
224
225
  @tool(
225
226
  name="ha_import_blueprint",
226
227
  tags={"Blueprints"},
227
- annotations={"destructiveHint": True, "title": "Import Blueprint"},
228
+ annotations={
229
+ "openWorldHint": True,
230
+ "destructiveHint": True,
231
+ "title": "Import Blueprint",
232
+ },
228
233
  )
229
234
  @log_tool_usage
230
235
  async def ha_import_blueprint(
@@ -646,6 +646,7 @@ class BugReportTools:
646
646
  name="ha_report_issue",
647
647
  tags={"Utilities"},
648
648
  annotations={
649
+ "openWorldHint": False,
649
650
  "idempotentHint": True,
650
651
  "readOnlyHint": True,
651
652
  "title": "Report Issue or Feedback",
@@ -43,6 +43,7 @@ class CalendarTools:
43
43
  name="ha_config_get_calendar_events",
44
44
  tags={"Calendar"},
45
45
  annotations={
46
+ "openWorldHint": False,
46
47
  "idempotentHint": True,
47
48
  "readOnlyHint": True,
48
49
  "title": "Get Calendar Events",
@@ -282,6 +283,7 @@ class CalendarTools:
282
283
  name="ha_config_set_calendar_event",
283
284
  tags={"Calendar"},
284
285
  annotations={
286
+ "openWorldHint": False,
285
287
  "destructiveHint": True,
286
288
  "title": "Create or Update Calendar Event",
287
289
  },
@@ -426,6 +428,7 @@ class CalendarTools:
426
428
  name="ha_config_remove_calendar_event",
427
429
  tags={"Calendar"},
428
430
  annotations={
431
+ "openWorldHint": False,
429
432
  "destructiveHint": True,
430
433
  "idempotentHint": True,
431
434
  "title": "Remove Calendar Event",
@@ -62,6 +62,7 @@ class CameraTools:
62
62
  name="ha_get_camera_image",
63
63
  tags={"Camera"},
64
64
  annotations={
65
+ "openWorldHint": False,
65
66
  "idempotentHint": True,
66
67
  "readOnlyHint": True,
67
68
  "title": "Get Camera Image",
@@ -38,6 +38,7 @@ class CategoryTools:
38
38
  name="ha_config_get_category",
39
39
  tags={"Labels & Categories"},
40
40
  annotations={
41
+ "openWorldHint": False,
41
42
  "idempotentHint": True,
42
43
  "readOnlyHint": True,
43
44
  "title": "Get Category",
@@ -170,7 +171,11 @@ class CategoryTools:
170
171
  @tool(
171
172
  name="ha_config_set_category",
172
173
  tags={"Labels & Categories"},
173
- annotations={"destructiveHint": True, "title": "Create or Update Category"},
174
+ annotations={
175
+ "openWorldHint": False,
176
+ "destructiveHint": True,
177
+ "title": "Create or Update Category",
178
+ },
174
179
  )
175
180
  @with_auto_backup(
176
181
  domain="category",
@@ -313,6 +318,7 @@ class CategoryTools:
313
318
  name="ha_config_remove_category",
314
319
  tags={"Labels & Categories"},
315
320
  annotations={
321
+ "openWorldHint": False,
316
322
  "destructiveHint": True,
317
323
  "idempotentHint": True,
318
324
  "title": "Remove Category",
@@ -1289,6 +1289,7 @@ def register_code_tools(mcp: Any, client: Any, **kwargs: Any) -> None:
1289
1289
  @mcp.tool(
1290
1290
  tags={"System", "beta"},
1291
1291
  annotations={
1292
+ "openWorldHint": False,
1292
1293
  "title": "Custom Tool",
1293
1294
  "destructiveHint": True,
1294
1295
  "idempotentHint": False,
@@ -340,6 +340,7 @@ class AutomationConfigTools:
340
340
  name="ha_config_get_automation",
341
341
  tags={"Automations"},
342
342
  annotations={
343
+ "openWorldHint": False,
343
344
  "idempotentHint": True,
344
345
  "readOnlyHint": True,
345
346
  "title": "Get Automation Config",
@@ -450,6 +451,7 @@ class AutomationConfigTools:
450
451
  name="ha_config_set_automation",
451
452
  tags={"Automations"},
452
453
  annotations={
454
+ "openWorldHint": False,
453
455
  "destructiveHint": True,
454
456
  "title": "Create or Update Automation",
455
457
  },
@@ -1291,6 +1293,7 @@ class AutomationConfigTools:
1291
1293
  name="ha_config_remove_automation",
1292
1294
  tags={"Automations"},
1293
1295
  annotations={
1296
+ "openWorldHint": False,
1294
1297
  "destructiveHint": True,
1295
1298
  "idempotentHint": True,
1296
1299
  "title": "Remove Automation",
@@ -1259,6 +1259,7 @@ class DashboardConfigTools:
1259
1259
  name="ha_config_get_dashboard",
1260
1260
  tags={"Dashboards"},
1261
1261
  annotations={
1262
+ "openWorldHint": False,
1262
1263
  "destructiveHint": False,
1263
1264
  "idempotentHint": True,
1264
1265
  "title": "Get Dashboard",
@@ -1815,7 +1816,11 @@ class DashboardConfigTools:
1815
1816
  @tool(
1816
1817
  name="ha_config_set_dashboard",
1817
1818
  tags={"Dashboards"},
1818
- annotations={"destructiveHint": True, "title": "Create or Update Dashboard"},
1819
+ annotations={
1820
+ "openWorldHint": False,
1821
+ "destructiveHint": True,
1822
+ "title": "Create or Update Dashboard",
1823
+ },
1819
1824
  )
1820
1825
  @with_auto_backup(domain="dashboard", id_param="url_path")
1821
1826
  @log_tool_usage
@@ -2743,7 +2748,11 @@ class DashboardConfigTools:
2743
2748
  @tool(
2744
2749
  name="ha_config_delete_dashboard",
2745
2750
  tags={"Dashboards"},
2746
- annotations={"destructiveHint": True, "title": "Delete Dashboard"},
2751
+ annotations={
2752
+ "openWorldHint": False,
2753
+ "destructiveHint": True,
2754
+ "title": "Delete Dashboard",
2755
+ },
2747
2756
  )
2748
2757
  @with_auto_backup(domain="dashboard", id_param="url_path")
2749
2758
  @log_tool_usage
@@ -3608,6 +3608,7 @@ class HelperConfigTools:
3608
3608
  name="ha_config_list_helpers",
3609
3609
  tags={"Helper Entities"},
3610
3610
  annotations={
3611
+ "openWorldHint": False,
3611
3612
  "idempotentHint": True,
3612
3613
  "readOnlyHint": True,
3613
3614
  "title": "List Helpers",
@@ -4021,7 +4022,11 @@ class HelperConfigTools:
4021
4022
  @tool(
4022
4023
  name="ha_config_set_helper",
4023
4024
  tags={"Helper Entities"},
4024
- annotations={"destructiveHint": True, "title": "Create or Update Helper"},
4025
+ annotations={
4026
+ "openWorldHint": False,
4027
+ "destructiveHint": True,
4028
+ "title": "Create or Update Helper",
4029
+ },
4025
4030
  )
4026
4031
  @with_auto_backup(
4027
4032
  domain_fn=lambda kw: f"helper_{kw.get('helper_type', 'unknown')}",
@@ -204,6 +204,7 @@ class ConfigSceneTools:
204
204
  name="ha_config_get_scene",
205
205
  tags={"Scenes"},
206
206
  annotations={
207
+ "openWorldHint": False,
207
208
  "idempotentHint": True,
208
209
  "readOnlyHint": True,
209
210
  "title": "Get Scene Config",
@@ -453,6 +454,7 @@ class ConfigSceneTools:
453
454
  name="ha_config_set_scene",
454
455
  tags={"Scenes"},
455
456
  annotations={
457
+ "openWorldHint": False,
456
458
  "destructiveHint": True,
457
459
  "title": "Create or Update Scene",
458
460
  },
@@ -976,6 +978,7 @@ class ConfigSceneTools:
976
978
  name="ha_config_remove_scene",
977
979
  tags={"Scenes"},
978
980
  annotations={
981
+ "openWorldHint": False,
979
982
  "destructiveHint": True,
980
983
  "idempotentHint": True,
981
984
  "title": "Remove Scene",
@@ -99,6 +99,7 @@ class ConfigScriptTools:
99
99
  name="ha_config_get_script",
100
100
  tags={"Scripts"},
101
101
  annotations={
102
+ "openWorldHint": False,
102
103
  "idempotentHint": True,
103
104
  "readOnlyHint": True,
104
105
  "title": "Get Script Config",
@@ -409,6 +410,7 @@ class ConfigScriptTools:
409
410
  name="ha_config_set_script",
410
411
  tags={"Scripts"},
411
412
  annotations={
413
+ "openWorldHint": False,
412
414
  "destructiveHint": True,
413
415
  "title": "Create or Update Script",
414
416
  },
@@ -860,6 +862,7 @@ class ConfigScriptTools:
860
862
  name="ha_config_remove_script",
861
863
  tags={"Scripts"},
862
864
  annotations={
865
+ "openWorldHint": False,
863
866
  "destructiveHint": True,
864
867
  "idempotentHint": True,
865
868
  "title": "Remove Script",
@@ -100,6 +100,7 @@ class DashboardScreenshotTools:
100
100
  name="ha_get_dashboard_screenshot",
101
101
  tags={"Dashboard", "beta"},
102
102
  annotations={
103
+ "openWorldHint": False,
103
104
  "destructiveHint": False,
104
105
  "title": "Get Dashboard Screenshot",
105
106
  },
@@ -456,7 +456,11 @@ class DevTools:
456
456
  @tool(
457
457
  name="ha_dev_manage_settings",
458
458
  tags={"Developer"},
459
- annotations={"title": "Manage Server Settings (dev)", "destructiveHint": True},
459
+ annotations={
460
+ "openWorldHint": False,
461
+ "title": "Manage Server Settings (dev)",
462
+ "destructiveHint": True,
463
+ },
460
464
  )
461
465
  @log_tool_usage
462
466
  async def ha_dev_manage_settings(
@@ -698,7 +702,11 @@ class DevTools:
698
702
  @tool(
699
703
  name="ha_dev_manage_server",
700
704
  tags={"Developer"},
701
- annotations={"title": "Manage MCP Server (dev)", "destructiveHint": True},
705
+ annotations={
706
+ "openWorldHint": True,
707
+ "title": "Manage MCP Server (dev)",
708
+ "destructiveHint": True,
709
+ },
702
710
  )
703
711
  @log_tool_usage
704
712
  async def ha_dev_manage_server(
@@ -370,6 +370,7 @@ class EnergyTools:
370
370
  name="ha_manage_energy_prefs",
371
371
  tags={"Energy"},
372
372
  annotations={
373
+ "openWorldHint": False,
373
374
  "destructiveHint": True,
374
375
  "idempotentHint": False,
375
376
  "title": "Manage Energy Dashboard Preferences",
@@ -1388,6 +1388,7 @@ class EntityTools:
1388
1388
  name="ha_set_entity",
1389
1389
  tags={"Entity Registry"},
1390
1390
  annotations={
1391
+ "openWorldHint": False,
1391
1392
  "destructiveHint": True,
1392
1393
  "idempotentHint": True,
1393
1394
  "title": "Set Entity",
@@ -1723,6 +1724,7 @@ class EntityTools:
1723
1724
  name="ha_get_entity",
1724
1725
  tags={"Entity Registry"},
1725
1726
  annotations={
1727
+ "openWorldHint": False,
1726
1728
  "readOnlyHint": True,
1727
1729
  "idempotentHint": True,
1728
1730
  "title": "Get Entity",
@@ -2014,6 +2016,7 @@ class EntityTools:
2014
2016
  name="ha_remove_entity",
2015
2017
  tags={"Entity Registry"},
2016
2018
  annotations={
2019
+ "openWorldHint": False,
2017
2020
  "destructiveHint": True,
2018
2021
  "idempotentHint": True,
2019
2022
  "title": "Remove Entity",
@@ -74,7 +74,14 @@ CALLER_TOKEN_BOOTSTRAP_SERVICE = "get_caller_token"
74
74
  # ENABLE_YAML_EDIT_CONFIRM, default on); a <0.11.0 component's strict
75
75
  # (PREVENT_EXTRA) schema rejects the unknown arg with a raw voluptuous
76
76
  # error — the gate surfaces an actionable "update" prompt instead.
77
- MIN_COMPONENT_VERSION = "0.11.0"
77
+ # 1.1.0: the YAML fragment read (#1788) needs two component behaviours that a
78
+ # <1.1.0 component reports no differently from a missing key. ``list_files``
79
+ # only now honours the configured packages folder, so ha_config_get_yaml's
80
+ # glob/discovery would otherwise come back "Path not allowed" instead of
81
+ # enumerating packages; and ``include_parsed`` on ``read_file`` is a new arg
82
+ # that an older strict (PREVENT_EXTRA) schema rejects with a raw voluptuous
83
+ # error. The gate turns both into the actionable "update" prompt.
84
+ MIN_COMPONENT_VERSION = "1.1.0"
78
85
 
79
86
 
80
87
  def _version_tuple(version: str) -> tuple[int, ...]:
@@ -371,6 +378,7 @@ class FilesystemTools:
371
378
  name="ha_list_files",
372
379
  tags={"Files", "beta"},
373
380
  annotations={
381
+ "openWorldHint": False,
374
382
  "readOnlyHint": True,
375
383
  "title": "List Files",
376
384
  },
@@ -478,6 +486,7 @@ class FilesystemTools:
478
486
  name="ha_read_file",
479
487
  tags={"Files", "beta"},
480
488
  annotations={
489
+ "openWorldHint": False,
481
490
  "readOnlyHint": True,
482
491
  "title": "Read File",
483
492
  },
@@ -509,6 +518,19 @@ class FilesystemTools:
509
518
  ),
510
519
  ),
511
520
  ] = None,
521
+ yaml_path: Annotated[
522
+ str | None,
523
+ Field(
524
+ default=None,
525
+ description=(
526
+ "Dotted YAML key path (e.g. 'alert2', 'mqtt.sensor'). When "
527
+ "set, the response also carries 'subtree': the round-trip "
528
+ "text of just that key's value. To look a key up across "
529
+ "packages/*.yaml, or to get it as structured data, use "
530
+ "ha_config_get_yaml instead."
531
+ ),
532
+ ),
533
+ ] = None,
512
534
  ) -> dict[str, Any]:
513
535
  """Read a file from the Home Assistant config directory.
514
536
 
@@ -539,6 +561,9 @@ class FilesystemTools:
539
561
  - size: File size in bytes
540
562
  - modified: Last modification timestamp
541
563
  - path: The file path that was read
564
+ - subtree: Round-trip text of the `yaml_path` key, when that arg is set
565
+ (null when the key is absent). Comments and HA tags (`!secret`,
566
+ `!include`) survive as written — a `!secret` is never resolved.
542
567
 
543
568
  **Example:**
544
569
  ```python
@@ -547,6 +572,9 @@ class FilesystemTools:
547
572
 
548
573
  # Read last 100 lines of log
549
574
  result = ha_read_file(path="home-assistant.log", tail_lines=100)
575
+
576
+ # Read just the alert2 block out of a package file
577
+ result = ha_read_file(path="packages/alert2.yaml", yaml_path="alert2")
550
578
  ```
551
579
  """
552
580
  try:
@@ -557,6 +585,8 @@ class FilesystemTools:
557
585
  service_data: dict[str, Any] = {"path": path}
558
586
  if tail_lines is not None:
559
587
  service_data["tail_lines"] = tail_lines
588
+ if yaml_path is not None:
589
+ service_data["yaml_path"] = yaml_path
560
590
 
561
591
  # Call the custom component service
562
592
  result = await call_mcp_tools_service(
@@ -593,6 +623,7 @@ class FilesystemTools:
593
623
  name="ha_write_file",
594
624
  tags={"Files", "beta"},
595
625
  annotations={
626
+ "openWorldHint": False,
596
627
  "destructiveHint": True,
597
628
  "title": "Write File",
598
629
  },
@@ -735,6 +766,7 @@ class FilesystemTools:
735
766
  name="ha_delete_file",
736
767
  tags={"Files", "beta"},
737
768
  annotations={
769
+ "openWorldHint": False,
738
770
  "destructiveHint": True,
739
771
  "title": "Delete File",
740
772
  },
@@ -136,6 +136,7 @@ class GroupTools:
136
136
  name="ha_config_list_groups",
137
137
  tags={"Groups"},
138
138
  annotations={
139
+ "openWorldHint": False,
139
140
  "idempotentHint": True,
140
141
  "readOnlyHint": True,
141
142
  "title": "List Groups",
@@ -210,7 +211,11 @@ class GroupTools:
210
211
  @tool(
211
212
  name="ha_config_set_group",
212
213
  tags={"Groups"},
213
- annotations={"destructiveHint": True, "title": "Create or Update Group"},
214
+ annotations={
215
+ "openWorldHint": False,
216
+ "destructiveHint": True,
217
+ "title": "Create or Update Group",
218
+ },
214
219
  )
215
220
  @with_auto_backup(domain="group", id_param="object_id")
216
221
  @log_tool_usage
@@ -390,6 +395,7 @@ class GroupTools:
390
395
  name="ha_config_remove_group",
391
396
  tags={"Groups"},
392
397
  annotations={
398
+ "openWorldHint": False,
393
399
  "destructiveHint": True,
394
400
  "idempotentHint": True,
395
401
  "title": "Remove Group",
@@ -111,6 +111,7 @@ class HacsTools:
111
111
  name="ha_get_hacs_info",
112
112
  tags={"HACS"},
113
113
  annotations={
114
+ "openWorldHint": True,
114
115
  "idempotentHint": True,
115
116
  "readOnlyHint": True,
116
117
  "title": "Get HACS Info",
@@ -214,6 +215,7 @@ class HacsTools:
214
215
  name="ha_manage_hacs",
215
216
  tags={"HACS"},
216
217
  annotations={
218
+ "openWorldHint": True,
217
219
  "destructiveHint": True,
218
220
  "title": "Manage HACS",
219
221
  },
@@ -127,6 +127,7 @@ class HistoryTools:
127
127
  name="ha_get_history",
128
128
  tags={"History & Statistics"},
129
129
  annotations={
130
+ "openWorldHint": False,
130
131
  "idempotentHint": True,
131
132
  "readOnlyHint": True,
132
133
  "title": "Get Entity History or Statistics",
@@ -292,6 +292,7 @@ class IntegrationTools:
292
292
  name="ha_get_integration",
293
293
  tags={"Integrations"},
294
294
  annotations={
295
+ "openWorldHint": False,
295
296
  "idempotentHint": True,
296
297
  "readOnlyHint": True,
297
298
  "title": "Get Integration",
@@ -1188,7 +1189,11 @@ class IntegrationTools:
1188
1189
  @tool(
1189
1190
  name="ha_set_integration",
1190
1191
  tags={"Integrations"},
1191
- annotations={"destructiveHint": True, "title": "Set Integration"},
1192
+ annotations={
1193
+ "openWorldHint": False,
1194
+ "destructiveHint": True,
1195
+ "title": "Set Integration",
1196
+ },
1192
1197
  )
1193
1198
  @with_auto_backup(domain="integration", id_param="entry_id")
1194
1199
  @log_tool_usage
@@ -1412,6 +1417,7 @@ class IntegrationTools:
1412
1417
  name="ha_remove_helpers_integrations",
1413
1418
  tags={"Helper Entities", "Integrations"},
1414
1419
  annotations={
1420
+ "openWorldHint": False,
1415
1421
  "destructiveHint": True,
1416
1422
  "idempotentHint": True,
1417
1423
  "title": "Remove Helper or Integration",
@@ -35,6 +35,7 @@ class LabelTools:
35
35
  name="ha_config_get_label",
36
36
  tags={"Labels & Categories"},
37
37
  annotations={
38
+ "openWorldHint": False,
38
39
  "idempotentHint": True,
39
40
  "readOnlyHint": True,
40
41
  "title": "Get Label",
@@ -151,7 +152,11 @@ class LabelTools:
151
152
  @tool(
152
153
  name="ha_config_set_label",
153
154
  tags={"Labels & Categories"},
154
- annotations={"destructiveHint": True, "title": "Create or Update Label"},
155
+ annotations={
156
+ "openWorldHint": False,
157
+ "destructiveHint": True,
158
+ "title": "Create or Update Label",
159
+ },
155
160
  )
156
161
  @with_auto_backup(domain="label", id_param="label_id")
157
162
  @log_tool_usage
@@ -289,6 +294,7 @@ class LabelTools:
289
294
  name="ha_config_remove_label",
290
295
  tags={"Labels & Categories"},
291
296
  annotations={
297
+ "openWorldHint": False,
292
298
  "destructiveHint": True,
293
299
  "idempotentHint": True,
294
300
  "title": "Remove Label",
@@ -253,7 +253,11 @@ class McpComponentTools:
253
253
  @tool(
254
254
  name="ha_install_mcp_tools",
255
255
  tags={"Utilities", "beta"},
256
- annotations={"destructiveHint": True, "title": "Install MCP Tools Component"},
256
+ annotations={
257
+ "openWorldHint": True,
258
+ "destructiveHint": True,
259
+ "title": "Install MCP Tools Component",
260
+ },
257
261
  )
258
262
  @log_tool_usage
259
263
  async def ha_install_mcp_tools(
@@ -90,6 +90,7 @@ class RadioTools:
90
90
  name="ha_manage_radio",
91
91
  tags={"Radio Management", "Z-Wave", "Zigbee", "Matter", "Thread"},
92
92
  annotations={
93
+ "openWorldHint": False,
93
94
  "destructiveHint": True,
94
95
  "idempotentHint": False,
95
96
  "title": "Manage Radios (Z-Wave / Zigbee / Matter / Thread)",