ha-mcp-dev 7.1.0.dev310__tar.gz → 7.1.0.dev311__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 (100) hide show
  1. {ha_mcp_dev-7.1.0.dev310/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.1.0.dev311}/PKG-INFO +5 -5
  2. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/README.md +4 -4
  3. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/pyproject.toml +1 -1
  4. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/helpers.py +14 -0
  5. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/tools_registry.py +320 -332
  6. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/tools_service.py +151 -84
  7. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311/src/ha_mcp_dev.egg-info}/PKG-INFO +5 -5
  8. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/LICENSE +0 -0
  9. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/MANIFEST.in +0 -0
  10. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/setup.cfg +0 -0
  11. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/__init__.py +0 -0
  12. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/__main__.py +0 -0
  13. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/_pypi_marker +0 -0
  14. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/auth/__init__.py +0 -0
  15. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/auth/consent_form.py +0 -0
  16. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/auth/provider.py +0 -0
  17. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/client/__init__.py +0 -0
  18. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/client/rest_client.py +0 -0
  19. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/client/websocket_client.py +0 -0
  20. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/client/websocket_listener.py +0 -0
  21. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/config.py +0 -0
  22. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/errors.py +0 -0
  23. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/py.typed +0 -0
  24. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  25. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  26. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  27. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  28. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  29. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  30. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  31. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  32. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  33. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  34. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  35. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  36. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  37. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  38. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  39. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  40. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  41. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  42. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  43. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  44. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/server.py +0 -0
  45. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/smoke_test.py +0 -0
  46. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/__init__.py +0 -0
  47. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/backup.py +0 -0
  48. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  49. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/device_control.py +0 -0
  50. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/enhanced.py +0 -0
  51. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/registry.py +0 -0
  52. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/smart_search.py +0 -0
  53. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/tools_addons.py +0 -0
  54. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/tools_areas.py +0 -0
  55. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  56. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  57. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/tools_calendar.py +0 -0
  58. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/tools_camera.py +0 -0
  59. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/tools_categories.py +0 -0
  60. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  61. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  62. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/tools_config_entry_flow.py +0 -0
  63. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  64. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  65. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/tools_entities.py +0 -0
  66. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  67. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/tools_groups.py +0 -0
  68. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/tools_hacs.py +0 -0
  69. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/tools_history.py +0 -0
  70. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/tools_integrations.py +0 -0
  71. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/tools_labels.py +0 -0
  72. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
  73. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/tools_resources.py +0 -0
  74. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/tools_search.py +0 -0
  75. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/tools_services.py +0 -0
  76. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/tools_system.py +0 -0
  77. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/tools_todo.py +0 -0
  78. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/tools_traces.py +0 -0
  79. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/tools_updates.py +0 -0
  80. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/tools_utility.py +0 -0
  81. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  82. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  83. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/tools_zones.py +0 -0
  84. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/tools/util_helpers.py +0 -0
  85. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/transforms/__init__.py +0 -0
  86. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/transforms/categorized_search.py +0 -0
  87. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/utils/__init__.py +0 -0
  88. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/utils/domain_handlers.py +0 -0
  89. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  90. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/utils/operation_manager.py +0 -0
  91. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/utils/python_sandbox.py +0 -0
  92. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp/utils/usage_logger.py +0 -0
  93. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  94. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  95. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  96. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  97. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  98. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/tests/__init__.py +0 -0
  99. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/tests/test_constants.py +0 -0
  100. {ha_mcp_dev-7.1.0.dev310 → ha_mcp_dev-7.1.0.dev311}/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.dev310
3
+ Version: 7.1.0.dev311
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-94-blue" alt="95+ Tools">
40
+ <img src="https://img.shields.io/badge/tools-92-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>
@@ -160,7 +160,7 @@ Spend less time configuring, more time enjoying your smart home.
160
160
  <details>
161
161
  <!-- TOOLS_TABLE_START -->
162
162
 
163
- <summary><b>Complete Tool List (94 tools)</b></summary>
163
+ <summary><b>Complete Tool List (92 tools)</b></summary>
164
164
 
165
165
  | Category | Tools |
166
166
  |----------|-------|
@@ -171,7 +171,7 @@ Spend less time configuring, more time enjoying your smart home.
171
171
  | **Calendar** | `ha_config_get_calendar_events`, `ha_config_remove_calendar_event`, `ha_config_set_calendar_event` |
172
172
  | **Camera** | `ha_get_camera_image` |
173
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` |
174
+ | **Device Registry** | `ha_get_device`, `ha_remove_device`, `ha_rename_entity`, `ha_update_device` |
175
175
  | **Entity Registry** | `ha_get_entity_exposure`, `ha_get_entity`, `ha_set_entity` |
176
176
  | **Files** | `ha_delete_file`, `ha_list_files`, `ha_read_file`, `ha_write_file` |
177
177
  | **Groups** | `ha_config_list_groups`, `ha_config_remove_group`, `ha_config_set_group` |
@@ -182,7 +182,7 @@ Spend less time configuring, more time enjoying your smart home.
182
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
183
  | **Scripts** | `ha_config_get_script`, `ha_config_remove_script`, `ha_config_set_script` |
184
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` |
185
+ | **Service & Device Control** | `ha_bulk_control`, `ha_call_service`, `ha_get_operation_status`, `ha_list_services` |
186
186
  | **System** | `ha_backup_create`, `ha_backup_restore`, `ha_check_config`, `ha_config_set_yaml`, `ha_get_system_health`, `ha_get_updates`, `ha_reload_core`, `ha_restart` |
187
187
  | **Todo Lists** | `ha_add_todo_item`, `ha_get_todo`, `ha_remove_todo_item`, `ha_update_todo_item` |
188
188
  | **Utilities** | `ha_eval_template`, `ha_install_mcp_tools`, `ha_report_issue` |
@@ -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-94-blue" alt="95+ Tools">
11
+ <img src="https://img.shields.io/badge/tools-92-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>
@@ -131,7 +131,7 @@ Spend less time configuring, more time enjoying your smart home.
131
131
  <details>
132
132
  <!-- TOOLS_TABLE_START -->
133
133
 
134
- <summary><b>Complete Tool List (94 tools)</b></summary>
134
+ <summary><b>Complete Tool List (92 tools)</b></summary>
135
135
 
136
136
  | Category | Tools |
137
137
  |----------|-------|
@@ -142,7 +142,7 @@ Spend less time configuring, more time enjoying your smart home.
142
142
  | **Calendar** | `ha_config_get_calendar_events`, `ha_config_remove_calendar_event`, `ha_config_set_calendar_event` |
143
143
  | **Camera** | `ha_get_camera_image` |
144
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` |
145
+ | **Device Registry** | `ha_get_device`, `ha_remove_device`, `ha_rename_entity`, `ha_update_device` |
146
146
  | **Entity Registry** | `ha_get_entity_exposure`, `ha_get_entity`, `ha_set_entity` |
147
147
  | **Files** | `ha_delete_file`, `ha_list_files`, `ha_read_file`, `ha_write_file` |
148
148
  | **Groups** | `ha_config_list_groups`, `ha_config_remove_group`, `ha_config_set_group` |
@@ -153,7 +153,7 @@ Spend less time configuring, more time enjoying your smart home.
153
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
154
  | **Scripts** | `ha_config_get_script`, `ha_config_remove_script`, `ha_config_set_script` |
155
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` |
156
+ | **Service & Device Control** | `ha_bulk_control`, `ha_call_service`, `ha_get_operation_status`, `ha_list_services` |
157
157
  | **System** | `ha_backup_create`, `ha_backup_restore`, `ha_check_config`, `ha_config_set_yaml`, `ha_get_system_health`, `ha_get_updates`, `ha_reload_core`, `ha_restart` |
158
158
  | **Todo Lists** | `ha_add_todo_item`, `ha_get_todo`, `ha_remove_todo_item`, `ha_update_todo_item` |
159
159
  | **Utilities** | `ha_eval_template`, `ha_install_mcp_tools`, `ha_report_issue` |
@@ -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.dev310"
7
+ version = "7.1.0.dev311"
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"
@@ -60,6 +60,20 @@ def raise_tool_error(error_response: dict[str, Any]) -> NoReturn:
60
60
  raise ToolError(json.dumps(error_response, indent=2, default=str))
61
61
 
62
62
 
63
+ def extract_tool_error_message(te: ToolError) -> str:
64
+ """Extract a human-readable error message from a ToolError.
65
+
66
+ Pairs with raise_tool_error() which serializes error dicts as JSON.
67
+ Falls back to str(te) if the message is not valid JSON.
68
+ """
69
+ try:
70
+ error_data = json.loads(str(te))
71
+ msg = error_data.get("error", {}).get("message", str(te))
72
+ return str(msg)
73
+ except (json.JSONDecodeError, TypeError, AttributeError):
74
+ return str(te)
75
+
76
+
63
77
  async def get_connected_ws_client(
64
78
  base_url: str, token: str
65
79
  ) -> tuple[HomeAssistantWebSocketClient | None, dict[str, Any] | None]: