ha-mcp-dev 7.12.3.dev1934__tar.gz → 7.12.3.dev1940__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.dev1934/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.12.3.dev1940}/PKG-INFO +10 -9
  2. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/README.md +9 -8
  3. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/pyproject.toml +1 -1
  4. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/config.py +3 -17
  5. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/settings_ui/_tools_meta.py +8 -8
  6. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/settings_ui/settings.js +0 -4
  7. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_bug_report.py +3 -5
  8. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_dev.py +2 -1
  9. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_filesystem.py +45 -6
  10. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_hacs.py +10 -22
  11. ha_mcp_dev-7.12.3.dev1940/src/ha_mcp/tools/tools_yaml_read.py +336 -0
  12. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940/src/ha_mcp_dev.egg-info}/PKG-INFO +10 -9
  13. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp_dev.egg-info/SOURCES.txt +1 -1
  14. ha_mcp_dev-7.12.3.dev1934/src/ha_mcp/tools/tools_mcp_component.py +0 -410
  15. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/LICENSE +0 -0
  16. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/MANIFEST.in +0 -0
  17. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/setup.cfg +0 -0
  18. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/__init__.py +0 -0
  19. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/__main__.py +0 -0
  20. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/_pypi_marker +0 -0
  21. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/_version.py +0 -0
  22. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/auth/__init__.py +0 -0
  23. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/auth/consent_form.py +0 -0
  24. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/auth/provider.py +0 -0
  25. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/backup_manager.py +0 -0
  26. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/browser_landing.py +0 -0
  27. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/client/__init__.py +0 -0
  28. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/client/rest_client.py +0 -0
  29. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/client/supervisor_client.py +0 -0
  30. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/client/websocket_client.py +0 -0
  31. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/client/websocket_listener.py +0 -0
  32. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  33. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  34. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  35. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  36. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  37. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/errors.py +0 -0
  38. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/llm_exposure.py +0 -0
  39. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/policy/__init__.py +0 -0
  40. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/policy/approval_queue.py +0 -0
  41. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/policy/evaluator.py +0 -0
  42. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/policy/handlers.py +0 -0
  43. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/policy/middleware.py +0 -0
  44. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/policy/model.py +0 -0
  45. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/policy/persistence.py +0 -0
  46. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/policy/value_sources.py +0 -0
  47. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/py.typed +0 -0
  48. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/read_only.py +0 -0
  49. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  50. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  51. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  52. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  53. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  54. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  55. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  56. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  57. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  58. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  59. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  60. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  61. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  62. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  63. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  64. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  65. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  66. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  67. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  68. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  69. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  70. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  71. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  72. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  73. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  74. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/server.py +0 -0
  75. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/settings_ui/__init__.py +0 -0
  76. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
  77. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
  78. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  79. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  80. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  81. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  82. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  83. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  84. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/settings_ui/_theme.py +0 -0
  85. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/settings_ui/settings.css +0 -0
  86. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/settings_ui/settings.html +0 -0
  87. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/smoke_test.py +0 -0
  88. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  89. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/strict_bps.py +0 -0
  90. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/__init__.py +0 -0
  91. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/auto_backup.py +0 -0
  92. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/backup.py +0 -0
  93. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  94. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/component_api.py +0 -0
  95. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  96. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/device_control.py +0 -0
  97. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/enhanced.py +0 -0
  98. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/helpers.py +0 -0
  99. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/radio/__init__.py +0 -0
  100. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/radio/base.py +0 -0
  101. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/radio/matter.py +0 -0
  102. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/radio/thread.py +0 -0
  103. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  104. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/radio/zwave.py +0 -0
  105. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/reference_validator.py +0 -0
  106. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/registry.py +0 -0
  107. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  108. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  109. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  110. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  111. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  112. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  113. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  114. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  115. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  116. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  117. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_addons.py +0 -0
  118. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_areas.py +0 -0
  119. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  120. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_calendar.py +0 -0
  121. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_camera.py +0 -0
  122. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_categories.py +0 -0
  123. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_code.py +0 -0
  124. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  125. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  126. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  127. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  128. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  129. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  130. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_energy.py +0 -0
  131. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_entities.py +0 -0
  132. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_groups.py +0 -0
  133. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_history.py +0 -0
  134. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_integrations.py +0 -0
  135. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_labels.py +0 -0
  136. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_radio.py +0 -0
  137. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_registry.py +0 -0
  138. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_resources.py +0 -0
  139. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_search.py +0 -0
  140. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_service.py +0 -0
  141. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_services.py +0 -0
  142. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_system.py +0 -0
  143. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_themes.py +0 -0
  144. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_todo.py +0 -0
  145. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_traces.py +0 -0
  146. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_updates.py +0 -0
  147. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_utility.py +0 -0
  148. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  149. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  150. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/tools_zones.py +0 -0
  151. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/util_helpers.py +0 -0
  152. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/tools/validation_middleware.py +0 -0
  153. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/transforms/__init__.py +0 -0
  154. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/transforms/categorized_search.py +0 -0
  155. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  156. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/transport_security.py +0 -0
  157. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/update_check.py +0 -0
  158. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/utils/__init__.py +0 -0
  159. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/utils/config_hash.py +0 -0
  160. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/utils/data_paths.py +0 -0
  161. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/utils/domain_handlers.py +0 -0
  162. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  163. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  164. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/utils/operation_manager.py +0 -0
  165. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/utils/python_sandbox.py +0 -0
  166. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/utils/skill_loader.py +0 -0
  167. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/utils/usage_logger.py +0 -0
  168. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/visibility/__init__.py +0 -0
  169. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/visibility/model.py +0 -0
  170. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/visibility/persistence.py +0 -0
  171. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp/visibility/resolver.py +0 -0
  172. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  173. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  174. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  175. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  176. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/tests/__init__.py +0 -0
  177. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/tests/test_constants.py +0 -0
  178. {ha_mcp_dev-7.12.3.dev1934 → ha_mcp_dev-7.12.3.dev1940}/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.dev1934
3
+ Version: 7.12.3.dev1940
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
@@ -41,7 +41,7 @@ Dynamic: license-file
41
41
  <!-- mcp-name: io.github.homeassistant-ai/ha-mcp -->
42
42
 
43
43
  <p align="center">
44
- <img src="https://img.shields.io/badge/tools-87-blue" alt="95+ Tools">
44
+ <img src="https://img.shields.io/badge/tools-88-blue" alt="95+ Tools">
45
45
  <a href="https://github.com/homeassistant-ai/ha-mcp/releases"><img src="https://img.shields.io/github/v/release/homeassistant-ai/ha-mcp" alt="Release"></a>
46
46
  <a href="https://github.com/homeassistant-ai/ha-mcp/actions/workflows/e2e-tests.yml"><img src="https://img.shields.io/github/actions/workflow/status/homeassistant-ai/ha-mcp/e2e-tests.yml?branch=master&label=E2E%20Tests" alt="E2E Tests"></a>
47
47
  <a href="LICENSE.md"><img src="https://img.shields.io/github/license/homeassistant-ai/ha-mcp.svg" alt="License"></a>
@@ -83,12 +83,13 @@ The recommended way to run ha-mcp is the **HA-MCP Custom Component**. It install
83
83
 
84
84
  **Connect URL.** The Configure screen gives you a Home Assistant webhook URL for remote clients — `https://<your-ha-domain>/api/webhook/<webhook-id>` through Nabu Casa or any reverse proxy already pointed at Home Assistant (locally, `http://<ha-host>:8123/api/webhook/<webhook-id>`). For clients on the same network, the server is also reachable directly at `http://<ha-ip>:9584/private_<random>`.
85
85
 
86
+ - **Replaces other install methods:** the in-process server is a complete, standalone ha-mcp install — it takes the place of the add-on, Docker, and uvx/PyPI (stdio) methods. Run only one; do not run the in-process server alongside another install.
86
87
  - **Local only?** Turn off **Remote access via webhook** in the entry options — no webhook is registered at all, while the direct port and sidebar panel keep working.
87
88
  - **Settings panel:** while the server runs, an admin-only **HA-MCP** panel appears in the Home Assistant sidebar for managing tools, feature flags, backups, and themes.
88
89
  - **Optional authentication:** set **Webhook authentication** to `ha_auth` to require a Home Assistant account sign-in instead of using the secret URL as the credential.
89
90
  - **Manual install (no HACS):** copy `custom_components/ha_mcp_tools/` from this repository into your Home Assistant `config/custom_components/` directory, then restart and add the integration as above.
90
91
 
91
- The component's second entry type, **HA MCP Tools**, is only needed if you enable ha-mcp's opt-in file and YAML editing tools (feature flags, off by default) — skip it otherwise; you can add it later at any time.
92
+ The component's second entry type, the **File & YAML services entry** (**HA-MCP File & YAML Tools**), is only needed if you enable ha-mcp's opt-in file and YAML editing tools (feature flags, off by default) — skip it otherwise; you can add it later at any time. It works with any server type (in-process, add-on, Docker, or stdio).
92
93
 
93
94
  [Full in-process server documentation →](docs/in-process-server.md) · [Setup Wizard for client-specific config →](https://homeassistant-ai.github.io/ha-mcp/setup/)
94
95
 
@@ -246,7 +247,7 @@ Spend less time configuring, more time enjoying your smart home.
246
247
  <details>
247
248
  <!-- TOOLS_TABLE_START -->
248
249
 
249
- <summary><b>Complete Tool List (87 tools)</b></summary>
250
+ <summary><b>Complete Tool List (88 tools)</b></summary>
250
251
 
251
252
  | Category | Tools |
252
253
  |----------|-------|
@@ -275,7 +276,7 @@ Spend less time configuring, more time enjoying your smart home.
275
276
  | **Scripts** | `ha_config_get_script`, `ha_config_remove_script`, `ha_config_set_script` |
276
277
  | **Search & Discovery** | `ha_get_overview`, `ha_get_state`, `ha_search` |
277
278
  | **Service & Device Control** | `ha_bulk_control`, `ha_call_event`, `ha_call_service`, `ha_get_operation_status`, `ha_list_services` |
278
- | **System** | `ha_config_set_yaml` *(beta)*, `ha_manage_backup`, `ha_manage_custom_tool` *(beta)*, `ha_manage_theme`, `ha_manage_updates`, `ha_reload_core`, `ha_restart` |
279
+ | **System** | `ha_config_get_yaml` *(beta)*, `ha_config_set_yaml` *(beta)*, `ha_manage_backup`, `ha_manage_custom_tool` *(beta)*, `ha_manage_theme`, `ha_manage_updates`, `ha_reload_core`, `ha_restart` |
279
280
  | **Todo Lists** | `ha_get_todo`, `ha_remove_todo_item`, `ha_set_todo_item` |
280
281
  | **Utilities** | `ha_eval_template`, `ha_install_mcp_tools` *(beta)*, `ha_report_issue` |
281
282
  | **Zones** | `ha_get_zone`, `ha_remove_zone`, `ha_set_zone` |
@@ -307,7 +308,7 @@ ha-mcp is a standalone server built for **configuring, building, and debugging**
307
308
 
308
309
  ## 🔌 Custom Component (ha_mcp_tools) — File & YAML Services
309
310
 
310
- The **HA-MCP Custom Component** also powers a set of privileged tools that standard Home Assistant APIs can't provide: file system access and YAML config editing. (The same component runs the full server in-process — that's the recommended install in the **Get Started** section at the top.) Its **HA MCP Tools** services entry enables the tools below.
311
+ The **HA-MCP Custom Component** also powers a set of privileged tools that standard Home Assistant APIs can't provide: file system access and YAML config editing. (The same component runs the full server in-process — that's the recommended install in the **Get Started** section at the top.) Its **File & YAML services entry** (**HA-MCP File & YAML Tools**) enables the tools below.
311
312
 
312
313
  **Tools that require the component:**
313
314
 
@@ -325,13 +326,13 @@ These tools also require beta feature flags. See **[Beta Features](docs/beta.md)
325
326
 
326
327
  ### Install
327
328
 
328
- Install the **HA MCP Tools** services entry from the same **HA-MCP Custom Component**:
329
+ Install the **HA-MCP File & YAML Tools** entry from the same **HA-MCP Custom Component**:
329
330
 
330
331
  [![Open your Home Assistant instance and open a repository inside the Home Assistant Community Store.](https://my.home-assistant.io/badges/hacs_repository.svg)](https://my.home-assistant.io/redirect/hacs_repository/?owner=homeassistant-ai&repository=ha-mcp-integration&category=integration)
331
332
 
332
333
  To add manually: open **HACS** > **Integrations** > three-dot menu > **Custom repositories** > add `https://github.com/homeassistant-ai/ha-mcp-integration` (category: Integration) > **Download**. Or copy `custom_components/ha_mcp_tools/` from this repository into your HA `config/custom_components/` directory.
333
334
 
334
- After installing, restart Home Assistant, then open **Settings** > **Devices & Services** > **Add Integration**, search for **HA-MCP Custom Component**, and add the **HA MCP Tools** services entry.
335
+ After installing, restart Home Assistant, then open **Settings** > **Devices & Services** > **Add Integration**, search for **HA-MCP Custom Component**, and add the **HA-MCP File & YAML Tools** entry.
335
336
 
336
337
  To run the full ha-mcp server in-process through this same component, see the **Get Started** section at the top and the [full in-process server documentation →](docs/in-process-server.md).
337
338
 
@@ -477,7 +478,7 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
477
478
  - **[@TomasDJo](https://github.com/TomasDJo)** — Category support for automations, scripts, and scenes.
478
479
  - **[@bzelch](https://github.com/bzelch)** — `python_transform` support for automations and scripts.
479
480
  - **[@gcormier](https://github.com/gcormier)** — Windows installer improvements: removed unused variable and fixed terminal closing after install.
480
- - **[@ekobres](https://github.com/ekobres)** — Feature flags for `HAMCP_ENABLE_FILESYSTEM_TOOLS` and `HAMCP_ENABLE_CUSTOM_COMPONENT_INTEGRATION` in the add-on config, with beta tagging in source and docs.
481
+ - **[@ekobres](https://github.com/ekobres)** — Feature flags for `HAMCP_ENABLE_FILESYSTEM_TOOLS` and the (since removed) `HAMCP_ENABLE_CUSTOM_COMPONENT_INTEGRATION` in the add-on config, with beta tagging in source and docs.
481
482
  - **[@w3z315](https://github.com/w3z315)** — Financial support via [GitHub Sponsors](https://github.com/sponsors/julienld). Thank you! ☕
482
483
  - **[@griffinmartin](https://github.com/griffinmartin)** — Added OpenCode (by Anomaly) as a selectable AI client in the setup wizard, with both stdio and streamable HTTP support.
483
484
  - **[@hhopke](https://github.com/hhopke)** — Fixed addon API calls to route through HA Core ingress proxy instead of direct container connections, fixing `ha_manage_addon` proxy mode on addon installs.
@@ -8,7 +8,7 @@
8
8
  <!-- mcp-name: io.github.homeassistant-ai/ha-mcp -->
9
9
 
10
10
  <p align="center">
11
- <img src="https://img.shields.io/badge/tools-87-blue" alt="95+ Tools">
11
+ <img src="https://img.shields.io/badge/tools-88-blue" alt="95+ Tools">
12
12
  <a href="https://github.com/homeassistant-ai/ha-mcp/releases"><img src="https://img.shields.io/github/v/release/homeassistant-ai/ha-mcp" alt="Release"></a>
13
13
  <a href="https://github.com/homeassistant-ai/ha-mcp/actions/workflows/e2e-tests.yml"><img src="https://img.shields.io/github/actions/workflow/status/homeassistant-ai/ha-mcp/e2e-tests.yml?branch=master&label=E2E%20Tests" alt="E2E Tests"></a>
14
14
  <a href="LICENSE.md"><img src="https://img.shields.io/github/license/homeassistant-ai/ha-mcp.svg" alt="License"></a>
@@ -50,12 +50,13 @@ The recommended way to run ha-mcp is the **HA-MCP Custom Component**. It install
50
50
 
51
51
  **Connect URL.** The Configure screen gives you a Home Assistant webhook URL for remote clients — `https://<your-ha-domain>/api/webhook/<webhook-id>` through Nabu Casa or any reverse proxy already pointed at Home Assistant (locally, `http://<ha-host>:8123/api/webhook/<webhook-id>`). For clients on the same network, the server is also reachable directly at `http://<ha-ip>:9584/private_<random>`.
52
52
 
53
+ - **Replaces other install methods:** the in-process server is a complete, standalone ha-mcp install — it takes the place of the add-on, Docker, and uvx/PyPI (stdio) methods. Run only one; do not run the in-process server alongside another install.
53
54
  - **Local only?** Turn off **Remote access via webhook** in the entry options — no webhook is registered at all, while the direct port and sidebar panel keep working.
54
55
  - **Settings panel:** while the server runs, an admin-only **HA-MCP** panel appears in the Home Assistant sidebar for managing tools, feature flags, backups, and themes.
55
56
  - **Optional authentication:** set **Webhook authentication** to `ha_auth` to require a Home Assistant account sign-in instead of using the secret URL as the credential.
56
57
  - **Manual install (no HACS):** copy `custom_components/ha_mcp_tools/` from this repository into your Home Assistant `config/custom_components/` directory, then restart and add the integration as above.
57
58
 
58
- The component's second entry type, **HA MCP Tools**, is only needed if you enable ha-mcp's opt-in file and YAML editing tools (feature flags, off by default) — skip it otherwise; you can add it later at any time.
59
+ The component's second entry type, the **File & YAML services entry** (**HA-MCP File & YAML Tools**), is only needed if you enable ha-mcp's opt-in file and YAML editing tools (feature flags, off by default) — skip it otherwise; you can add it later at any time. It works with any server type (in-process, add-on, Docker, or stdio).
59
60
 
60
61
  [Full in-process server documentation →](docs/in-process-server.md) · [Setup Wizard for client-specific config →](https://homeassistant-ai.github.io/ha-mcp/setup/)
61
62
 
@@ -213,7 +214,7 @@ Spend less time configuring, more time enjoying your smart home.
213
214
  <details>
214
215
  <!-- TOOLS_TABLE_START -->
215
216
 
216
- <summary><b>Complete Tool List (87 tools)</b></summary>
217
+ <summary><b>Complete Tool List (88 tools)</b></summary>
217
218
 
218
219
  | Category | Tools |
219
220
  |----------|-------|
@@ -242,7 +243,7 @@ Spend less time configuring, more time enjoying your smart home.
242
243
  | **Scripts** | `ha_config_get_script`, `ha_config_remove_script`, `ha_config_set_script` |
243
244
  | **Search & Discovery** | `ha_get_overview`, `ha_get_state`, `ha_search` |
244
245
  | **Service & Device Control** | `ha_bulk_control`, `ha_call_event`, `ha_call_service`, `ha_get_operation_status`, `ha_list_services` |
245
- | **System** | `ha_config_set_yaml` *(beta)*, `ha_manage_backup`, `ha_manage_custom_tool` *(beta)*, `ha_manage_theme`, `ha_manage_updates`, `ha_reload_core`, `ha_restart` |
246
+ | **System** | `ha_config_get_yaml` *(beta)*, `ha_config_set_yaml` *(beta)*, `ha_manage_backup`, `ha_manage_custom_tool` *(beta)*, `ha_manage_theme`, `ha_manage_updates`, `ha_reload_core`, `ha_restart` |
246
247
  | **Todo Lists** | `ha_get_todo`, `ha_remove_todo_item`, `ha_set_todo_item` |
247
248
  | **Utilities** | `ha_eval_template`, `ha_install_mcp_tools` *(beta)*, `ha_report_issue` |
248
249
  | **Zones** | `ha_get_zone`, `ha_remove_zone`, `ha_set_zone` |
@@ -274,7 +275,7 @@ ha-mcp is a standalone server built for **configuring, building, and debugging**
274
275
 
275
276
  ## 🔌 Custom Component (ha_mcp_tools) — File & YAML Services
276
277
 
277
- The **HA-MCP Custom Component** also powers a set of privileged tools that standard Home Assistant APIs can't provide: file system access and YAML config editing. (The same component runs the full server in-process — that's the recommended install in the **Get Started** section at the top.) Its **HA MCP Tools** services entry enables the tools below.
278
+ The **HA-MCP Custom Component** also powers a set of privileged tools that standard Home Assistant APIs can't provide: file system access and YAML config editing. (The same component runs the full server in-process — that's the recommended install in the **Get Started** section at the top.) Its **File & YAML services entry** (**HA-MCP File & YAML Tools**) enables the tools below.
278
279
 
279
280
  **Tools that require the component:**
280
281
 
@@ -292,13 +293,13 @@ These tools also require beta feature flags. See **[Beta Features](docs/beta.md)
292
293
 
293
294
  ### Install
294
295
 
295
- Install the **HA MCP Tools** services entry from the same **HA-MCP Custom Component**:
296
+ Install the **HA-MCP File & YAML Tools** entry from the same **HA-MCP Custom Component**:
296
297
 
297
298
  [![Open your Home Assistant instance and open a repository inside the Home Assistant Community Store.](https://my.home-assistant.io/badges/hacs_repository.svg)](https://my.home-assistant.io/redirect/hacs_repository/?owner=homeassistant-ai&repository=ha-mcp-integration&category=integration)
298
299
 
299
300
  To add manually: open **HACS** > **Integrations** > three-dot menu > **Custom repositories** > add `https://github.com/homeassistant-ai/ha-mcp-integration` (category: Integration) > **Download**. Or copy `custom_components/ha_mcp_tools/` from this repository into your HA `config/custom_components/` directory.
300
301
 
301
- After installing, restart Home Assistant, then open **Settings** > **Devices & Services** > **Add Integration**, search for **HA-MCP Custom Component**, and add the **HA MCP Tools** services entry.
302
+ After installing, restart Home Assistant, then open **Settings** > **Devices & Services** > **Add Integration**, search for **HA-MCP Custom Component**, and add the **HA-MCP File & YAML Tools** entry.
302
303
 
303
304
  To run the full ha-mcp server in-process through this same component, see the **Get Started** section at the top and the [full in-process server documentation →](docs/in-process-server.md).
304
305
 
@@ -444,7 +445,7 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
444
445
  - **[@TomasDJo](https://github.com/TomasDJo)** — Category support for automations, scripts, and scenes.
445
446
  - **[@bzelch](https://github.com/bzelch)** — `python_transform` support for automations and scripts.
446
447
  - **[@gcormier](https://github.com/gcormier)** — Windows installer improvements: removed unused variable and fixed terminal closing after install.
447
- - **[@ekobres](https://github.com/ekobres)** — Feature flags for `HAMCP_ENABLE_FILESYSTEM_TOOLS` and `HAMCP_ENABLE_CUSTOM_COMPONENT_INTEGRATION` in the add-on config, with beta tagging in source and docs.
448
+ - **[@ekobres](https://github.com/ekobres)** — Feature flags for `HAMCP_ENABLE_FILESYSTEM_TOOLS` and the (since removed) `HAMCP_ENABLE_CUSTOM_COMPONENT_INTEGRATION` in the add-on config, with beta tagging in source and docs.
448
449
  - **[@w3z315](https://github.com/w3z315)** — Financial support via [GitHub Sponsors](https://github.com/sponsors/julienld). Thank you! ☕
449
450
  - **[@griffinmartin](https://github.com/griffinmartin)** — Added OpenCode (by Anomaly) as a selectable AI client in the setup wizard, with both stdio and streamable HTTP support.
450
451
  - **[@hhopke](https://github.com/hhopke)** — Fixed addon API calls to route through HA Core ingress proxy instead of direct container connections, fixing `ha_manage_addon` proxy mode on addon installs.
@@ -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.dev1934"
7
+ version = "7.12.3.dev1940"
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
@@ -257,14 +257,6 @@ class Settings(BaseSettings):
257
257
  # other gated capability.
258
258
  enable_filesystem_tools: bool = Field(False, alias="HAMCP_ENABLE_FILESYSTEM_TOOLS")
259
259
 
260
- # Custom-component installer (``ha_install_mcp_tools``) — pulls the
261
- # ``ha_mcp_tools`` integration into HACS. Same env-var-direct
262
- # background as ``enable_filesystem_tools``; promoted for the same
263
- # reason.
264
- enable_custom_component_integration: bool = Field(
265
- False, alias="HAMCP_ENABLE_CUSTOM_COMPONENT_INTEGRATION"
266
- )
267
-
268
260
  # Dashboard screenshot mode — the ``ha_get_dashboard_screenshot`` tool
269
261
  # plus the ``include_screenshot`` / ``return_screenshot`` params on the
270
262
  # dashboard get/set tools. Renders responsive Lovelace images via a
@@ -356,15 +348,15 @@ class Settings(BaseSettings):
356
348
  )
357
349
 
358
350
  # Mirror the legacy ``os.getenv("FLAG", "").lower() in ("true", ...)``
359
- # semantics for the two ex-direct-getenv flags: an empty env var
360
- # value MUST be treated as False rather than raising
351
+ # semantics for the ex-direct-getenv ``enable_filesystem_tools`` flag (and
352
+ # its sibling toggles listed above): an empty env var value MUST be treated
353
+ # as False rather than raising
361
354
  # ``ValidationError``. Pydantic v2's bool parser raises on ``""``
362
355
  # which broke ``test_tools_filesystem.py::TestFeatureFlag::
363
356
  # test_disabled_with_empty_string`` after the migration; this
364
357
  # validator restores the contract callers rely on.
365
358
  @field_validator(
366
359
  "enable_filesystem_tools",
367
- "enable_custom_component_integration",
368
360
  "enable_dashboard_screenshot",
369
361
  mode="before",
370
362
  )
@@ -693,11 +685,6 @@ FEATURE_FLAG_FIELDS: tuple[FeatureFlagField, ...] = (
693
685
  FeatureFlagField("enable_yaml_packages_scene", "ENABLE_YAML_PACKAGES_SCENE", bool),
694
686
  FeatureFlagField("enable_lite_docstrings", "ENABLE_LITE_DOCSTRINGS", bool),
695
687
  FeatureFlagField("enable_filesystem_tools", "HAMCP_ENABLE_FILESYSTEM_TOOLS", bool),
696
- FeatureFlagField(
697
- "enable_custom_component_integration",
698
- "HAMCP_ENABLE_CUSTOM_COMPONENT_INTEGRATION",
699
- bool,
700
- ),
701
688
  # ``enable_code_mode`` lives in this tuple so the override file (and
702
689
  # the web UI Server Settings tab) can write the flag. Without this
703
690
  # entry, the UI save logic would have nowhere to land the value.
@@ -744,7 +731,6 @@ BETA_FEATURE_FIELDS: tuple[str, ...] = (
744
731
  "enable_yaml_packages_script",
745
732
  "enable_yaml_packages_scene",
746
733
  "enable_filesystem_tools",
747
- "enable_custom_component_integration",
748
734
  "enable_code_mode",
749
735
  "enable_lite_docstrings",
750
736
  "enable_dashboard_screenshot",
@@ -89,7 +89,7 @@ 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,
92
+ # source file (tools_yaml_config.py, tools_yaml_read.py, tools_filesystem.py,
93
93
  # tools_code.py) — a future rename or removal needs to land in both places.
94
94
  FEATURE_GATED_TOOLS: dict[str, ToolStub] = {
95
95
  "ha_config_set_yaml": {
@@ -99,6 +99,13 @@ FEATURE_GATED_TOOLS: dict[str, ToolStub] = {
99
99
  "disabled_by": "enable_yaml_config_editing",
100
100
  "destructiveHint": True,
101
101
  },
102
+ "ha_config_get_yaml": {
103
+ "title": "Read YAML Config Fragment",
104
+ "primary_tag": "System",
105
+ "description": "Read the YAML fragment under a key in a config file, or find which file defines it.",
106
+ "disabled_by": "enable_filesystem_tools",
107
+ "readOnlyHint": True,
108
+ },
102
109
  "ha_manage_custom_tool": {
103
110
  "title": "Custom Tool",
104
111
  "primary_tag": "System",
@@ -134,13 +141,6 @@ FEATURE_GATED_TOOLS: dict[str, ToolStub] = {
134
141
  "disabled_by": "enable_filesystem_tools",
135
142
  "destructiveHint": True,
136
143
  },
137
- "ha_install_mcp_tools": {
138
- "title": "Install MCP Tools Component",
139
- "primary_tag": "Utilities",
140
- "description": "Install the ha_mcp_tools custom component via HACS.",
141
- "disabled_by": "enable_custom_component_integration",
142
- "destructiveHint": True,
143
- },
144
144
  }
145
145
 
146
146
 
@@ -1616,10 +1616,6 @@ const FEATURE_META = {
1616
1616
  label: "Enable filesystem tools (beta)",
1617
1617
  help: "Sets HAMCP_ENABLE_FILESYSTEM_TOOLS=true. Enables direct file read/write access to your Home Assistant filesystem. WARNING: This gives the MCP server sensitive direct file access to your system. Only enable if you trust the AI assistant with file operations. Requires restart to take effect.",
1618
1618
  },
1619
- enable_custom_component_integration: {
1620
- label: "Enable custom component integration (beta)",
1621
- help: "Sets HAMCP_ENABLE_CUSTOM_COMPONENT_INTEGRATION=true. Enables the ha_install_mcp_tools installer tool, which can help install the ha_mcp_tools custom component. This setting does not control whether the MCP server loads or interacts with the custom component, and it is not required for filesystem tools to function. Only enable if you want to allow the AI assistant to use the installer tool. Requires restart to take effect.",
1622
- },
1623
1619
  enable_code_mode: {
1624
1620
  label: "Enable code-mode sandbox (beta)",
1625
1621
  help: "Beta feature, disabled by default. Enables ha_manage_custom_tool, a sandboxed Python interpreter (pydantic-monty) that lets AI assistants write/run/save/delete custom tools when no built-in tool covers the request. Sandbox cannot touch the filesystem or arbitrary network, but CAN call any registered MCP tool, hit the HA REST API, or send HA WebSocket commands, effectively 'do whatever existing tools allow you to do, in any combination'. Saved tools persist and are visible to any client that can connect to ha-mcp. See docs/beta.md for known limitations. Requires restart to take effect.",
@@ -211,10 +211,9 @@ def _detect_platform() -> dict[str, str]:
211
211
  # ``enable_beta_features`` leads the list because it is the master gate: when
212
212
  # off it force-disables every beta sub-flag (filesystem tools, code mode, YAML
213
213
  # editing, ...) regardless of the sub-flag's own value, so a "missing tool"
214
- # report is meaningless without it. ``enable_filesystem_tools`` and
215
- # ``enable_custom_component_integration`` are the exact beta-gated tool families
216
- # from issue #1804 — surfacing them lets triage see at a glance whether the tool
217
- # the user couldn't find was even enabled server-side.
214
+ # report is meaningless without it. ``enable_filesystem_tools`` is a beta-gated
215
+ # tool family from issue #1804 — surfacing it lets triage see at a glance whether
216
+ # the tool the user couldn't find was even enabled server-side.
218
217
  _CONFIG_TOGGLE_FIELDS: tuple[str, ...] = (
219
218
  "enable_beta_features",
220
219
  "enable_websocket",
@@ -223,7 +222,6 @@ _CONFIG_TOGGLE_FIELDS: tuple[str, ...] = (
223
222
  "tool_search_max_results",
224
223
  "enable_yaml_config_editing",
225
224
  "enable_filesystem_tools",
226
- "enable_custom_component_integration",
227
225
  "enable_code_mode",
228
226
  "enabled_tool_modules",
229
227
  )
@@ -126,7 +126,8 @@ async def find_server_config_entry(
126
126
 
127
127
  Probes each ``ha_mcp_tools`` entry's options flow: the server entry's
128
128
  flow is a form whose schema carries the ``pip_spec`` field; the tools
129
- (services) entry's flow aborts immediately. Returns
129
+ (services) entry's flow is an informational form with no ``pip_spec``
130
+ field, so it never matches. Returns
130
131
  ``(entry_id, open_flow, current_options)`` with the options flow left
131
132
  OPEN (callers must submit or abort it), or ``None`` when no server
132
133
  entry exists. ``current_options`` maps schema field names to their current
@@ -7,8 +7,10 @@ configuration directory, enabling AI assistants to:
7
7
  - List files in allowed directories
8
8
  - Write/delete files in restricted directories (www/, themes/, custom_templates/)
9
9
 
10
- **Dependency:** Requires the ha_mcp_tools custom component to be installed.
11
- The tools will gracefully fail with installation instructions if the component is not available.
10
+ **Dependency:** Requires the ha_mcp_tools custom component, added in HA via its
11
+ "HA-MCP File & YAML Tools" config entry (NOT the "HA-MCP Server" entry, which
12
+ starts a redundant in-process server). The tools will gracefully fail with
13
+ installation instructions if the component is not available.
12
14
 
13
15
  Feature Flag: Set HAMCP_ENABLE_FILESYSTEM_TOOLS=true to enable these tools.
14
16
  """
@@ -74,7 +76,14 @@ CALLER_TOKEN_BOOTSTRAP_SERVICE = "get_caller_token"
74
76
  # ENABLE_YAML_EDIT_CONFIRM, default on); a <0.11.0 component's strict
75
77
  # (PREVENT_EXTRA) schema rejects the unknown arg with a raw voluptuous
76
78
  # error — the gate surfaces an actionable "update" prompt instead.
77
- MIN_COMPONENT_VERSION = "0.11.0"
79
+ # 1.1.0: the YAML fragment read (#1788) needs two component behaviours that a
80
+ # <1.1.0 component reports no differently from a missing key. ``list_files``
81
+ # only now honours the configured packages folder, so ha_config_get_yaml's
82
+ # glob/discovery would otherwise come back "Path not allowed" instead of
83
+ # enumerating packages; and ``include_parsed`` on ``read_file`` is a new arg
84
+ # that an older strict (PREVENT_EXTRA) schema rejects with a raw voluptuous
85
+ # error. The gate turns both into the actionable "update" prompt.
86
+ MIN_COMPONENT_VERSION = "1.1.0"
78
87
 
79
88
 
80
89
  def _version_tuple(version: str) -> tuple[int, ...]:
@@ -134,7 +143,7 @@ def _raise_component_too_old(detail: str) -> NoReturn:
134
143
  f"This ha-mcp release requires >= {MIN_COMPONENT_VERSION}. "
135
144
  "Update via HACS and restart Home Assistant.",
136
145
  suggestions=[
137
- "HACS → Integrations → HA MCP Tools → Update",
146
+ "HACS → Integrations → HA-MCP Custom Component → Update",
138
147
  "Restart Home Assistant after update completes",
139
148
  "Then retry the operation",
140
149
  ],
@@ -355,8 +364,17 @@ async def _assert_mcp_tools_available(client: Any) -> None:
355
364
  raise_tool_error(
356
365
  create_error_response(
357
366
  ErrorCode.COMPONENT_NOT_INSTALLED,
358
- f"The {MCP_TOOLS_DOMAIN} custom component is not installed. "
359
- "Use ha_install_mcp_tools() to install it via HACS, then restart Home Assistant.",
367
+ f"The {MCP_TOOLS_DOMAIN} custom component is not installed.",
368
+ suggestions=[
369
+ 'Add the repository to HACS: ha_manage_hacs(action="add_repository",'
370
+ + ' repository="homeassistant-ai/ha-mcp-integration", category="integration")',
371
+ 'Download the component: ha_manage_hacs(action="download",'
372
+ + ' repository_id="homeassistant-ai/ha-mcp-integration")',
373
+ "Restart Home Assistant (ha_restart) so the integration loads",
374
+ 'In HA, add the "HA-MCP Custom Component" integration and choose the'
375
+ + ' "HA-MCP File & YAML Tools" entry — NOT "HA-MCP Server", which starts'
376
+ + " a second in-process server this ha-mcp server does not need",
377
+ ],
360
378
  )
361
379
  )
362
380
 
@@ -511,6 +529,19 @@ class FilesystemTools:
511
529
  ),
512
530
  ),
513
531
  ] = None,
532
+ yaml_path: Annotated[
533
+ str | None,
534
+ Field(
535
+ default=None,
536
+ description=(
537
+ "Dotted YAML key path (e.g. 'alert2', 'mqtt.sensor'). When "
538
+ "set, the response also carries 'subtree': the round-trip "
539
+ "text of just that key's value. To look a key up across "
540
+ "packages/*.yaml, or to get it as structured data, use "
541
+ "ha_config_get_yaml instead."
542
+ ),
543
+ ),
544
+ ] = None,
514
545
  ) -> dict[str, Any]:
515
546
  """Read a file from the Home Assistant config directory.
516
547
 
@@ -541,6 +572,9 @@ class FilesystemTools:
541
572
  - size: File size in bytes
542
573
  - modified: Last modification timestamp
543
574
  - path: The file path that was read
575
+ - subtree: Round-trip text of the `yaml_path` key, when that arg is set
576
+ (null when the key is absent). Comments and HA tags (`!secret`,
577
+ `!include`) survive as written — a `!secret` is never resolved.
544
578
 
545
579
  **Example:**
546
580
  ```python
@@ -549,6 +583,9 @@ class FilesystemTools:
549
583
 
550
584
  # Read last 100 lines of log
551
585
  result = ha_read_file(path="home-assistant.log", tail_lines=100)
586
+
587
+ # Read just the alert2 block out of a package file
588
+ result = ha_read_file(path="packages/alert2.yaml", yaml_path="alert2")
552
589
  ```
553
590
  """
554
591
  try:
@@ -559,6 +596,8 @@ class FilesystemTools:
559
596
  service_data: dict[str, Any] = {"path": path}
560
597
  if tail_lines is not None:
561
598
  service_data["tail_lines"] = tail_lines
599
+ if yaml_path is not None:
600
+ service_data["yaml_path"] = yaml_path
562
601
 
563
602
  # Call the custom component service
564
603
  result = await call_mcp_tools_service(
@@ -685,21 +685,10 @@ def _filter_and_score_repos(
685
685
  # load-bearing contract is this signal name, not where it's defined.
686
686
  HACS_REPOSITORY_SIGNAL = "hacs_dispatch_repository"
687
687
 
688
- # Wall-clock budget for ``wait_for_repo_registration``. Generous
689
- # because the constraint is "HACS finishes registration": adding a
690
- # fresh repo makes HACS clone/index it over the network, which on a
691
- # slow link (or a loaded HAOS E2E runner) can exceed 30 s — the prior
692
- # value, which flaked ``test_install_mcp_tools_*`` with "Could not
693
- # find repository ID after adding". The subscription nudges us the
694
- # instant registration lands, so the happy path returns in seconds and
695
- # this larger cap only ever costs wall-clock on a genuinely slow add.
696
- HACS_REPO_REGISTRATION_TIMEOUT = 60.0
697
-
698
- # Budget for the initial ``hacs/subscribe`` ack. Smaller than the
699
- # overall registration timeout so a slow subscribe doesn't consume
700
- # the whole budget before any ``queue.get()`` runs — subscribe acks
701
- # return in milliseconds in practice, so 10 s is generous and still
702
- # leaves 20 s of headroom for the queue wait.
688
+ # Budget for the initial ``hacs/subscribe`` ack, separate from the
689
+ # caller-supplied registration budget so a slow subscribe surfaces as
690
+ # its own failure instead of silently consuming the wait — subscribe
691
+ # acks return in milliseconds in practice, so 10 s is generous.
703
692
  HACS_SUBSCRIBE_TIMEOUT = 10.0
704
693
 
705
694
  # Backstop poll cadence inside ``wait_for_repo_registration`` —
@@ -720,11 +709,11 @@ HACS_ADD_REGISTRATION_TIMEOUT = 10.0
720
709
 
721
710
  # Wall-clock budget for ``_resolve_hacs_repo_id`` (the ``owner/repo`` lookup
722
711
  # behind read-only ``ha_get_hacs_info(action="info")`` and
723
- # ``ha_manage_hacs(action="download")``). Unlike ``ha_install_mcp_tools`` —
724
- # which adds a repo and then waits the full ``HACS_REPO_REGISTRATION_TIMEOUT``
725
- # for that fresh registration to land — a plain info/download lookup targets a
712
+ # ``ha_manage_hacs(action="download")``). A plain info/download lookup targets a
726
713
  # repo that should ALREADY be in HACS's index: default repos always are, and
727
- # ``add_repository`` blocks until registration is confirmed before returning.
714
+ # ``ha_manage_hacs(action="add_repository")`` blocks until registration is
715
+ # confirmed before returning (within its own ``HACS_ADD_REGISTRATION_TIMEOUT``
716
+ # budget).
728
717
  # So the post-subscribe sample resolves an existing repo instantly, and the
729
718
  # dispatch-signal wait only ever burns wall-clock when the repo is genuinely
730
719
  # absent. The old 30 s budget made every not-found lookup a 30 s stall (the
@@ -878,7 +867,7 @@ async def wait_for_repo_registration(
878
867
  ws_client: Any,
879
868
  full_name: str,
880
869
  *,
881
- timeout: float = HACS_REPO_REGISTRATION_TIMEOUT,
870
+ timeout: float,
882
871
  backstop_poll_interval: float = HACS_REPO_BACKSTOP_POLL_INTERVAL,
883
872
  ) -> dict[str, Any] | None:
884
873
  """Wait for a HACS repo to register, using HACS' dispatch signal.
@@ -975,8 +964,7 @@ async def _resolve_hacs_repo_id(ws_client: Any, repository_id: str) -> tuple[str
975
964
  For GitHub-path identifiers, this uses the HACS dispatch-signal
976
965
  waiter so that a caller running immediately after
977
966
  ``ha_manage_hacs(action="add_repository")`` doesn't race against
978
- HACS' internal registration — the same flake class that affected
979
- ``ha_install_mcp_tools``.
967
+ HACS' internal registration.
980
968
  """
981
969
  if "/" not in repository_id:
982
970
  return repository_id, repository_id