ha-mcp-dev 7.2.0.dev336__tar.gz → 7.2.0.dev337__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.2.0.dev336/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.2.0.dev337}/PKG-INFO +6 -6
  2. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/README.md +5 -5
  3. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/pyproject.toml +1 -1
  4. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/__main__.py +16 -5
  5. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/auth/provider.py +204 -312
  6. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337/src/ha_mcp_dev.egg-info}/PKG-INFO +6 -6
  7. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/LICENSE +0 -0
  8. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/MANIFEST.in +0 -0
  9. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/setup.cfg +0 -0
  10. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/__init__.py +0 -0
  11. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/_pypi_marker +0 -0
  12. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/auth/__init__.py +0 -0
  13. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/auth/consent_form.py +0 -0
  14. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/client/__init__.py +0 -0
  15. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/client/rest_client.py +0 -0
  16. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/client/websocket_client.py +0 -0
  17. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/client/websocket_listener.py +0 -0
  18. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/config.py +0 -0
  19. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/errors.py +0 -0
  20. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/py.typed +0 -0
  21. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  22. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  23. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  24. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  25. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  26. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  27. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  28. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  29. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  30. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  31. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  32. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  33. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  34. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  35. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  36. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  37. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  38. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  39. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  40. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  41. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/server.py +0 -0
  42. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/smoke_test.py +0 -0
  43. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/__init__.py +0 -0
  44. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/backup.py +0 -0
  45. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  46. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/device_control.py +0 -0
  47. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/enhanced.py +0 -0
  48. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/helpers.py +0 -0
  49. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/registry.py +0 -0
  50. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/smart_search.py +0 -0
  51. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/tools_addons.py +0 -0
  52. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/tools_areas.py +0 -0
  53. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  54. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  55. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/tools_calendar.py +0 -0
  56. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/tools_camera.py +0 -0
  57. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/tools_categories.py +0 -0
  58. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  59. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  60. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/tools_config_entry_flow.py +0 -0
  61. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  62. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  63. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/tools_entities.py +0 -0
  64. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  65. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/tools_groups.py +0 -0
  66. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/tools_hacs.py +0 -0
  67. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/tools_history.py +0 -0
  68. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/tools_integrations.py +0 -0
  69. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/tools_labels.py +0 -0
  70. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
  71. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/tools_registry.py +0 -0
  72. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/tools_resources.py +0 -0
  73. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/tools_search.py +0 -0
  74. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/tools_service.py +0 -0
  75. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/tools_services.py +0 -0
  76. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/tools_system.py +0 -0
  77. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/tools_todo.py +0 -0
  78. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/tools_traces.py +0 -0
  79. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/tools_updates.py +0 -0
  80. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/tools_utility.py +0 -0
  81. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  82. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  83. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/tools_zones.py +0 -0
  84. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/tools/util_helpers.py +0 -0
  85. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/transforms/__init__.py +0 -0
  86. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/transforms/categorized_search.py +0 -0
  87. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/utils/__init__.py +0 -0
  88. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/utils/domain_handlers.py +0 -0
  89. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  90. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/utils/operation_manager.py +0 -0
  91. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/utils/python_sandbox.py +0 -0
  92. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp/utils/usage_logger.py +0 -0
  93. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  94. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  95. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  96. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  97. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  98. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/tests/__init__.py +0 -0
  99. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/tests/test_constants.py +0 -0
  100. {ha_mcp_dev-7.2.0.dev336 → ha_mcp_dev-7.2.0.dev337}/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.2.0.dev336
3
+ Version: 7.2.0.dev337
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-91-blue" alt="95+ Tools">
40
+ <img src="https://img.shields.io/badge/tools-88-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 (91 tools)</b></summary>
163
+ <summary><b>Complete Tool List (88 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`, `ha_update_device` |
174
+ | **Device Registry** | `ha_get_device`, `ha_remove_device`, `ha_update_device` |
175
175
  | **Entity Registry** | `ha_get_entity_exposure`, `ha_get_entity`, `ha_remove_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` |
@@ -181,10 +181,10 @@ Spend less time configuring, more time enjoying your smart home.
181
181
  | **Integrations** | `ha_delete_config_entry`, `ha_get_integration`, `ha_set_integration_enabled` |
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
- | **Search & Discovery** | `ha_deep_search`, `ha_get_overview`, `ha_get_state`, `ha_get_states`, `ha_search_entities` |
184
+ | **Search & Discovery** | `ha_deep_search`, `ha_get_overview`, `ha_get_state`, `ha_search_entities` |
185
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
- | **Todo Lists** | `ha_add_todo_item`, `ha_get_todo`, `ha_remove_todo_item`, `ha_update_todo_item` |
187
+ | **Todo Lists** | `ha_get_todo`, `ha_remove_todo_item`, `ha_set_todo_item` |
188
188
  | **Utilities** | `ha_eval_template`, `ha_install_mcp_tools`, `ha_report_issue` |
189
189
  | **Zones** | `ha_get_zone`, `ha_remove_zone`, `ha_set_zone` |
190
190
 
@@ -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-91-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>
@@ -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 (91 tools)</b></summary>
134
+ <summary><b>Complete Tool List (88 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`, `ha_update_device` |
145
+ | **Device Registry** | `ha_get_device`, `ha_remove_device`, `ha_update_device` |
146
146
  | **Entity Registry** | `ha_get_entity_exposure`, `ha_get_entity`, `ha_remove_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` |
@@ -152,10 +152,10 @@ Spend less time configuring, more time enjoying your smart home.
152
152
  | **Integrations** | `ha_delete_config_entry`, `ha_get_integration`, `ha_set_integration_enabled` |
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
- | **Search & Discovery** | `ha_deep_search`, `ha_get_overview`, `ha_get_state`, `ha_get_states`, `ha_search_entities` |
155
+ | **Search & Discovery** | `ha_deep_search`, `ha_get_overview`, `ha_get_state`, `ha_search_entities` |
156
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
- | **Todo Lists** | `ha_add_todo_item`, `ha_get_todo`, `ha_remove_todo_item`, `ha_update_todo_item` |
158
+ | **Todo Lists** | `ha_get_todo`, `ha_remove_todo_item`, `ha_set_todo_item` |
159
159
  | **Utilities** | `ha_eval_template`, `ha_install_mcp_tools`, `ha_report_issue` |
160
160
  | **Zones** | `ha_get_zone`, `ha_remove_zone`, `ha_set_zone` |
161
161
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "7.2.0.dev336"
7
+ version = "7.2.0.dev337"
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"
@@ -61,7 +61,9 @@ class OAuthProxyClient:
61
61
  claims = token.claims
62
62
 
63
63
  if not claims or "ha_token" not in claims:
64
- logger.error(f"OAuth token missing HA credentials. Keys present: {list(claims.keys()) if claims else []}")
64
+ logger.error(
65
+ f"OAuth token missing HA credentials. Keys present: {list(claims.keys()) if claims else []}"
66
+ )
65
67
  raise RuntimeError("No Home Assistant credentials in OAuth token claims")
66
68
 
67
69
  ha_token = claims["ha_token"]
@@ -610,7 +612,9 @@ def register_browser_landing(mcp_instance: "FastMCP | _DeferredMCP", path: str)
610
612
  path: The MCP endpoint path (e.g. "/mcp" or a secret path).
611
613
  """
612
614
  if path in _registered_landing_paths:
613
- logger.warning("register_browser_landing: %r already registered, skipping", path)
615
+ logger.warning(
616
+ "register_browser_landing: %r already registered, skipping", path
617
+ )
614
618
  return
615
619
  _registered_landing_paths.add(path)
616
620
 
@@ -710,6 +714,15 @@ def main_oauth() -> None:
710
714
  Note: HOMEASSISTANT_TOKEN is NOT required in this mode.
711
715
  Per-user tokens are collected via the OAuth consent form.
712
716
  """
717
+ # In OAuth mode, per-user tokens come from the consent form — no
718
+ # server-level HOMEASSISTANT_TOKEN is needed. Set the sentinel so
719
+ # Settings validation passes even when the env var is empty (e.g.
720
+ # Dockerfile sets HOMEASSISTANT_TOKEN=""). Fixes #886.
721
+ if not os.getenv("HOMEASSISTANT_TOKEN"):
722
+ from ha_mcp.config import OAUTH_MODE_TOKEN
723
+
724
+ os.environ["HOMEASSISTANT_TOKEN"] = OAUTH_MODE_TOKEN
725
+
713
726
  # Configure logging for OAuth mode
714
727
  log_level = os.getenv("LOG_LEVEL", "INFO").upper()
715
728
  _setup_logging(log_level, force=True)
@@ -791,9 +804,7 @@ async def _run_oauth_server(ha_url: str, base_url: str, port: int, path: str) ->
791
804
  f"Starting OAuth-enabled MCP server with {len(tools)} tools on {base_url}{path}"
792
805
  )
793
806
 
794
- await _run_with_shutdown(
795
- mcp.run_async(**_http_run_kwargs("http", port, path))
796
- )
807
+ await _run_with_shutdown(mcp.run_async(**_http_run_kwargs("http", port, path)))
797
808
 
798
809
 
799
810
  if __name__ == "__main__":