ha-mcp-dev 7.5.0.dev590__tar.gz → 7.5.0.dev591__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 (124) hide show
  1. {ha_mcp_dev-7.5.0.dev590/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.5.0.dev591}/PKG-INFO +1 -1
  2. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/pyproject.toml +1 -1
  3. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/__main__.py +35 -11
  4. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  5. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/LICENSE +0 -0
  6. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/MANIFEST.in +0 -0
  7. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/README.md +0 -0
  8. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/setup.cfg +0 -0
  9. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/__init__.py +0 -0
  10. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/_pypi_marker +0 -0
  11. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/_version.py +0 -0
  12. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/auth/__init__.py +0 -0
  13. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/auth/consent_form.py +0 -0
  14. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/auth/provider.py +0 -0
  15. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/backup_manager.py +0 -0
  16. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/client/__init__.py +0 -0
  17. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/client/rest_client.py +0 -0
  18. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/client/supervisor_client.py +0 -0
  19. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/client/websocket_client.py +0 -0
  20. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/client/websocket_listener.py +0 -0
  21. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/config.py +0 -0
  22. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/errors.py +0 -0
  23. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/policy/__init__.py +0 -0
  24. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/policy/approval_queue.py +0 -0
  25. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/policy/evaluator.py +0 -0
  26. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/policy/handlers.py +0 -0
  27. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/policy/middleware.py +0 -0
  28. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/policy/model.py +0 -0
  29. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/policy/persistence.py +0 -0
  30. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/policy/value_sources.py +0 -0
  31. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/py.typed +0 -0
  32. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  33. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  34. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  35. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  36. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  37. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  38. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  39. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  40. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  41. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  42. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  43. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  44. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  45. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  46. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  47. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  48. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  49. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  50. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  51. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  52. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  53. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  54. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/server.py +0 -0
  55. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/settings_ui.py +0 -0
  56. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/smoke_test.py +0 -0
  57. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  58. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/__init__.py +0 -0
  59. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/auto_backup.py +0 -0
  60. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/backup.py +0 -0
  61. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  62. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/device_control.py +0 -0
  63. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/enhanced.py +0 -0
  64. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/helpers.py +0 -0
  65. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/reference_validator.py +0 -0
  66. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/registry.py +0 -0
  67. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/smart_search.py +0 -0
  68. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/tools_addons.py +0 -0
  69. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/tools_areas.py +0 -0
  70. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  71. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  72. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/tools_calendar.py +0 -0
  73. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/tools_camera.py +0 -0
  74. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/tools_categories.py +0 -0
  75. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/tools_code.py +0 -0
  76. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  77. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  78. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/tools_config_entry_flow.py +0 -0
  79. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  80. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  81. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  82. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/tools_energy.py +0 -0
  83. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/tools_entities.py +0 -0
  84. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  85. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/tools_groups.py +0 -0
  86. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/tools_hacs.py +0 -0
  87. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/tools_history.py +0 -0
  88. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/tools_integrations.py +0 -0
  89. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/tools_labels.py +0 -0
  90. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
  91. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/tools_registry.py +0 -0
  92. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/tools_resources.py +0 -0
  93. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/tools_search.py +0 -0
  94. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/tools_service.py +0 -0
  95. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/tools_services.py +0 -0
  96. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/tools_system.py +0 -0
  97. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/tools_todo.py +0 -0
  98. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/tools_traces.py +0 -0
  99. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/tools_updates.py +0 -0
  100. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/tools_utility.py +0 -0
  101. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  102. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  103. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/tools_zones.py +0 -0
  104. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/tools/util_helpers.py +0 -0
  105. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/transforms/__init__.py +0 -0
  106. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/transforms/categorized_search.py +0 -0
  107. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  108. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/utils/__init__.py +0 -0
  109. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/utils/config_hash.py +0 -0
  110. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/utils/data_paths.py +0 -0
  111. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/utils/domain_handlers.py +0 -0
  112. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  113. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  114. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/utils/operation_manager.py +0 -0
  115. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/utils/python_sandbox.py +0 -0
  116. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp/utils/usage_logger.py +0 -0
  117. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  118. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  119. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  120. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  121. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  122. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/tests/__init__.py +0 -0
  123. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/tests/test_constants.py +0 -0
  124. {ha_mcp_dev-7.5.0.dev590 → ha_mcp_dev-7.5.0.dev591}/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.5.0.dev590
3
+ Version: 7.5.0.dev591
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.5.0.dev590"
7
+ version = "7.5.0.dev591"
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"
@@ -288,11 +288,11 @@ def _setup_standard_mode() -> None:
288
288
  _log_startup_version()
289
289
 
290
290
 
291
- def _http_run_kwargs(transport: str, port: int, path: str) -> dict:
291
+ def _http_run_kwargs(transport: str, host: str, port: int, path: str) -> dict:
292
292
  """Build common run_async kwargs for HTTP-based transports."""
293
293
  return {
294
294
  "transport": transport,
295
- "host": "0.0.0.0",
295
+ "host": host,
296
296
  "port": port,
297
297
  "path": path,
298
298
  "show_banner": _get_show_banner(),
@@ -724,13 +724,26 @@ def main_dev() -> None:
724
724
 
725
725
 
726
726
  # HTTP entry point for web clients
727
- def _get_http_runtime(default_port: int = 8086) -> tuple[int, str]:
727
+ def _get_http_runtime(default_port: int = 8086) -> tuple[str, int, str]:
728
728
  """Return runtime configuration shared by HTTP transports.
729
729
 
730
730
  Args:
731
731
  default_port: Default port to use if MCP_PORT env var is not set.
732
+
733
+ The bind host comes from ``MCP_HOST`` and defaults to ``0.0.0.0``. The
734
+ explicit literal default is load-bearing: FastMCP's own ``Settings.host``
735
+ defaults to ``127.0.0.1``, so dropping the fallback would silently flip
736
+ the default and break existing LAN deployments. Set ``MCP_HOST=127.0.0.1``
737
+ to bind to loopback on workstation deployments.
738
+
739
+ Note: FastMCP also honors a ``FASTMCP_HOST`` env var natively, but
740
+ because ``_http_run_kwargs`` passes ``host=`` explicitly to
741
+ ``run_async``, any ``FASTMCP_HOST`` value in the environment is
742
+ ignored — ``MCP_HOST`` is the only env var that affects bind host
743
+ for ha-mcp's CLI entry points.
732
744
  """
733
745
 
746
+ host = os.getenv("MCP_HOST", "0.0.0.0")
734
747
  port_str = os.getenv("MCP_PORT", str(default_port))
735
748
  try:
736
749
  port = int(port_str)
@@ -738,17 +751,18 @@ def _get_http_runtime(default_port: int = 8086) -> tuple[int, str]:
738
751
  logger.error(f"Invalid MCP_PORT value: {port_str!r}. Must be an integer.")
739
752
  sys.exit(1)
740
753
  path = os.getenv("MCP_SECRET_PATH", "/mcp")
741
- return port, path
754
+ return host, port, path
742
755
 
743
756
 
744
757
  async def _run_http_with_graceful_shutdown(
745
758
  transport: str,
759
+ host: str,
746
760
  port: int,
747
761
  path: str,
748
762
  ) -> None:
749
763
  """Run HTTP server with graceful shutdown support."""
750
764
  await _run_with_shutdown(
751
- _get_mcp().run_async(**_http_run_kwargs(transport, port, path))
765
+ _get_mcp().run_async(**_http_run_kwargs(transport, host, port, path))
752
766
  )
753
767
 
754
768
 
@@ -820,12 +834,12 @@ def _run_http_server(transport: str, default_port: int = 8086) -> None:
820
834
  """
821
835
  from ha_mcp.settings_ui import register_settings_routes
822
836
 
823
- port, path = _get_http_runtime(default_port)
837
+ host, port, path = _get_http_runtime(default_port)
824
838
  register_browser_landing(_get_mcp(), path)
825
839
  register_settings_routes(_get_mcp(), _get_server(), secret_path=path)
826
840
 
827
841
  _run_entrypoint(
828
- _run_http_with_graceful_shutdown(transport, port, path),
842
+ _run_http_with_graceful_shutdown(transport, host, port, path),
829
843
  "HTTP server",
830
844
  )
831
845
 
@@ -836,6 +850,7 @@ def main_web() -> None:
836
850
  Environment:
837
851
  - HOMEASSISTANT_URL (required)
838
852
  - HOMEASSISTANT_TOKEN (required)
853
+ - MCP_HOST (optional, default: "0.0.0.0"; set 127.0.0.1 to restrict to loopback)
839
854
  - MCP_PORT (optional, default: 8086)
840
855
  - MCP_SECRET_PATH (optional, default: "/mcp")
841
856
  """
@@ -849,6 +864,7 @@ def main_sse() -> None:
849
864
  Environment:
850
865
  - HOMEASSISTANT_URL (required)
851
866
  - HOMEASSISTANT_TOKEN (required)
867
+ - MCP_HOST (optional, default: "0.0.0.0"; set 127.0.0.1 to restrict to loopback)
852
868
  - MCP_PORT (optional, default: 8087)
853
869
  - MCP_SECRET_PATH (optional, default: "/mcp")
854
870
  """
@@ -866,6 +882,7 @@ def main_oauth() -> None:
866
882
  Environment:
867
883
  - HOMEASSISTANT_URL (required): URL of the Home Assistant instance
868
884
  - MCP_BASE_URL (required): Public URL where this server is accessible (e.g., https://your-tunnel.com)
885
+ - MCP_HOST (optional, default: "0.0.0.0"; set 127.0.0.1 to restrict to loopback)
869
886
  - MCP_PORT (optional, default: 8086)
870
887
  - MCP_SECRET_PATH (optional, default: "/mcp")
871
888
  - LOG_LEVEL (optional, default: INFO)
@@ -891,7 +908,7 @@ def main_oauth() -> None:
891
908
  logger.info(f"OAuth mode logging configured at {log_level} level")
892
909
  _log_startup_version()
893
910
 
894
- port, path = _get_http_runtime(default_port=8086)
911
+ host, port, path = _get_http_runtime(default_port=8086)
895
912
  base_url = os.getenv("MCP_BASE_URL")
896
913
  ha_url = os.getenv("HOMEASSISTANT_URL")
897
914
 
@@ -924,15 +941,20 @@ For setup instructions, see:
924
941
  # Type narrowing: ha_url and base_url are guaranteed non-None after the check above
925
942
  assert ha_url is not None
926
943
  assert base_url is not None
927
- _run_entrypoint(_run_oauth_server(ha_url, base_url, port, path), "OAuth server")
944
+ _run_entrypoint(
945
+ _run_oauth_server(ha_url, base_url, host, port, path), "OAuth server"
946
+ )
928
947
 
929
948
 
930
- async def _run_oauth_server(ha_url: str, base_url: str, port: int, path: str) -> None:
949
+ async def _run_oauth_server(
950
+ ha_url: str, base_url: str, host: str, port: int, path: str
951
+ ) -> None:
931
952
  """Run the OAuth-authenticated MCP server.
932
953
 
933
954
  Args:
934
955
  ha_url: Home Assistant instance URL (server-side config)
935
956
  base_url: Public URL where this server is accessible (required)
957
+ host: Bind host (typically 0.0.0.0; override via MCP_HOST)
936
958
  port: Port to listen on
937
959
  path: MCP endpoint path
938
960
  """
@@ -968,7 +990,9 @@ async def _run_oauth_server(ha_url: str, base_url: str, port: int, path: str) ->
968
990
  f"Starting OAuth-enabled MCP server with {len(tools)} tools on {base_url}{path}"
969
991
  )
970
992
 
971
- await _run_with_shutdown(mcp.run_async(**_http_run_kwargs("http", port, path)))
993
+ await _run_with_shutdown(
994
+ mcp.run_async(**_http_run_kwargs("http", host, port, path))
995
+ )
972
996
 
973
997
 
974
998
  if __name__ == "__main__":
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 7.5.0.dev590
3
+ Version: 7.5.0.dev591
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