ha-mcp-dev 7.7.0.dev694__tar.gz → 7.7.0.dev695__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 (143) hide show
  1. {ha_mcp_dev-7.7.0.dev694/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.7.0.dev695}/PKG-INFO +3 -1
  2. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/README.md +2 -0
  3. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/pyproject.toml +1 -1
  4. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/server.py +7 -0
  5. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/settings_ui.py +8 -2
  6. ha_mcp_dev-7.7.0.dev695/src/ha_mcp/tools/tool_search_hint_middleware.py +99 -0
  7. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695/src/ha_mcp_dev.egg-info}/PKG-INFO +3 -1
  8. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp_dev.egg-info/SOURCES.txt +1 -0
  9. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/LICENSE +0 -0
  10. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/MANIFEST.in +0 -0
  11. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/setup.cfg +0 -0
  12. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/__init__.py +0 -0
  13. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/__main__.py +0 -0
  14. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/_pypi_marker +0 -0
  15. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/_version.py +0 -0
  16. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/auth/__init__.py +0 -0
  17. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/auth/consent_form.py +0 -0
  18. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/auth/provider.py +0 -0
  19. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/backup_manager.py +0 -0
  20. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/client/__init__.py +0 -0
  21. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/client/rest_client.py +0 -0
  22. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/client/supervisor_client.py +0 -0
  23. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/client/websocket_client.py +0 -0
  24. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/client/websocket_listener.py +0 -0
  25. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/config.py +0 -0
  26. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  27. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  28. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  29. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/errors.py +0 -0
  30. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/policy/__init__.py +0 -0
  31. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/policy/approval_queue.py +0 -0
  32. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/policy/evaluator.py +0 -0
  33. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/policy/handlers.py +0 -0
  34. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/policy/middleware.py +0 -0
  35. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/policy/model.py +0 -0
  36. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/policy/persistence.py +0 -0
  37. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/policy/value_sources.py +0 -0
  38. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/py.typed +0 -0
  39. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/read_only.py +0 -0
  40. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  41. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  42. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  43. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  44. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  45. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  46. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  47. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  48. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  49. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  50. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  51. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  52. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  53. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  54. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  55. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  56. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  57. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  58. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  59. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  60. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  61. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  62. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/settings.css +0 -0
  63. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/settings.js +0 -0
  64. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/smoke_test.py +0 -0
  65. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  66. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/__init__.py +0 -0
  67. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/auto_backup.py +0 -0
  68. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/backup.py +0 -0
  69. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  70. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  71. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/device_control.py +0 -0
  72. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/enhanced.py +0 -0
  73. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/helpers.py +0 -0
  74. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/reference_validator.py +0 -0
  75. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/registry.py +0 -0
  76. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  77. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  78. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  79. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  80. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  81. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  82. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  83. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  84. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  85. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_addons.py +0 -0
  86. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_areas.py +0 -0
  87. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  88. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  89. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_calendar.py +0 -0
  90. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_camera.py +0 -0
  91. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_categories.py +0 -0
  92. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_code.py +0 -0
  93. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  94. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  95. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  96. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  97. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  98. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  99. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_energy.py +0 -0
  100. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_entities.py +0 -0
  101. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  102. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_groups.py +0 -0
  103. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_hacs.py +0 -0
  104. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_history.py +0 -0
  105. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_integrations.py +0 -0
  106. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_labels.py +0 -0
  107. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
  108. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_registry.py +0 -0
  109. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_resources.py +0 -0
  110. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_search.py +0 -0
  111. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_service.py +0 -0
  112. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_services.py +0 -0
  113. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_system.py +0 -0
  114. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_themes.py +0 -0
  115. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_todo.py +0 -0
  116. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_traces.py +0 -0
  117. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_updates.py +0 -0
  118. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_utility.py +0 -0
  119. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  120. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  121. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/tools_zones.py +0 -0
  122. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/util_helpers.py +0 -0
  123. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/tools/validation_middleware.py +0 -0
  124. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/transforms/__init__.py +0 -0
  125. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/transforms/categorized_search.py +0 -0
  126. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  127. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/utils/__init__.py +0 -0
  128. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/utils/config_hash.py +0 -0
  129. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/utils/data_paths.py +0 -0
  130. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/utils/domain_handlers.py +0 -0
  131. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  132. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  133. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/utils/operation_manager.py +0 -0
  134. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/utils/python_sandbox.py +0 -0
  135. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/utils/skill_loader.py +0 -0
  136. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp/utils/usage_logger.py +0 -0
  137. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  138. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  139. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  140. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  141. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/tests/__init__.py +0 -0
  142. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/tests/test_constants.py +0 -0
  143. {ha_mcp_dev-7.7.0.dev694 → ha_mcp_dev-7.7.0.dev695}/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.7.0.dev694
3
+ Version: 7.7.0.dev695
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
@@ -349,6 +349,8 @@ The proxy split lets MCP clients apply different permission policies per categor
349
349
 
350
350
  Leave it off when using Claude Sonnet/Opus or any client with deferred tool loading; the full catalog has no idle cost there and direct calls skip the search step. If you choose to use our toolsearch then you should disable the native Claude Opus/Sonnet toolsearch, which is called deferred tools in the settings.
351
351
 
352
+ > 🔄 **Refresh your client's tool list after changing this (or any) setting.** Toggling `ENABLE_TOOL_SEARCH` (or changing pinned/disabled tools, Read Only Mode, etc.) changes the tools the server exposes, but your AI client keeps serving its **cached** tool list until it re-fetches. Restarting the add-on or Home Assistant does **not** refresh the client — reconnect or refresh the MCP server in your client (e.g. re-add/refresh the connector in ChatGPT, or close and reopen Claude Desktop). If you skip this, tools shown as available will return `Unknown tool` when called.
353
+
352
354
  For the HA add-on, the same option is documented in [`homeassistant-addon/DOCS.md`](homeassistant-addon/DOCS.md#enable_tool_search) along with the in-add-on settings UI for fine-grained tool enable/disable/pin.
353
355
 
354
356
  ---
@@ -319,6 +319,8 @@ The proxy split lets MCP clients apply different permission policies per categor
319
319
 
320
320
  Leave it off when using Claude Sonnet/Opus or any client with deferred tool loading; the full catalog has no idle cost there and direct calls skip the search step. If you choose to use our toolsearch then you should disable the native Claude Opus/Sonnet toolsearch, which is called deferred tools in the settings.
321
321
 
322
+ > 🔄 **Refresh your client's tool list after changing this (or any) setting.** Toggling `ENABLE_TOOL_SEARCH` (or changing pinned/disabled tools, Read Only Mode, etc.) changes the tools the server exposes, but your AI client keeps serving its **cached** tool list until it re-fetches. Restarting the add-on or Home Assistant does **not** refresh the client — reconnect or refresh the MCP server in your client (e.g. re-add/refresh the connector in ChatGPT, or close and reopen Claude Desktop). If you skip this, tools shown as available will return `Unknown tool` when called.
323
+
322
324
  For the HA add-on, the same option is documented in [`homeassistant-addon/DOCS.md`](homeassistant-addon/DOCS.md#enable_tool_search) along with the in-add-on settings UI for fine-grained tool enable/disable/pin.
323
325
 
324
326
  ---
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "7.7.0.dev694"
7
+ version = "7.7.0.dev695"
8
8
  description = "Home Assistant MCP Server - Complete control of Home Assistant through MCP"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13,<3.14"
@@ -236,6 +236,13 @@ class HomeAssistantSmartMCPServer(EnhancedToolsMixin):
236
236
 
237
237
  self.mcp.add_middleware(ValidationErrorMiddleware())
238
238
 
239
+ # Replace the opaque "Unknown tool" FastMCP raises when a client calls
240
+ # ha_search_tools / the ha_call_* proxies while Tool Search is off
241
+ # (stale client tool-list cache) with an actionable refresh hint.
242
+ from .tools.tool_search_hint_middleware import ToolSearchHintMiddleware
243
+
244
+ self.mcp.add_middleware(ToolSearchHintMiddleware())
245
+
239
246
  # Read Only Mode write blocker (discussion #1569) — always
240
247
  # installed, consults the live flag per call. Before
241
248
  # PolicyMiddleware so a write blocked by Read Only Mode never
@@ -812,6 +812,10 @@ _SETTINGS_HTML = (
812
812
  <span class="restart-notice-text" id="restartNoticeText">
813
813
  ⚠ Changes saved. Restart ha-mcp for them to take effect — disabled
814
814
  tools will be fully removed from the MCP tool list on next startup.
815
+ Then reconnect or refresh the MCP server in your AI client (e.g.
816
+ re-add/refresh the connector in ChatGPT, or close and reopen Claude
817
+ Desktop) so it reloads the tool list — restarting the add-on or Home
818
+ Assistant does NOT refresh your client's cached tool list.
815
819
  </span>
816
820
  <button class="restart-btn" id="restartBtn" style="display:none">Restart Add-on</button>
817
821
  </div>
@@ -857,8 +861,10 @@ _SETTINGS_HTML = (
857
861
  </div>
858
862
  <div class="panel" id="panel-server">
859
863
  <div class="features-sub">
860
- Tool Search, advanced settings. Changes require an MCP-host restart
861
- to take effect (close + reopen Claude Desktop, restart the add-on, etc.).
864
+ Tool Search, advanced settings. Changes take effect only after you
865
+ restart the add-on (applies the change server-side) AND reconnect or
866
+ refresh the MCP server in your AI client (reloads the tool list) — e.g.
867
+ re-add/refresh the connector in ChatGPT, or close + reopen Claude Desktop.
862
868
  </div>
863
869
 
864
870
  <!-- Two-step note + top Save button. The Save +
@@ -0,0 +1,99 @@
1
+ """FastMCP middleware: actionable error for stale tool-search proxy/search calls.
2
+
3
+ When ``enable_tool_search`` is off, the synthetic tool-search tools —
4
+ ``ha_search_tools`` and the ``ha_call_{read,write,delete}_tool`` proxies — are
5
+ never registered (the ``CategorizedSearchTransform`` is not installed). If a
6
+ client calls one of them anyway, FastMCP raises a bare ``NotFoundError``
7
+ ("Unknown tool: 'ha_search_tools'") with no recovery guidance.
8
+
9
+ That is exactly what happens when an MCP client that caches its tool list is
10
+ still advertising one captured from a previous session when Tool Search was on:
11
+ the client shows ``ha_search_tools`` as available, calls it, and the live
12
+ server — now in Tool-Search-off mode — rejects it. Restarting the add-on or
13
+ Home Assistant does not help because the stale list lives in the client, not
14
+ the server.
15
+
16
+ This middleware intercepts that one case and replaces the opaque "Unknown tool"
17
+ with a structured error that tells the user their tool list is stale and to
18
+ reconnect/refresh the MCP server. It only acts on a *top-level* resolution miss
19
+ for one of those four names while Tool Search is off; in every other case —
20
+ including a ``NotFoundError`` bubbling up from inside an executing tool — the
21
+ original error propagates unchanged.
22
+ """
23
+
24
+ from __future__ import annotations
25
+
26
+ import logging
27
+ from typing import Any
28
+
29
+ from fastmcp.exceptions import NotFoundError
30
+ from fastmcp.server.middleware.middleware import CallNext, Middleware, MiddlewareContext
31
+
32
+ from ..config import get_global_settings
33
+ from ..errors import ErrorCode, create_error_response
34
+ from ..policy.middleware import PROXY_META_TOOLS
35
+ from .helpers import raise_tool_error
36
+
37
+ logger = logging.getLogger(__name__)
38
+
39
+
40
+ class ToolSearchHintMiddleware(Middleware):
41
+ """Turn the opaque "Unknown tool" for tool-search synthetic tools into a
42
+ stale-tool-list hint when Tool Search is disabled."""
43
+
44
+ async def on_call_tool(
45
+ self, context: MiddlewareContext, call_next: CallNext
46
+ ) -> Any:
47
+ try:
48
+ return await call_next(context)
49
+ except NotFoundError as exc:
50
+ name = context.message.name
51
+ # Only rewrite a TOP-LEVEL "Unknown tool" miss for one of the four
52
+ # tool-search synthetic names while Tool Search is off:
53
+ # - match the dispatch-layer message so a NotFoundError bubbling up
54
+ # from INSIDE an executing tool (a different name) is never
55
+ # mislabeled as a stale cache; on any wording change this simply
56
+ # fails closed and re-raises the original error.
57
+ # - require Tool Search to be off (when on, the names resolve, so a
58
+ # miss would be a different, real problem we must not mask).
59
+ top_level_miss = str(exc) == f"Unknown tool: {name!r}"
60
+ if (
61
+ top_level_miss
62
+ and name in PROXY_META_TOOLS
63
+ and not get_global_settings().enable_tool_search
64
+ ):
65
+ logger.info(
66
+ "Stale tool-search call for %r while enable_tool_search is off "
67
+ "- returning refresh-your-tool-list hint",
68
+ name,
69
+ )
70
+ raise_tool_error(
71
+ create_error_response(
72
+ code=ErrorCode.RESOURCE_NOT_FOUND,
73
+ message=(
74
+ f"'{name}' only exists when Tool Search is enabled, and "
75
+ "Tool Search is currently OFF on this ha-mcp server. Your "
76
+ "MCP client is showing a cached tool list from when Tool "
77
+ "Search was on. After changing any ha-mcp setting (Tool "
78
+ "Search, pinned/disabled tools, etc.) the client must "
79
+ "reconnect or refresh the MCP server to re-fetch the "
80
+ "current tools — restarting the add-on or Home Assistant "
81
+ "does not refresh the client's cached list. With Tool "
82
+ f"Search off, every tool is available directly by name, "
83
+ f"so {name} is not needed."
84
+ ),
85
+ suggestions=[
86
+ (
87
+ "Reconnect or refresh the ha-mcp MCP server in your "
88
+ "client to reload the current tool list."
89
+ ),
90
+ (
91
+ "Then call the tool you need directly by its name "
92
+ "(with Tool Search off, ha_search_tools and the "
93
+ "ha_call_* proxies do not exist)."
94
+ ),
95
+ ],
96
+ context={"tool_name": name, "enable_tool_search": False},
97
+ )
98
+ )
99
+ raise
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 7.7.0.dev694
3
+ Version: 7.7.0.dev695
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
@@ -349,6 +349,8 @@ The proxy split lets MCP clients apply different permission policies per categor
349
349
 
350
350
  Leave it off when using Claude Sonnet/Opus or any client with deferred tool loading; the full catalog has no idle cost there and direct calls skip the search step. If you choose to use our toolsearch then you should disable the native Claude Opus/Sonnet toolsearch, which is called deferred tools in the settings.
351
351
 
352
+ > 🔄 **Refresh your client's tool list after changing this (or any) setting.** Toggling `ENABLE_TOOL_SEARCH` (or changing pinned/disabled tools, Read Only Mode, etc.) changes the tools the server exposes, but your AI client keeps serving its **cached** tool list until it re-fetches. Restarting the add-on or Home Assistant does **not** refresh the client — reconnect or refresh the MCP server in your client (e.g. re-add/refresh the connector in ChatGPT, or close and reopen Claude Desktop). If you skip this, tools shown as available will return `Unknown tool` when called.
353
+
352
354
  For the HA add-on, the same option is documented in [`homeassistant-addon/DOCS.md`](homeassistant-addon/DOCS.md#enable_tool_search) along with the in-add-on settings UI for fine-grained tool enable/disable/pin.
353
355
 
354
356
  ---
@@ -68,6 +68,7 @@ src/ha_mcp/tools/enhanced.py
68
68
  src/ha_mcp/tools/helpers.py
69
69
  src/ha_mcp/tools/reference_validator.py
70
70
  src/ha_mcp/tools/registry.py
71
+ src/ha_mcp/tools/tool_search_hint_middleware.py
71
72
  src/ha_mcp/tools/tools_addons.py
72
73
  src/ha_mcp/tools/tools_areas.py
73
74
  src/ha_mcp/tools/tools_blueprints.py