ha-mcp-dev 7.1.0.dev304__tar.gz → 7.1.0.dev306__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 (99) hide show
  1. {ha_mcp_dev-7.1.0.dev304/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.1.0.dev306}/PKG-INFO +29 -25
  2. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/README.md +28 -24
  3. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/pyproject.toml +1 -1
  4. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/backup.py +2 -2
  5. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/tools_addons.py +10 -8
  6. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/tools_areas.py +6 -6
  7. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/tools_blueprints.py +2 -2
  8. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/tools_bug_report.py +2 -2
  9. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/tools_calendar.py +3 -3
  10. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/tools_camera.py +1 -1
  11. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/tools_categories.py +6 -6
  12. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/tools_config_automations.py +6 -6
  13. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/tools_config_dashboards.py +8 -8
  14. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/tools_config_entry_flow.py +4 -4
  15. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/tools_config_helpers.py +6 -6
  16. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/tools_config_scripts.py +6 -6
  17. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/tools_entities.py +4 -4
  18. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/tools_filesystem.py +8 -8
  19. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/tools_groups.py +3 -3
  20. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/tools_hacs.py +6 -6
  21. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/tools_history.py +2 -2
  22. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/tools_integrations.py +6 -6
  23. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/tools_labels.py +3 -3
  24. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/tools_mcp_component.py +2 -2
  25. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/tools_registry.py +8 -7
  26. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/tools_resources.py +6 -6
  27. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/tools_search.py +10 -10
  28. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/tools_service.py +4 -4
  29. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/tools_services.py +1 -1
  30. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/tools_system.py +4 -4
  31. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/tools_todo.py +4 -4
  32. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/tools_traces.py +1 -1
  33. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/tools_updates.py +1 -1
  34. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/tools_utility.py +4 -4
  35. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/tools_voice_assistant.py +2 -1
  36. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/tools_zones.py +3 -3
  37. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306/src/ha_mcp_dev.egg-info}/PKG-INFO +29 -25
  38. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/LICENSE +0 -0
  39. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/MANIFEST.in +0 -0
  40. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/setup.cfg +0 -0
  41. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/__init__.py +0 -0
  42. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/__main__.py +0 -0
  43. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/_pypi_marker +0 -0
  44. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/auth/__init__.py +0 -0
  45. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/auth/consent_form.py +0 -0
  46. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/auth/provider.py +0 -0
  47. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/client/__init__.py +0 -0
  48. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/client/rest_client.py +0 -0
  49. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/client/websocket_client.py +0 -0
  50. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/client/websocket_listener.py +0 -0
  51. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/config.py +0 -0
  52. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/errors.py +0 -0
  53. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/py.typed +0 -0
  54. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  55. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  56. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  57. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  58. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  59. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  60. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  61. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  62. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  63. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  64. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  65. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  66. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  67. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  68. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  69. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  70. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  71. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  72. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  73. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  74. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/server.py +0 -0
  75. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/smoke_test.py +0 -0
  76. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/__init__.py +0 -0
  77. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  78. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/device_control.py +0 -0
  79. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/enhanced.py +0 -0
  80. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/helpers.py +0 -0
  81. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/registry.py +0 -0
  82. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/smart_search.py +0 -0
  83. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/tools/util_helpers.py +0 -0
  84. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/transforms/__init__.py +0 -0
  85. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/transforms/categorized_search.py +0 -0
  86. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/utils/__init__.py +0 -0
  87. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/utils/domain_handlers.py +0 -0
  88. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  89. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/utils/operation_manager.py +0 -0
  90. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/utils/python_sandbox.py +0 -0
  91. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp/utils/usage_logger.py +0 -0
  92. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  93. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  94. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  95. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  96. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  97. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/tests/__init__.py +0 -0
  98. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/tests/test_constants.py +0 -0
  99. {ha_mcp_dev-7.1.0.dev304 → ha_mcp_dev-7.1.0.dev306}/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.1.0.dev304
3
+ Version: 7.1.0.dev306
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
@@ -37,7 +37,7 @@ Dynamic: license-file
37
37
  <!-- mcp-name: io.github.homeassistant-ai/ha-mcp -->
38
38
 
39
39
  <p align="center">
40
- <img src="https://img.shields.io/badge/tools-95+-blue" alt="95+ Tools">
40
+ <img src="https://img.shields.io/badge/tools-93-blue" alt="95+ Tools">
41
41
  <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>
42
42
  <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>
43
43
  <a href="LICENSE.md"><img src="https://img.shields.io/github/license/homeassistant-ai/ha-mcp.svg" alt="License"></a>
@@ -158,33 +158,37 @@ Spend less time configuring, more time enjoying your smart home.
158
158
  | **💾 System** | Backup/restore, updates, add-ons, device registry |
159
159
 
160
160
  <details>
161
- <summary><b>🛠️ Complete Tool List (97 tools)</b></summary>
161
+ <!-- TOOLS_TABLE_START -->
162
+
163
+ <summary><b>Complete Tool List (93 tools)</b></summary>
162
164
 
163
165
  | Category | Tools |
164
166
  |----------|-------|
165
- | **Search & Discovery** | `ha_search_entities`, `ha_deep_search`, `ha_get_overview`, `ha_get_state` |
166
- | **Service & Device Control** | `ha_call_service`, `ha_bulk_control`, `ha_get_operation_status`, `ha_get_bulk_status`, `ha_list_services` |
167
- | **Automations** | `ha_config_get_automation`, `ha_config_set_automation`, `ha_config_remove_automation` |
168
- | **Scripts** | `ha_config_get_script`, `ha_config_set_script`, `ha_config_remove_script` |
169
- | **Helper Entities** | `ha_config_list_helpers`, `ha_config_set_helper`, `ha_config_remove_helper` |
170
- | **Dashboards** | `ha_config_get_dashboard`, `ha_config_set_dashboard`, `ha_config_delete_dashboard` + dashboard skill references |
171
- | **Areas & Floors** | `ha_config_list_areas`, `ha_config_set_area`, `ha_config_remove_area`, `ha_config_list_floors`, `ha_config_set_floor`, `ha_config_remove_floor` |
172
- | **Labels** | `ha_config_get_label`, `ha_config_set_label`, `ha_config_remove_label`, `ha_manage_entity_labels` |
173
- | **Zones** | `ha_get_zone`, `ha_set_zone`, `ha_remove_zone` |
174
- | **Groups** | `ha_config_list_groups`, `ha_config_set_group`, `ha_config_remove_group` |
175
- | **Todo Lists** | `ha_get_todo`, `ha_add_todo_item`, `ha_update_todo_item`, `ha_remove_todo_item` |
176
- | **Calendar** | `ha_config_get_calendar_events`, `ha_config_set_calendar_event`, `ha_config_remove_calendar_event` |
177
- | **Blueprints** | `ha_list_blueprints`, `ha_get_blueprint`, `ha_import_blueprint` |
178
- | **Device Registry** | `ha_get_device`, `ha_update_device`, `ha_remove_device`, `ha_rename_entity` |
179
- | **ZHA & Integrations** | `ha_get_zha_devices`, `ha_get_entity_integration_source` |
180
- | **Add-ons** | `ha_get_addon`, `ha_call_addon_api` (HTTP & WebSocket, direct port access) |
167
+ | **Add-ons** | `ha_call_addon_api`, `ha_get_addon` |
168
+ | **Areas & Floors** | `ha_config_list_areas`, `ha_config_list_floors`, `ha_config_remove_area`, `ha_config_remove_floor`, `ha_config_set_area`, `ha_config_set_floor` |
169
+ | **Automations** | `ha_config_get_automation`, `ha_config_remove_automation`, `ha_config_set_automation` |
170
+ | **Blueprints** | `ha_get_blueprint`, `ha_import_blueprint` |
171
+ | **Calendar** | `ha_config_get_calendar_events`, `ha_config_remove_calendar_event`, `ha_config_set_calendar_event` |
181
172
  | **Camera** | `ha_get_camera_image` |
182
- | **History & Statistics** | `ha_get_history`, `ha_get_statistics` |
183
- | **Automation Traces** | `ha_get_automation_traces` |
184
- | **System & Updates** | `ha_check_config`, `ha_restart`, `ha_reload_core`, `ha_get_system_info`, `ha_get_system_health`, `ha_get_updates` |
185
- | **Backup & Restore** | `ha_backup_create`, `ha_backup_restore` |
186
- | **Utility** | `ha_get_logbook`, `ha_eval_template`, `ha_get_integration` |
187
-
173
+ | **Dashboards** | `ha_config_delete_dashboard_resource`, `ha_config_delete_dashboard`, `ha_config_get_dashboard`, `ha_config_list_dashboard_resources`, `ha_config_set_dashboard_resource`, `ha_config_set_dashboard`, `ha_dashboard_find_card` |
174
+ | **Device Registry** | `ha_get_device`, `ha_remove_device`, `ha_rename_entity_and_device`, `ha_rename_entity`, `ha_update_device` |
175
+ | **Entity Registry** | `ha_get_entity_exposure`, `ha_get_entity`, `ha_set_entity` |
176
+ | **Files** | `ha_delete_file`, `ha_list_files`, `ha_read_file`, `ha_write_file` |
177
+ | **Groups** | `ha_config_list_groups`, `ha_config_remove_group`, `ha_config_set_group` |
178
+ | **HACS** | `ha_hacs_add_repository`, `ha_hacs_download`, `ha_hacs_info`, `ha_hacs_list_installed`, `ha_hacs_repository_info`, `ha_hacs_search` |
179
+ | **Helper Entities** | `ha_config_list_helpers`, `ha_config_remove_helper`, `ha_config_set_helper`, `ha_get_helper_schema`, `ha_set_config_entry_helper` |
180
+ | **History & Statistics** | `ha_get_automation_traces`, `ha_get_history`, `ha_get_logbook`, `ha_get_statistics` |
181
+ | **Integrations** | `ha_delete_config_entry`, `ha_get_integration`, `ha_set_integration_enabled` |
182
+ | **Labels & Categories** | `ha_config_get_category`, `ha_config_get_label`, `ha_config_remove_category`, `ha_config_remove_label`, `ha_config_set_category`, `ha_config_set_label` |
183
+ | **Scripts** | `ha_config_get_script`, `ha_config_remove_script`, `ha_config_set_script` |
184
+ | **Search & Discovery** | `ha_deep_search`, `ha_get_overview`, `ha_get_state`, `ha_get_states`, `ha_search_entities` |
185
+ | **Service & Device Control** | `ha_bulk_control`, `ha_call_service`, `ha_get_bulk_status`, `ha_get_operation_status`, `ha_list_services` |
186
+ | **System** | `ha_backup_create`, `ha_backup_restore`, `ha_check_config`, `ha_get_system_health`, `ha_get_updates`, `ha_reload_core`, `ha_restart` |
187
+ | **Todo Lists** | `ha_add_todo_item`, `ha_get_todo`, `ha_remove_todo_item`, `ha_update_todo_item` |
188
+ | **Utilities** | `ha_eval_template`, `ha_install_mcp_tools`, `ha_report_issue` |
189
+ | **Zones** | `ha_get_zone`, `ha_remove_zone`, `ha_set_zone` |
190
+
191
+ <!-- TOOLS_TABLE_END -->
188
192
  </details>
189
193
 
190
194
  ---
@@ -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-95+-blue" alt="95+ Tools">
11
+ <img src="https://img.shields.io/badge/tools-93-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>
@@ -129,33 +129,37 @@ Spend less time configuring, more time enjoying your smart home.
129
129
  | **💾 System** | Backup/restore, updates, add-ons, device registry |
130
130
 
131
131
  <details>
132
- <summary><b>🛠️ Complete Tool List (97 tools)</b></summary>
132
+ <!-- TOOLS_TABLE_START -->
133
+
134
+ <summary><b>Complete Tool List (93 tools)</b></summary>
133
135
 
134
136
  | Category | Tools |
135
137
  |----------|-------|
136
- | **Search & Discovery** | `ha_search_entities`, `ha_deep_search`, `ha_get_overview`, `ha_get_state` |
137
- | **Service & Device Control** | `ha_call_service`, `ha_bulk_control`, `ha_get_operation_status`, `ha_get_bulk_status`, `ha_list_services` |
138
- | **Automations** | `ha_config_get_automation`, `ha_config_set_automation`, `ha_config_remove_automation` |
139
- | **Scripts** | `ha_config_get_script`, `ha_config_set_script`, `ha_config_remove_script` |
140
- | **Helper Entities** | `ha_config_list_helpers`, `ha_config_set_helper`, `ha_config_remove_helper` |
141
- | **Dashboards** | `ha_config_get_dashboard`, `ha_config_set_dashboard`, `ha_config_delete_dashboard` + dashboard skill references |
142
- | **Areas & Floors** | `ha_config_list_areas`, `ha_config_set_area`, `ha_config_remove_area`, `ha_config_list_floors`, `ha_config_set_floor`, `ha_config_remove_floor` |
143
- | **Labels** | `ha_config_get_label`, `ha_config_set_label`, `ha_config_remove_label`, `ha_manage_entity_labels` |
144
- | **Zones** | `ha_get_zone`, `ha_set_zone`, `ha_remove_zone` |
145
- | **Groups** | `ha_config_list_groups`, `ha_config_set_group`, `ha_config_remove_group` |
146
- | **Todo Lists** | `ha_get_todo`, `ha_add_todo_item`, `ha_update_todo_item`, `ha_remove_todo_item` |
147
- | **Calendar** | `ha_config_get_calendar_events`, `ha_config_set_calendar_event`, `ha_config_remove_calendar_event` |
148
- | **Blueprints** | `ha_list_blueprints`, `ha_get_blueprint`, `ha_import_blueprint` |
149
- | **Device Registry** | `ha_get_device`, `ha_update_device`, `ha_remove_device`, `ha_rename_entity` |
150
- | **ZHA & Integrations** | `ha_get_zha_devices`, `ha_get_entity_integration_source` |
151
- | **Add-ons** | `ha_get_addon`, `ha_call_addon_api` (HTTP & WebSocket, direct port access) |
138
+ | **Add-ons** | `ha_call_addon_api`, `ha_get_addon` |
139
+ | **Areas & Floors** | `ha_config_list_areas`, `ha_config_list_floors`, `ha_config_remove_area`, `ha_config_remove_floor`, `ha_config_set_area`, `ha_config_set_floor` |
140
+ | **Automations** | `ha_config_get_automation`, `ha_config_remove_automation`, `ha_config_set_automation` |
141
+ | **Blueprints** | `ha_get_blueprint`, `ha_import_blueprint` |
142
+ | **Calendar** | `ha_config_get_calendar_events`, `ha_config_remove_calendar_event`, `ha_config_set_calendar_event` |
152
143
  | **Camera** | `ha_get_camera_image` |
153
- | **History & Statistics** | `ha_get_history`, `ha_get_statistics` |
154
- | **Automation Traces** | `ha_get_automation_traces` |
155
- | **System & Updates** | `ha_check_config`, `ha_restart`, `ha_reload_core`, `ha_get_system_info`, `ha_get_system_health`, `ha_get_updates` |
156
- | **Backup & Restore** | `ha_backup_create`, `ha_backup_restore` |
157
- | **Utility** | `ha_get_logbook`, `ha_eval_template`, `ha_get_integration` |
158
-
144
+ | **Dashboards** | `ha_config_delete_dashboard_resource`, `ha_config_delete_dashboard`, `ha_config_get_dashboard`, `ha_config_list_dashboard_resources`, `ha_config_set_dashboard_resource`, `ha_config_set_dashboard`, `ha_dashboard_find_card` |
145
+ | **Device Registry** | `ha_get_device`, `ha_remove_device`, `ha_rename_entity_and_device`, `ha_rename_entity`, `ha_update_device` |
146
+ | **Entity Registry** | `ha_get_entity_exposure`, `ha_get_entity`, `ha_set_entity` |
147
+ | **Files** | `ha_delete_file`, `ha_list_files`, `ha_read_file`, `ha_write_file` |
148
+ | **Groups** | `ha_config_list_groups`, `ha_config_remove_group`, `ha_config_set_group` |
149
+ | **HACS** | `ha_hacs_add_repository`, `ha_hacs_download`, `ha_hacs_info`, `ha_hacs_list_installed`, `ha_hacs_repository_info`, `ha_hacs_search` |
150
+ | **Helper Entities** | `ha_config_list_helpers`, `ha_config_remove_helper`, `ha_config_set_helper`, `ha_get_helper_schema`, `ha_set_config_entry_helper` |
151
+ | **History & Statistics** | `ha_get_automation_traces`, `ha_get_history`, `ha_get_logbook`, `ha_get_statistics` |
152
+ | **Integrations** | `ha_delete_config_entry`, `ha_get_integration`, `ha_set_integration_enabled` |
153
+ | **Labels & Categories** | `ha_config_get_category`, `ha_config_get_label`, `ha_config_remove_category`, `ha_config_remove_label`, `ha_config_set_category`, `ha_config_set_label` |
154
+ | **Scripts** | `ha_config_get_script`, `ha_config_remove_script`, `ha_config_set_script` |
155
+ | **Search & Discovery** | `ha_deep_search`, `ha_get_overview`, `ha_get_state`, `ha_get_states`, `ha_search_entities` |
156
+ | **Service & Device Control** | `ha_bulk_control`, `ha_call_service`, `ha_get_bulk_status`, `ha_get_operation_status`, `ha_list_services` |
157
+ | **System** | `ha_backup_create`, `ha_backup_restore`, `ha_check_config`, `ha_get_system_health`, `ha_get_updates`, `ha_reload_core`, `ha_restart` |
158
+ | **Todo Lists** | `ha_add_todo_item`, `ha_get_todo`, `ha_remove_todo_item`, `ha_update_todo_item` |
159
+ | **Utilities** | `ha_eval_template`, `ha_install_mcp_tools`, `ha_report_issue` |
160
+ | **Zones** | `ha_get_zone`, `ha_remove_zone`, `ha_set_zone` |
161
+
162
+ <!-- TOOLS_TABLE_END -->
159
163
  </details>
160
164
 
161
165
  ---
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "7.1.0.dev304"
7
+ version = "7.1.0.dev306"
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"
@@ -391,7 +391,7 @@ def register_backup_tools(mcp: "FastMCP", client: HomeAssistantClient, **kwargs:
391
391
 
392
392
  **Returns:** Backup ID and job status"""
393
393
 
394
- @mcp.tool(description=backup_create_description, annotations={"destructiveHint": True, "title": "Create Backup"})
394
+ @mcp.tool(description=backup_create_description, tags={"System"}, annotations={"destructiveHint": True, "title": "Create Backup"})
395
395
  @log_tool_usage
396
396
  async def ha_backup_create(
397
397
  name: Annotated[
@@ -405,7 +405,7 @@ def register_backup_tools(mcp: "FastMCP", client: HomeAssistantClient, **kwargs:
405
405
  """Create a fast Home Assistant backup (local only)."""
406
406
  return await create_backup(client, name)
407
407
 
408
- @mcp.tool(annotations={"destructiveHint": True, "title": "Restore Backup"})
408
+ @mcp.tool(tags={"System"}, annotations={"destructiveHint": True, "title": "Restore Backup"})
409
409
  @log_tool_usage
410
410
  async def ha_backup_restore(
411
411
  backup_id: Annotated[
@@ -783,7 +783,7 @@ def register_addon_tools(mcp: Any, client: HomeAssistantClient, **kwargs: Any) -
783
783
  **kwargs: Additional arguments (ignored, for auto-discovery compatibility)
784
784
  """
785
785
 
786
- @mcp.tool(annotations={"idempotentHint": True, "readOnlyHint": True, "tags": ["addon"], "title": "Get Add-ons"})
786
+ @mcp.tool(tags={"Add-ons"}, annotations={"idempotentHint": True, "readOnlyHint": True, "title": "Get Add-ons"})
787
787
  @log_tool_usage
788
788
  async def ha_get_addon(
789
789
  source: Annotated[
@@ -878,13 +878,15 @@ def register_addon_tools(mcp: Any, client: HomeAssistantClient, **kwargs: Any) -
878
878
  raise_tool_error(result)
879
879
  return result
880
880
 
881
- @mcp.tool(annotations={
882
- "destructiveHint": True,
883
- "idempotentHint": False,
884
- "readOnlyHint": False,
885
- "tags": ["addon"],
886
- "title": "Call Add-on API",
887
- })
881
+ @mcp.tool(
882
+ tags={"Add-ons"},
883
+ annotations={
884
+ "destructiveHint": True,
885
+ "idempotentHint": False,
886
+ "readOnlyHint": False,
887
+ "title": "Call Add-on API",
888
+ },
889
+ )
888
890
  @log_tool_usage
889
891
  async def ha_call_addon_api(
890
892
  slug: Annotated[
@@ -25,7 +25,7 @@ def register_area_tools(mcp: Any, client: Any, **kwargs: Any) -> None:
25
25
  # AREA TOOLS
26
26
  # ============================================================
27
27
 
28
- @mcp.tool(annotations={"idempotentHint": True, "readOnlyHint": True, "tags": ["area"], "title": "List Areas"})
28
+ @mcp.tool(tags={"Areas & Floors"}, annotations={"idempotentHint": True, "readOnlyHint": True, "title": "List Areas"})
29
29
  @log_tool_usage
30
30
  async def ha_config_list_areas() -> dict[str, Any]:
31
31
  """
@@ -63,7 +63,7 @@ def register_area_tools(mcp: Any, client: Any, **kwargs: Any) -> None:
63
63
  "Verify WebSocket connection is active",
64
64
  ])
65
65
 
66
- @mcp.tool(annotations={"destructiveHint": True, "tags": ["area"], "title": "Create or Update Area"})
66
+ @mcp.tool(tags={"Areas & Floors"}, annotations={"destructiveHint": True, "title": "Create or Update Area"})
67
67
  @log_tool_usage
68
68
  async def ha_config_set_area(
69
69
  name: Annotated[
@@ -208,7 +208,7 @@ def register_area_tools(mcp: Any, client: Any, **kwargs: Any) -> None:
208
208
  "If assigning to a floor, verify floor_id exists",
209
209
  ])
210
210
 
211
- @mcp.tool(annotations={"destructiveHint": True, "idempotentHint": True, "tags": ["area"], "title": "Remove Area"})
211
+ @mcp.tool(tags={"Areas & Floors"}, annotations={"destructiveHint": True, "idempotentHint": True, "title": "Remove Area"})
212
212
  @log_tool_usage
213
213
  async def ha_config_remove_area(
214
214
  area_id: Annotated[
@@ -258,7 +258,7 @@ def register_area_tools(mcp: Any, client: Any, **kwargs: Any) -> None:
258
258
  # FLOOR TOOLS
259
259
  # ============================================================
260
260
 
261
- @mcp.tool(annotations={"idempotentHint": True, "readOnlyHint": True, "tags": ["floor"], "title": "List Floors"})
261
+ @mcp.tool(tags={"Areas & Floors"}, annotations={"idempotentHint": True, "readOnlyHint": True, "title": "List Floors"})
262
262
  @log_tool_usage
263
263
  async def ha_config_list_floors() -> dict[str, Any]:
264
264
  """
@@ -296,7 +296,7 @@ def register_area_tools(mcp: Any, client: Any, **kwargs: Any) -> None:
296
296
  "Verify WebSocket connection is active",
297
297
  ])
298
298
 
299
- @mcp.tool(annotations={"destructiveHint": True, "tags": ["floor"], "title": "Create or Update Floor"})
299
+ @mcp.tool(tags={"Areas & Floors"}, annotations={"destructiveHint": True, "title": "Create or Update Floor"})
300
300
  @log_tool_usage
301
301
  async def ha_config_set_floor(
302
302
  name: Annotated[
@@ -429,7 +429,7 @@ def register_area_tools(mcp: Any, client: Any, **kwargs: Any) -> None:
429
429
  "For update: Verify the floor_id exists using ha_config_list_floors()",
430
430
  ])
431
431
 
432
- @mcp.tool(annotations={"destructiveHint": True, "idempotentHint": True, "tags": ["floor"], "title": "Remove Floor"})
432
+ @mcp.tool(tags={"Areas & Floors"}, annotations={"destructiveHint": True, "idempotentHint": True, "title": "Remove Floor"})
433
433
  @log_tool_usage
434
434
  async def ha_config_remove_floor(
435
435
  floor_id: Annotated[
@@ -56,7 +56,7 @@ def register_blueprint_tools(mcp: Any, client: Any, **kwargs: Any) -> None:
56
56
  "blueprints": blueprints,
57
57
  }
58
58
 
59
- @mcp.tool(annotations={"idempotentHint": True, "readOnlyHint": True, "tags": ["blueprint"], "title": "Get Blueprint"})
59
+ @mcp.tool(tags={"Blueprints"}, annotations={"idempotentHint": True, "readOnlyHint": True, "title": "Get Blueprint"})
60
60
  @log_tool_usage
61
61
  async def ha_get_blueprint(
62
62
  path: Annotated[
@@ -183,7 +183,7 @@ def register_blueprint_tools(mcp: Any, client: Any, **kwargs: Any) -> None:
183
183
  ],
184
184
  )
185
185
 
186
- @mcp.tool(annotations={"destructiveHint": True, "tags": ["blueprint"], "title": "Import Blueprint"})
186
+ @mcp.tool(tags={"Blueprints"}, annotations={"destructiveHint": True, "title": "Import Blueprint"})
187
187
  @log_tool_usage
188
188
  async def ha_import_blueprint(
189
189
  url: Annotated[
@@ -85,11 +85,11 @@ def register_bug_report_tools(mcp: Any, client: Any, **kwargs: Any) -> None:
85
85
  """Register bug report tools with the MCP server."""
86
86
 
87
87
  @mcp.tool(
88
+ tags={"Utilities"},
88
89
  annotations={
89
90
  "idempotentHint": True,
90
91
  "readOnlyHint": True,
91
- "tags": ["system", "diagnostics", "feedback"],
92
- "title": "Report Issue or Feedback",
92
+ "title": "Report Issue or Feedback"
93
93
  }
94
94
  )
95
95
  @log_tool_usage
@@ -23,7 +23,7 @@ logger = logging.getLogger(__name__)
23
23
  def register_calendar_tools(mcp: Any, client: Any, **kwargs: Any) -> None:
24
24
  """Register calendar management tools with the MCP server."""
25
25
 
26
- @mcp.tool(annotations={"idempotentHint": True, "readOnlyHint": True, "tags": ["calendar"], "title": "Get Calendar Events"})
26
+ @mcp.tool(tags={"Calendar"}, annotations={"idempotentHint": True, "readOnlyHint": True, "title": "Get Calendar Events"})
27
27
  @log_tool_usage
28
28
  async def ha_config_get_calendar_events(
29
29
  entity_id: Annotated[
@@ -144,7 +144,7 @@ def register_calendar_tools(mcp: Any, client: Any, **kwargs: Any) -> None:
144
144
 
145
145
  exception_to_structured_error(error, context={"entity_id": entity_id}, suggestions=suggestions)
146
146
 
147
- @mcp.tool(annotations={"destructiveHint": True, "tags": ["calendar"], "title": "Create or Update Calendar Event"})
147
+ @mcp.tool(tags={"Calendar"}, annotations={"destructiveHint": True, "title": "Create or Update Calendar Event"})
148
148
  @log_tool_usage
149
149
  async def ha_config_set_calendar_event(
150
150
  entity_id: Annotated[
@@ -263,7 +263,7 @@ def register_calendar_tools(mcp: Any, client: Any, **kwargs: Any) -> None:
263
263
 
264
264
  exception_to_structured_error(error, context={"entity_id": entity_id}, suggestions=suggestions)
265
265
 
266
- @mcp.tool(annotations={"destructiveHint": True, "idempotentHint": True, "tags": ["calendar"], "title": "Remove Calendar Event"})
266
+ @mcp.tool(tags={"Calendar"}, annotations={"destructiveHint": True, "idempotentHint": True, "title": "Remove Calendar Event"})
267
267
  @log_tool_usage
268
268
  async def ha_config_remove_calendar_event(
269
269
  entity_id: Annotated[
@@ -18,7 +18,7 @@ logger = logging.getLogger(__name__)
18
18
  def register_camera_tools(mcp: Any, client: Any, **kwargs: Any) -> None:
19
19
  """Register Home Assistant camera tools."""
20
20
 
21
- @mcp.tool(annotations={"idempotentHint": True, "readOnlyHint": True, "tags": ["camera"], "title": "Get Camera Image"})
21
+ @mcp.tool(tags={"Camera"}, annotations={"idempotentHint": True, "readOnlyHint": True, "title": "Get Camera Image"})
22
22
  @log_tool_usage
23
23
  async def ha_get_camera_image(
24
24
  entity_id: str,
@@ -24,11 +24,11 @@ def register_category_tools(mcp: Any, client: Any, **kwargs: Any) -> None:
24
24
  """Register Home Assistant category management tools."""
25
25
 
26
26
  @mcp.tool(
27
+ tags={"Labels & Categories"},
27
28
  annotations={
28
29
  "idempotentHint": True,
29
30
  "readOnlyHint": True,
30
- "tags": ["category"],
31
- "title": "Get Category",
31
+ "title": "Get Category"
32
32
  }
33
33
  )
34
34
  @log_tool_usage
@@ -143,10 +143,10 @@ def register_category_tools(mcp: Any, client: Any, **kwargs: Any) -> None:
143
143
  )
144
144
 
145
145
  @mcp.tool(
146
+ tags={"Labels & Categories"},
146
147
  annotations={
147
148
  "destructiveHint": True,
148
- "tags": ["category"],
149
- "title": "Create or Update Category",
149
+ "title": "Create or Update Category"
150
150
  }
151
151
  )
152
152
  @log_tool_usage
@@ -246,11 +246,11 @@ def register_category_tools(mcp: Any, client: Any, **kwargs: Any) -> None:
246
246
  )
247
247
 
248
248
  @mcp.tool(
249
+ tags={"Labels & Categories"},
249
250
  annotations={
250
251
  "destructiveHint": True,
251
252
  "idempotentHint": True,
252
- "tags": ["category"],
253
- "title": "Remove Category",
253
+ "title": "Remove Category"
254
254
  }
255
255
  )
256
256
  @log_tool_usage
@@ -206,11 +206,11 @@ def register_config_automation_tools(mcp: Any, client: Any, **kwargs: Any) -> No
206
206
  """Register Home Assistant automation configuration tools."""
207
207
 
208
208
  @mcp.tool(
209
+ tags={"Automations"},
209
210
  annotations={
210
211
  "idempotentHint": True,
211
212
  "readOnlyHint": True,
212
- "tags": ["automation"],
213
- "title": "Get Automation Config",
213
+ "title": "Get Automation Config"
214
214
  }
215
215
  )
216
216
  @log_tool_usage
@@ -275,10 +275,10 @@ def register_config_automation_tools(mcp: Any, client: Any, **kwargs: Any) -> No
275
275
  )
276
276
 
277
277
  @mcp.tool(
278
+ tags={"Automations"},
278
279
  annotations={
279
280
  "destructiveHint": True,
280
- "tags": ["automation"],
281
- "title": "Create or Update Automation",
281
+ "title": "Create or Update Automation"
282
282
  }
283
283
  )
284
284
  @log_tool_usage
@@ -538,11 +538,11 @@ def register_config_automation_tools(mcp: Any, client: Any, **kwargs: Any) -> No
538
538
  )
539
539
 
540
540
  @mcp.tool(
541
+ tags={"Automations"},
541
542
  annotations={
542
543
  "destructiveHint": True,
543
544
  "idempotentHint": True,
544
- "tags": ["automation"],
545
- "title": "Remove Automation",
545
+ "title": "Remove Automation"
546
546
  }
547
547
  )
548
548
  @log_tool_usage
@@ -260,11 +260,11 @@ def register_config_dashboard_tools(mcp: Any, client: Any, **kwargs: Any) -> Non
260
260
  """Register Home Assistant dashboard configuration tools."""
261
261
 
262
262
  @mcp.tool(
263
+ tags={"Dashboards"},
263
264
  annotations={
264
265
  "idempotentHint": True,
265
266
  "readOnlyHint": True,
266
- "tags": ["dashboard"],
267
- "title": "Get Dashboard",
267
+ "title": "Get Dashboard"
268
268
  }
269
269
  )
270
270
  @log_tool_usage
@@ -398,10 +398,10 @@ def register_config_dashboard_tools(mcp: Any, client: Any, **kwargs: Any) -> Non
398
398
  )
399
399
 
400
400
  @mcp.tool(
401
+ tags={"Dashboards"},
401
402
  annotations={
402
403
  "destructiveHint": True,
403
- "tags": ["dashboard"],
404
- "title": "Create or Update Dashboard",
404
+ "title": "Create or Update Dashboard"
405
405
  }
406
406
  )
407
407
  @log_tool_usage
@@ -1004,10 +1004,10 @@ def register_config_dashboard_tools(mcp: Any, client: Any, **kwargs: Any) -> Non
1004
1004
  )
1005
1005
 
1006
1006
  @mcp.tool(
1007
+ tags={"Dashboards"},
1007
1008
  annotations={
1008
1009
  "destructiveHint": True,
1009
- "tags": ["dashboard"],
1010
- "title": "Delete Dashboard",
1010
+ "title": "Delete Dashboard"
1011
1011
  }
1012
1012
  )
1013
1013
  @log_tool_usage
@@ -1157,11 +1157,11 @@ def register_config_dashboard_tools(mcp: Any, client: Any, **kwargs: Any) -> Non
1157
1157
  pass # Default: register the tool if settings unavailable
1158
1158
 
1159
1159
  @mcp.tool(
1160
+ tags={"Dashboards"},
1160
1161
  annotations={
1161
1162
  "idempotentHint": True,
1162
1163
  "readOnlyHint": True,
1163
- "tags": ["dashboard", "card"],
1164
- "title": "Find Dashboard Card",
1164
+ "title": "Find Dashboard Card"
1165
1165
  }
1166
1166
  )
1167
1167
  @log_tool_usage
@@ -179,10 +179,10 @@ def register_config_entry_flow_tools(mcp: Any, client: Any, **kwargs: Any) -> No
179
179
  ))
180
180
 
181
181
  @mcp.tool(
182
+ tags={"Helper Entities"},
182
183
  annotations={
183
184
  "destructiveHint": True,
184
- "tags": ["config"],
185
- "title": "Set Config Entry Helper",
185
+ "title": "Set Config Entry Helper"
186
186
  }
187
187
  )
188
188
  @log_tool_usage
@@ -335,10 +335,10 @@ def register_config_entry_flow_tools(mcp: Any, client: Any, **kwargs: Any) -> No
335
335
  exception_to_structured_error(e, context=context)
336
336
 
337
337
  @mcp.tool(
338
+ tags={"Helper Entities"},
338
339
  annotations={
339
340
  "readOnlyHint": True,
340
- "tags": ["config"],
341
- "title": "Get Helper Schema",
341
+ "title": "Get Helper Schema"
342
342
  }
343
343
  )
344
344
  @log_tool_usage
@@ -71,11 +71,11 @@ def register_config_helper_tools(mcp: Any, client: Any, **kwargs: Any) -> None:
71
71
  """Register Home Assistant helper configuration tools."""
72
72
 
73
73
  @mcp.tool(
74
+ tags={"Helper Entities"},
74
75
  annotations={
75
76
  "idempotentHint": True,
76
77
  "readOnlyHint": True,
77
- "tags": ["helper"],
78
- "title": "List Helpers",
78
+ "title": "List Helpers"
79
79
  }
80
80
  )
81
81
  @log_tool_usage
@@ -170,10 +170,10 @@ def register_config_helper_tools(mcp: Any, client: Any, **kwargs: Any) -> None:
170
170
  )
171
171
 
172
172
  @mcp.tool(
173
+ tags={"Helper Entities"},
173
174
  annotations={
174
175
  "destructiveHint": True,
175
- "tags": ["helper"],
176
- "title": "Create or Update Helper",
176
+ "title": "Create or Update Helper"
177
177
  }
178
178
  )
179
179
  @log_tool_usage
@@ -958,11 +958,11 @@ def register_config_helper_tools(mcp: Any, client: Any, **kwargs: Any) -> None:
958
958
  )
959
959
 
960
960
  @mcp.tool(
961
+ tags={"Helper Entities"},
961
962
  annotations={
962
963
  "destructiveHint": True,
963
964
  "idempotentHint": True,
964
- "tags": ["helper"],
965
- "title": "Remove Helper",
965
+ "title": "Remove Helper"
966
966
  }
967
967
  )
968
968
  @log_tool_usage
@@ -56,11 +56,11 @@ def register_config_script_tools(mcp: Any, client: Any, **kwargs: Any) -> None:
56
56
  """Register Home Assistant script configuration tools."""
57
57
 
58
58
  @mcp.tool(
59
+ tags={"Scripts"},
59
60
  annotations={
60
61
  "idempotentHint": True,
61
62
  "readOnlyHint": True,
62
- "tags": ["script"],
63
- "title": "Get Script Config",
63
+ "title": "Get Script Config"
64
64
  }
65
65
  )
66
66
  @log_tool_usage
@@ -102,10 +102,10 @@ def register_config_script_tools(mcp: Any, client: Any, **kwargs: Any) -> None:
102
102
  )
103
103
 
104
104
  @mcp.tool(
105
+ tags={"Scripts"},
105
106
  annotations={
106
107
  "destructiveHint": True,
107
- "tags": ["script"],
108
- "title": "Create or Update Script",
108
+ "title": "Create or Update Script"
109
109
  }
110
110
  )
111
111
  @log_tool_usage
@@ -320,11 +320,11 @@ def register_config_script_tools(mcp: Any, client: Any, **kwargs: Any) -> None:
320
320
  )
321
321
 
322
322
  @mcp.tool(
323
+ tags={"Scripts"},
323
324
  annotations={
324
325
  "destructiveHint": True,
325
326
  "idempotentHint": True,
326
- "tags": ["script"],
327
- "title": "Remove Script",
327
+ "title": "Remove Script"
328
328
  }
329
329
  )
330
330
  @log_tool_usage
@@ -302,11 +302,11 @@ def register_entity_tools(mcp: Any, client: Any, **kwargs: Any) -> None:
302
302
  return response_data
303
303
 
304
304
  @mcp.tool(
305
+ tags={"Entity Registry"},
305
306
  annotations={
306
307
  "destructiveHint": True,
307
308
  "idempotentHint": True,
308
- "tags": ["entity"],
309
- "title": "Set Entity",
309
+ "title": "Set Entity"
310
310
  }
311
311
  )
312
312
  @log_tool_usage
@@ -683,11 +683,11 @@ def register_entity_tools(mcp: Any, client: Any, **kwargs: Any) -> None:
683
683
  exception_to_structured_error(e, context={"entity_id": eid_context})
684
684
 
685
685
  @mcp.tool(
686
+ tags={"Entity Registry"},
686
687
  annotations={
687
688
  "readOnlyHint": True,
688
689
  "idempotentHint": True,
689
- "tags": ["entity"],
690
- "title": "Get Entity",
690
+ "title": "Get Entity"
691
691
  }
692
692
  )
693
693
  @log_tool_usage