ha-mcp-dev 7.3.0.dev380__tar.gz → 7.3.0.dev382__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 (101) hide show
  1. {ha_mcp_dev-7.3.0.dev380/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.3.0.dev382}/PKG-INFO +1 -1
  2. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/pyproject.toml +1 -1
  3. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/tools_search.py +44 -23
  4. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  5. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/LICENSE +0 -0
  6. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/MANIFEST.in +0 -0
  7. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/README.md +0 -0
  8. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/setup.cfg +0 -0
  9. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/__init__.py +0 -0
  10. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/__main__.py +0 -0
  11. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/_pypi_marker +0 -0
  12. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/auth/__init__.py +0 -0
  13. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/auth/consent_form.py +0 -0
  14. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/auth/provider.py +0 -0
  15. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/client/__init__.py +0 -0
  16. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/client/rest_client.py +0 -0
  17. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/client/websocket_client.py +0 -0
  18. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/client/websocket_listener.py +0 -0
  19. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/config.py +0 -0
  20. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/errors.py +0 -0
  21. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/py.typed +0 -0
  22. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  23. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  24. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  25. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  26. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  27. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  28. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  29. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  30. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  31. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  32. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  33. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  34. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  35. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  36. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  37. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  38. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  39. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  40. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  41. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  42. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/server.py +0 -0
  43. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/smoke_test.py +0 -0
  44. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/__init__.py +0 -0
  45. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/backup.py +0 -0
  46. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  47. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/device_control.py +0 -0
  48. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/enhanced.py +0 -0
  49. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/helpers.py +0 -0
  50. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/registry.py +0 -0
  51. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/smart_search.py +0 -0
  52. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/tools_addons.py +0 -0
  53. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/tools_areas.py +0 -0
  54. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  55. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  56. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/tools_calendar.py +0 -0
  57. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/tools_camera.py +0 -0
  58. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/tools_categories.py +0 -0
  59. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  60. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  61. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/tools_config_entry_flow.py +0 -0
  62. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  63. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  64. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/tools_entities.py +0 -0
  65. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  66. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/tools_groups.py +0 -0
  67. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/tools_hacs.py +0 -0
  68. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/tools_history.py +0 -0
  69. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/tools_integrations.py +0 -0
  70. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/tools_labels.py +0 -0
  71. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
  72. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/tools_registry.py +0 -0
  73. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/tools_resources.py +0 -0
  74. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/tools_service.py +0 -0
  75. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/tools_services.py +0 -0
  76. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/tools_system.py +0 -0
  77. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/tools_todo.py +0 -0
  78. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/tools_traces.py +0 -0
  79. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/tools_updates.py +0 -0
  80. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/tools_utility.py +0 -0
  81. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  82. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  83. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/tools_zones.py +0 -0
  84. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/tools/util_helpers.py +0 -0
  85. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/transforms/__init__.py +0 -0
  86. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/transforms/categorized_search.py +0 -0
  87. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/utils/__init__.py +0 -0
  88. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/utils/config_hash.py +0 -0
  89. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/utils/domain_handlers.py +0 -0
  90. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  91. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/utils/operation_manager.py +0 -0
  92. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/utils/python_sandbox.py +0 -0
  93. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp/utils/usage_logger.py +0 -0
  94. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  95. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  96. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  97. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  98. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  99. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/tests/__init__.py +0 -0
  100. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/tests/test_constants.py +0 -0
  101. {ha_mcp_dev-7.3.0.dev380 → ha_mcp_dev-7.3.0.dev382}/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.3.0.dev380
3
+ Version: 7.3.0.dev382
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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "7.3.0.dev380"
7
+ version = "7.3.0.dev382"
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"
@@ -157,9 +157,31 @@ def register_search_tools(mcp: Any, client: Any, **kwargs: Any) -> None:
157
157
  )
158
158
  @log_tool_usage
159
159
  async def ha_search_entities(
160
- query: str,
161
- domain_filter: str | None = None,
162
- area_filter: str | None = None,
160
+ query: Annotated[
161
+ str | None,
162
+ Field(
163
+ default=None,
164
+ description=(
165
+ "Entity name to search for (fuzzy or exact match). "
166
+ "Omit to list entities; `domain_filter` or `area_filter` "
167
+ "must be set in that mode."
168
+ ),
169
+ ),
170
+ ] = None,
171
+ domain_filter: Annotated[
172
+ str | None,
173
+ Field(
174
+ default=None,
175
+ description="Limit to a single domain (e.g. 'light', 'sensor', 'calendar').",
176
+ ),
177
+ ] = None,
178
+ area_filter: Annotated[
179
+ str | None,
180
+ Field(
181
+ default=None,
182
+ description="Limit to entities in a specific area (area ID or name).",
183
+ ),
184
+ ] = None,
163
185
  limit: int = 10,
164
186
  offset: Annotated[
165
187
  int | str,
@@ -181,26 +203,25 @@ def register_search_tools(mcp: Any, client: Any, **kwargs: Any) -> None:
181
203
  ),
182
204
  ] = True,
183
205
  ) -> dict[str, Any]:
184
- """PRIMARY tool for finding entities (lights, sensors, switches, etc.) by name, area, or domain. Use this first when looking up any entity ID.
185
-
186
- For searching *inside* automation/script/helper configurations, use ha_deep_search instead.
187
-
188
- **Listing Entities by Domain:**
189
- Use domain_filter with an empty query to list all entities of a specific type:
190
- - ha_search_entities(query="", domain_filter="calendar") - List all calendars
191
- - ha_search_entities(query="", domain_filter="todo") - List all todo lists
192
- - ha_search_entities(query="", domain_filter="scene") - List all scenes
193
- - ha_search_entities(query="", domain_filter="zone") - List all zones (as entities)
194
-
195
- **BEST PRACTICE:** Before performing searches, call ha_get_overview() first to understand:
196
- - Smart home size and scale (total entities, domains, areas)
197
- - Language used in entity naming (French/English/mixed)
198
- - Available areas/rooms and their entity distribution
199
-
200
- Choose overview detail level based on task:
201
- - 'minimal': Quick orientation (10 entities per domain sample) - RECOMMENDED for searches
202
- - 'standard': Complete picture (all entities, friendly names only) - for comprehensive tasks
203
- - 'full': Maximum detail (includes states, device types, services) - for deep analysis"""
206
+ """Find or list entities (lights, sensors, switches, etc.) by name, domain, or area.
207
+
208
+ When NOT to use: for searching inside automation, script, helper, or dashboard
209
+ *configurations* (e.g. which automations call a service or reference an entity),
210
+ use `ha_deep_search`.
211
+
212
+ To enumerate all entities of a domain, omit `query` and pass `domain_filter`. For
213
+ example, `ha_search_entities(domain_filter="calendar")` lists all calendars. At
214
+ least one of `query`, `domain_filter`, or `area_filter` must be set.
215
+ """
216
+ # Normalize omitted/None query to empty string so downstream logic is unchanged
217
+ query = query or ""
218
+ if not query.strip() and not domain_filter and not area_filter:
219
+ raise_tool_error(
220
+ create_validation_error(
221
+ "At least one of 'query', 'domain_filter', or 'area_filter' must be set.",
222
+ parameter="query",
223
+ )
224
+ )
204
225
  # Coerce boolean parameter that may come as string from XML-style calls
205
226
  group_by_domain_bool = (
206
227
  coerce_bool_param(group_by_domain, "group_by_domain", default=False)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 7.3.0.dev380
3
+ Version: 7.3.0.dev382
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