ha-mcp-dev 7.2.0.dev332__tar.gz → 7.2.0.dev333__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.dev332/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.2.0.dev333}/PKG-INFO +1 -1
  2. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/pyproject.toml +1 -1
  3. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/helpers.py +25 -0
  4. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  5. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/LICENSE +0 -0
  6. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/MANIFEST.in +0 -0
  7. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/README.md +0 -0
  8. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/setup.cfg +0 -0
  9. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/__init__.py +0 -0
  10. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/__main__.py +0 -0
  11. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/_pypi_marker +0 -0
  12. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/auth/__init__.py +0 -0
  13. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/auth/consent_form.py +0 -0
  14. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/auth/provider.py +0 -0
  15. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/client/__init__.py +0 -0
  16. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/client/rest_client.py +0 -0
  17. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/client/websocket_client.py +0 -0
  18. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/client/websocket_listener.py +0 -0
  19. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/config.py +0 -0
  20. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/errors.py +0 -0
  21. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/py.typed +0 -0
  22. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  23. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  24. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  25. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  26. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  27. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  28. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  29. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  30. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  31. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  32. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  33. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  34. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  35. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  36. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  37. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  38. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  39. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  40. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  41. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  42. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/server.py +0 -0
  43. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/smoke_test.py +0 -0
  44. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/__init__.py +0 -0
  45. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/backup.py +0 -0
  46. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  47. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/device_control.py +0 -0
  48. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/enhanced.py +0 -0
  49. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/registry.py +0 -0
  50. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/smart_search.py +0 -0
  51. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/tools_addons.py +0 -0
  52. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/tools_areas.py +0 -0
  53. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  54. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  55. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/tools_calendar.py +0 -0
  56. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/tools_camera.py +0 -0
  57. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/tools_categories.py +0 -0
  58. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  59. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  60. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/tools_config_entry_flow.py +0 -0
  61. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  62. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  63. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/tools_entities.py +0 -0
  64. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  65. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/tools_groups.py +0 -0
  66. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/tools_hacs.py +0 -0
  67. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/tools_history.py +0 -0
  68. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/tools_integrations.py +0 -0
  69. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/tools_labels.py +0 -0
  70. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
  71. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/tools_registry.py +0 -0
  72. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/tools_resources.py +0 -0
  73. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/tools_search.py +0 -0
  74. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/tools_service.py +0 -0
  75. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/tools_services.py +0 -0
  76. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/tools_system.py +0 -0
  77. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/tools_todo.py +0 -0
  78. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/tools_traces.py +0 -0
  79. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/tools_updates.py +0 -0
  80. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/tools_utility.py +0 -0
  81. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  82. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  83. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/tools_zones.py +0 -0
  84. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/tools/util_helpers.py +0 -0
  85. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/transforms/__init__.py +0 -0
  86. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/transforms/categorized_search.py +0 -0
  87. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/utils/__init__.py +0 -0
  88. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/utils/domain_handlers.py +0 -0
  89. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  90. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/utils/operation_manager.py +0 -0
  91. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/utils/python_sandbox.py +0 -0
  92. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp/utils/usage_logger.py +0 -0
  93. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  94. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  95. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  96. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  97. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  98. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/tests/__init__.py +0 -0
  99. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/tests/test_constants.py +0 -0
  100. {ha_mcp_dev-7.2.0.dev332 → ha_mcp_dev-7.2.0.dev333}/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.dev332
3
+ Version: 7.2.0.dev333
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.2.0.dev332"
7
+ version = "7.2.0.dev333"
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"
@@ -7,6 +7,7 @@ Centralized utilities that can be shared across multiple tool implementations.
7
7
  import functools
8
8
  import json
9
9
  import logging
10
+ import sys
10
11
  import time
11
12
  from typing import Any, Literal, NoReturn, overload
12
13
 
@@ -230,6 +231,30 @@ def exception_to_structured_error(
230
231
  if suggestions and "error" in error_response and isinstance(error_response["error"], dict):
231
232
  error_response["error"]["suggestions"] = suggestions
232
233
 
234
+ # Append macOS-specific hints for connection failures (after all other processing
235
+ # so hints survive regardless of whether caller provided explicit suggestions)
236
+ if (
237
+ sys.platform == "darwin"
238
+ and "error" in error_response
239
+ and isinstance(error_response["error"], dict)
240
+ and error_response["error"].get("code")
241
+ in (ErrorCode.CONNECTION_FAILED, ErrorCode.CONNECTION_TIMEOUT)
242
+ ):
243
+ macos_hints = [
244
+ "macOS may block local network access for Claude Desktop subprocesses "
245
+ "(System Settings > Privacy & Security > Local Network)",
246
+ "Try an SSH tunnel: ssh -N -L 8123:localhost:8123 user@ha-server, "
247
+ "then use http://localhost:8123",
248
+ "Ensure you are using http:// (not https://) unless SSL/TLS is configured",
249
+ ]
250
+ # Handle both "suggestions" (plural, 2+ items) and "suggestion" (singular, 1 item)
251
+ existing = error_response["error"].get("suggestions") or []
252
+ if not existing:
253
+ single = error_response["error"].get("suggestion")
254
+ if single:
255
+ existing = [single]
256
+ error_response["error"]["suggestions"] = existing + macos_hints
257
+
233
258
  if raise_error:
234
259
  raise_tool_error(error_response)
235
260
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 7.2.0.dev332
3
+ Version: 7.2.0.dev333
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