ha-mcp-dev 7.3.0.dev394__tar.gz → 7.3.0.dev396__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 (102) hide show
  1. {ha_mcp_dev-7.3.0.dev394/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.3.0.dev396}/PKG-INFO +1 -1
  2. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/pyproject.toml +1 -1
  3. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/server.py +71 -17
  4. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  5. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/LICENSE +0 -0
  6. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/MANIFEST.in +0 -0
  7. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/README.md +0 -0
  8. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/setup.cfg +0 -0
  9. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/__init__.py +0 -0
  10. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/__main__.py +0 -0
  11. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/_pypi_marker +0 -0
  12. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/auth/__init__.py +0 -0
  13. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/auth/consent_form.py +0 -0
  14. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/auth/provider.py +0 -0
  15. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/client/__init__.py +0 -0
  16. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/client/rest_client.py +0 -0
  17. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/client/websocket_client.py +0 -0
  18. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/client/websocket_listener.py +0 -0
  19. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/config.py +0 -0
  20. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/errors.py +0 -0
  21. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/py.typed +0 -0
  22. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  23. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  24. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  25. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  26. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  27. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  28. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  29. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  30. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  31. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  32. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  33. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  34. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  35. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  36. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  37. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  38. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  39. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  40. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  41. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  42. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/smoke_test.py +0 -0
  43. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/__init__.py +0 -0
  44. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/backup.py +0 -0
  45. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  46. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/device_control.py +0 -0
  47. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/enhanced.py +0 -0
  48. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/helpers.py +0 -0
  49. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/registry.py +0 -0
  50. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/smart_search.py +0 -0
  51. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/tools_addons.py +0 -0
  52. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/tools_areas.py +0 -0
  53. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  54. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  55. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/tools_calendar.py +0 -0
  56. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/tools_camera.py +0 -0
  57. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/tools_categories.py +0 -0
  58. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  59. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  60. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/tools_config_entry_flow.py +0 -0
  61. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  62. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  63. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/tools_energy.py +0 -0
  64. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/tools_entities.py +0 -0
  65. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  66. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/tools_groups.py +0 -0
  67. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/tools_hacs.py +0 -0
  68. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/tools_history.py +0 -0
  69. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/tools_integrations.py +0 -0
  70. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/tools_labels.py +0 -0
  71. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
  72. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/tools_registry.py +0 -0
  73. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/tools_resources.py +0 -0
  74. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/tools_search.py +0 -0
  75. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/tools_service.py +0 -0
  76. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/tools_services.py +0 -0
  77. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/tools_system.py +0 -0
  78. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/tools_todo.py +0 -0
  79. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/tools_traces.py +0 -0
  80. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/tools_updates.py +0 -0
  81. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/tools_utility.py +0 -0
  82. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  83. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  84. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/tools_zones.py +0 -0
  85. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/tools/util_helpers.py +0 -0
  86. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/transforms/__init__.py +0 -0
  87. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/transforms/categorized_search.py +0 -0
  88. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/utils/__init__.py +0 -0
  89. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/utils/config_hash.py +0 -0
  90. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/utils/domain_handlers.py +0 -0
  91. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  92. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/utils/operation_manager.py +0 -0
  93. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/utils/python_sandbox.py +0 -0
  94. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp/utils/usage_logger.py +0 -0
  95. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  96. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  97. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  98. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  99. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  100. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/tests/__init__.py +0 -0
  101. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/tests/test_constants.py +0 -0
  102. {ha_mcp_dev-7.3.0.dev394 → ha_mcp_dev-7.3.0.dev396}/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.dev394
3
+ Version: 7.3.0.dev396
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.dev394"
7
+ version = "7.3.0.dev396"
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"
@@ -143,6 +143,13 @@ class HomeAssistantSmartMCPServer(EnhancedToolsMixin):
143
143
  # Register bundled skills as MCP resources
144
144
  self._register_skills()
145
145
 
146
+ # Enrich tool descriptions with BM25 keyword boosts. Runs
147
+ # unconditionally so Claude's native deferred-tool search
148
+ # (claude.ai) benefits even when ENABLE_TOOL_SEARCH is off.
149
+ # Must come before _apply_tool_search so CategorizedSearchTransform
150
+ # indexes the enriched descriptions.
151
+ self._apply_search_keyword_enrichment()
152
+
146
153
  # Apply tool search transform (must come after all tools and
147
154
  # ResourcesAsTools are registered so it can wrap everything)
148
155
  self._apply_tool_search()
@@ -336,8 +343,11 @@ class HomeAssistantSmartMCPServer(EnhancedToolsMixin):
336
343
  )
337
344
 
338
345
  # Extra keywords appended to tool descriptions for BM25 ranking.
339
- # Only active behind enable_tool_search the original docstrings
340
- # are unchanged; these keywords are appended by SearchKeywordsTransform.
346
+ # Applied unconditionally via SearchKeywordsTransform so they also
347
+ # improve retrieval for Claude's native deferred-tool search on
348
+ # claude.ai, which indexes tool names and descriptions with BM25
349
+ # (no semantic matching). Original tool docstrings stay unchanged;
350
+ # these keywords are appended by the transform at list-tools time.
341
351
  _SEARCH_KEYWORDS: ClassVar[dict[str, str]] = {
342
352
  # s02: "find entities" → ha_search_entities should outrank ha_deep_search
343
353
  "ha_search_entities": (
@@ -390,8 +400,11 @@ class HomeAssistantSmartMCPServer(EnhancedToolsMixin):
390
400
  }
391
401
 
392
402
  # Description overrides that REPLACE the original description for BM25.
393
- # Used to narrow overly broad tools so they stop matching generic queries.
394
- # Only active behind enable_tool_search via SearchKeywordsTransform.
403
+ # Used to narrow overly broad tools so they stop matching generic queries
404
+ # against ha-mcp's internal BM25 search tool. Only applied when
405
+ # enable_tool_search=True, because they are tuned specifically for the
406
+ # categorized search transform and replacing the base description would
407
+ # unnecessarily trim context for other clients.
395
408
  _SEARCH_DESCRIPTION_OVERRIDES: ClassVar[dict[str, str]] = {
396
409
  "ha_deep_search": (
397
410
  "Search INSIDE automation, script, and helper YAML configurations. "
@@ -402,6 +415,53 @@ class HomeAssistantSmartMCPServer(EnhancedToolsMixin):
402
415
  ),
403
416
  }
404
417
 
418
+ def _apply_search_keyword_enrichment(self) -> None:
419
+ """Append BM25 keyword boosts to tool descriptions.
420
+
421
+ Applied unconditionally so Claude's native deferred-tool search
422
+ (claude.ai uses BM25 over tool names and descriptions) can find
423
+ ha-mcp tools for common natural-language queries like "create
424
+ automation" — the scenario in #940. The original tool docstrings
425
+ in ``src/ha_mcp/tools/`` are unchanged; keywords are appended at
426
+ list-tools time via ``SearchKeywordsTransform``.
427
+
428
+ Description overrides (``_SEARCH_DESCRIPTION_OVERRIDES``) are only
429
+ applied when ``enable_tool_search`` is also set, because they
430
+ REPLACE the original description and are tuned specifically for
431
+ ha-mcp's internal BM25 search tool.
432
+
433
+ Runs before ``_apply_tool_search`` so downstream transforms
434
+ index the enriched descriptions.
435
+ """
436
+ try:
437
+ from .transforms import SearchKeywordsTransform
438
+ except ImportError:
439
+ logger.warning(
440
+ "SearchKeywordsTransform not available; skipping description "
441
+ "enrichment (tool discoverability on claude.ai may be degraded)."
442
+ )
443
+ return
444
+
445
+ overrides = (
446
+ self._SEARCH_DESCRIPTION_OVERRIDES
447
+ if self.settings.enable_tool_search
448
+ else None
449
+ )
450
+ try:
451
+ self.mcp.add_transform(
452
+ SearchKeywordsTransform(
453
+ keywords=self._SEARCH_KEYWORDS,
454
+ overrides=overrides,
455
+ )
456
+ )
457
+ logger.info(
458
+ "Search keyword enrichment applied (%d boosts%s)",
459
+ len(self._SEARCH_KEYWORDS),
460
+ f", {len(overrides)} overrides" if overrides else "",
461
+ )
462
+ except Exception:
463
+ logger.exception("Failed to apply SearchKeywordsTransform")
464
+
405
465
  def _apply_tool_search(self) -> None:
406
466
  """Apply the CategorizedSearchTransform if enabled.
407
467
 
@@ -410,6 +470,10 @@ class HomeAssistantSmartMCPServer(EnhancedToolsMixin):
410
470
  remain directly visible in list_tools() for individual permission
411
471
  gating. ResourcesAsTools (list_resources/read_resource) are also
412
472
  pinned when enabled.
473
+
474
+ Note: ``_apply_search_keyword_enrichment`` already ran before this
475
+ method and installed ``SearchKeywordsTransform`` — the enriched
476
+ catalog is what the categorized transform indexes.
413
477
  """
414
478
  if not self.settings.enable_tool_search:
415
479
  return
@@ -447,18 +511,6 @@ class HomeAssistantSmartMCPServer(EnhancedToolsMixin):
447
511
  )
448
512
 
449
513
  try:
450
- # Enrich tool descriptions for BM25 ranking (innermost transform).
451
- # Added first so the search transform indexes enriched descriptions.
452
- # Original tool docstrings are unchanged.
453
- from .transforms import SearchKeywordsTransform
454
-
455
- self.mcp.add_transform(
456
- SearchKeywordsTransform(
457
- keywords=self._SEARCH_KEYWORDS,
458
- overrides=self._SEARCH_DESCRIPTION_OVERRIDES,
459
- )
460
- )
461
-
462
514
  self.mcp.add_transform(
463
515
  CategorizedSearchTransform(
464
516
  max_results=5,
@@ -623,7 +675,9 @@ class HomeAssistantSmartMCPServer(EnhancedToolsMixin):
623
675
  if not f.resolve().is_relative_to(resolved_root):
624
676
  continue
625
677
  rel = f.relative_to(skill_dir)
626
- ref_files.append({"name": str(rel), "uri": f"skill://{skill_name}/{rel}"})
678
+ ref_files.append(
679
+ {"name": str(rel), "uri": f"skill://{skill_name}/{rel}"}
680
+ )
627
681
  except OSError:
628
682
  logger.warning("Error reading skill files in %s", skill_dir)
629
683
  return ref_files
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 7.3.0.dev394
3
+ Version: 7.3.0.dev396
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