ha-mcp-dev 8.2.0.dev2305__tar.gz → 8.2.0.dev2307__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 (265) hide show
  1. {ha_mcp_dev-8.2.0.dev2305/src/ha_mcp_dev.egg-info → ha_mcp_dev-8.2.0.dev2307}/PKG-INFO +2 -2
  2. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/README.md +1 -1
  3. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/pyproject.toml +1 -1
  4. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/__main__.py +30 -7
  5. ha_mcp_dev-8.2.0.dev2307/src/ha_mcp/auth/oidc_compat.py +106 -0
  6. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307/src/ha_mcp_dev.egg-info}/PKG-INFO +2 -2
  7. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp_dev.egg-info/SOURCES.txt +1 -0
  8. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/LICENSE +0 -0
  9. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/MANIFEST.in +0 -0
  10. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/setup.cfg +0 -0
  11. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/__init__.py +0 -0
  12. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_pypi_marker +0 -0
  13. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_rich_compat.py +0 -0
  14. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/__init__.py +0 -0
  15. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/requirements.txt +0 -0
  16. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/LICENSE +0 -0
  17. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/MANIFEST.sha256 +0 -0
  18. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/VENDORED +0 -0
  19. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/__init__.py +0 -0
  20. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/__main__.py +0 -0
  21. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/asyncio/__init__.py +0 -0
  22. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/asyncio/client.py +0 -0
  23. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/asyncio/connection.py +0 -0
  24. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/asyncio/messages.py +0 -0
  25. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/asyncio/router.py +0 -0
  26. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/asyncio/server.py +0 -0
  27. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/auth.py +0 -0
  28. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/cli.py +0 -0
  29. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/client.py +0 -0
  30. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/connection.py +0 -0
  31. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/datastructures.py +0 -0
  32. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/exceptions.py +0 -0
  33. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/extensions/__init__.py +0 -0
  34. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/extensions/base.py +0 -0
  35. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/extensions/permessage_deflate.py +0 -0
  36. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/frames.py +0 -0
  37. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/headers.py +0 -0
  38. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/http11.py +0 -0
  39. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/imports.py +0 -0
  40. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/legacy/__init__.py +0 -0
  41. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/legacy/auth.py +0 -0
  42. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/legacy/client.py +0 -0
  43. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/legacy/exceptions.py +0 -0
  44. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/legacy/framing.py +0 -0
  45. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/legacy/handshake.py +0 -0
  46. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/legacy/http.py +0 -0
  47. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/legacy/protocol.py +0 -0
  48. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/legacy/server.py +0 -0
  49. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/protocol.py +0 -0
  50. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/proxy.py +0 -0
  51. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/py.typed +0 -0
  52. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/server.py +0 -0
  53. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/streams.py +0 -0
  54. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/sync/__init__.py +0 -0
  55. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/sync/client.py +0 -0
  56. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/sync/connection.py +0 -0
  57. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/sync/messages.py +0 -0
  58. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/sync/router.py +0 -0
  59. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/sync/server.py +0 -0
  60. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/sync/utils.py +0 -0
  61. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/trio/__init__.py +0 -0
  62. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/trio/client.py +0 -0
  63. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/trio/connection.py +0 -0
  64. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/trio/messages.py +0 -0
  65. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/trio/router.py +0 -0
  66. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/trio/server.py +0 -0
  67. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/trio/utils.py +0 -0
  68. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/typing.py +0 -0
  69. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/uri.py +0 -0
  70. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/utils.py +0 -0
  71. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_vendor/websockets/version.py +0 -0
  72. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/_version.py +0 -0
  73. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/auth/__init__.py +0 -0
  74. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/auth/consent_form.py +0 -0
  75. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/auth/provider.py +0 -0
  76. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/backup_manager.py +0 -0
  77. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/browser_landing.py +0 -0
  78. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/client/__init__.py +0 -0
  79. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/client/rest_client.py +0 -0
  80. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/client/supervisor_client.py +0 -0
  81. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/client/websocket_client.py +0 -0
  82. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/client/websocket_listener.py +0 -0
  83. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/config.py +0 -0
  84. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  85. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  86. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/dashboard_screenshot/content.py +0 -0
  87. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/dashboard_screenshot/paths.py +0 -0
  88. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  89. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/dashboard_screenshot/theme_guard.py +0 -0
  90. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/errors.py +0 -0
  91. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/hacs_auto_refresh.py +0 -0
  92. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/llm_exposure.py +0 -0
  93. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/policy/__init__.py +0 -0
  94. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/policy/approval_queue.py +0 -0
  95. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/policy/editing.py +0 -0
  96. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/policy/evaluator.py +0 -0
  97. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/policy/handlers.py +0 -0
  98. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/policy/middleware.py +0 -0
  99. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/policy/model.py +0 -0
  100. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/policy/persistence.py +0 -0
  101. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/policy/value_sources.py +0 -0
  102. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/py.typed +0 -0
  103. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/read_only.py +0 -0
  104. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/redaction.py +0 -0
  105. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  106. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  107. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  108. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  109. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  110. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  111. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  112. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  113. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  114. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  115. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  116. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  117. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  118. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  119. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/blueprint-guide.md +0 -0
  120. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  121. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  122. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  123. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  124. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  125. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  126. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  127. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  128. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  129. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  130. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/server.py +0 -0
  131. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/settings_ui/__init__.py +0 -0
  132. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/settings_ui/_handlers_advanced.py +0 -0
  133. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/settings_ui/_handlers_backups.py +0 -0
  134. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/settings_ui/_handlers_fs.py +0 -0
  135. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/settings_ui/_handlers_server.py +0 -0
  136. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/settings_ui/_handlers_theme.py +0 -0
  137. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/settings_ui/_handlers_tools.py +0 -0
  138. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/settings_ui/_i18n.py +0 -0
  139. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/settings_ui/_persistence.py +0 -0
  140. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/settings_ui/_supervisor.py +0 -0
  141. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/settings_ui/_theme.py +0 -0
  142. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/settings_ui/_tools_meta.py +0 -0
  143. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/settings_ui/locales/README.md +0 -0
  144. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/settings_ui/locales/de.json +0 -0
  145. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/settings_ui/locales/en.json +0 -0
  146. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/settings_ui/locales/es.json +0 -0
  147. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/settings_ui/locales/fr.json +0 -0
  148. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/settings_ui/locales/it.json +0 -0
  149. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/settings_ui/locales/nl.json +0 -0
  150. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/settings_ui/locales/pl.json +0 -0
  151. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/settings_ui/locales/ru.json +0 -0
  152. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/settings_ui/locales/sv.json +0 -0
  153. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/settings_ui/locales/zh-Hans.json +0 -0
  154. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/settings_ui/settings.css +0 -0
  155. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/settings_ui/settings.html +0 -0
  156. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/settings_ui/settings.js +0 -0
  157. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/smoke_test.py +0 -0
  158. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  159. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/strict_bps.py +0 -0
  160. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/__init__.py +0 -0
  161. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/auto_backup.py +0 -0
  162. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/backup.py +0 -0
  163. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  164. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/best_practice_result.py +0 -0
  165. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/best_practice_variables.py +0 -0
  166. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/component_api.py +0 -0
  167. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/component_config_reads.py +0 -0
  168. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/component_devices.py +0 -0
  169. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/component_registries.py +0 -0
  170. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/component_registry_lookup.py +0 -0
  171. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  172. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/config_entry_flow_form.py +0 -0
  173. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/config_entry_flow_menu.py +0 -0
  174. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/config_entry_flow_walker.py +0 -0
  175. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/device_control.py +0 -0
  176. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/hacs_registration.py +0 -0
  177. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/helpers.py +0 -0
  178. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/radio/__init__.py +0 -0
  179. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/radio/base.py +0 -0
  180. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/radio/matter.py +0 -0
  181. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/radio/thread.py +0 -0
  182. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  183. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/radio/zwave.py +0 -0
  184. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/reference_validator.py +0 -0
  185. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/registry.py +0 -0
  186. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  187. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  188. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  189. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  190. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  191. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  192. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  193. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  194. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  195. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  196. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_addons.py +0 -0
  197. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_areas.py +0 -0
  198. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  199. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  200. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_calendar.py +0 -0
  201. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_camera.py +0 -0
  202. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_categories.py +0 -0
  203. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_code.py +0 -0
  204. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  205. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  206. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  207. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  208. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  209. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  210. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_dev.py +0 -0
  211. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_energy.py +0 -0
  212. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_entities.py +0 -0
  213. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  214. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_groups.py +0 -0
  215. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_hacs.py +0 -0
  216. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_history.py +0 -0
  217. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_integrations.py +0 -0
  218. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_labels.py +0 -0
  219. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_radio.py +0 -0
  220. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_registry.py +0 -0
  221. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_resources.py +0 -0
  222. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_search.py +0 -0
  223. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_security_policy.py +0 -0
  224. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_service.py +0 -0
  225. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_services.py +0 -0
  226. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_system.py +0 -0
  227. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_themes.py +0 -0
  228. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_todo.py +0 -0
  229. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_traces.py +0 -0
  230. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_updates.py +0 -0
  231. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_utility.py +0 -0
  232. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  233. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  234. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_yaml_read.py +0 -0
  235. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/tools_zones.py +0 -0
  236. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/util_helpers.py +0 -0
  237. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/tools/validation_middleware.py +0 -0
  238. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/transforms/__init__.py +0 -0
  239. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/transforms/categorized_search.py +0 -0
  240. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  241. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/transport_security.py +0 -0
  242. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/update_check.py +0 -0
  243. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/utils/__init__.py +0 -0
  244. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/utils/config_hash.py +0 -0
  245. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/utils/config_write_lock.py +0 -0
  246. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/utils/data_paths.py +0 -0
  247. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/utils/domain_handlers.py +0 -0
  248. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  249. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  250. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/utils/operation_manager.py +0 -0
  251. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/utils/python_sandbox.py +0 -0
  252. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/utils/skill_loader.py +0 -0
  253. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/utils/usage_logger.py +0 -0
  254. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/visibility/__init__.py +0 -0
  255. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/visibility/enforcement.py +0 -0
  256. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/visibility/model.py +0 -0
  257. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/visibility/persistence.py +0 -0
  258. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp/visibility/resolver.py +0 -0
  259. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  260. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  261. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  262. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  263. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/tests/__init__.py +0 -0
  264. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/tests/test_constants.py +0 -0
  265. {ha_mcp_dev-8.2.0.dev2305 → ha_mcp_dev-8.2.0.dev2307}/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: 8.2.0.dev2305
3
+ Version: 8.2.0.dev2307
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
@@ -117,7 +117,7 @@ These run the server outside Home Assistant — useful for **Container** / **Cor
117
117
  - **Docker (HTTP server):** run `ghcr.io/homeassistant-ai/ha-mcp` in HTTP mode, pointed at your Home Assistant URL and a long-lived token, and connect your client to its secret URL. See the [Setup Wizard](https://homeassistant-ai.github.io/ha-mcp/setup/) for the full command and per-client config.
118
118
  - **PyPI / uvx (HTTP server):** run the published `ha-mcp` package with `uvx ha-mcp@latest` (or pip) as a streamable-HTTP server the same way. Details in the [Setup Wizard](https://homeassistant-ai.github.io/ha-mcp/setup/).
119
119
  - **Local stdio (not recommended):** runs ha-mcp on your own machine over stdio. The one-command installers in the **Demo server** section below use this path; the [Setup Wizard](https://homeassistant-ai.github.io/ha-mcp/setup/) covers connecting it to your own Home Assistant.
120
- - **OIDC authentication:** gate remote access behind an external identity provider (Authentik, Keycloak, Auth0, Google, etc.) instead of a secret URL — all authenticated users share the server's Home Assistant credentials. See [OIDC Mode](docs/oidc.md).
120
+ - **OIDC authentication:** gate remote access behind an external identity provider (Authentik, Keycloak, Auth0, etc.) instead of a secret URL — all authenticated users share the server's Home Assistant credentials. See [OIDC Mode](docs/oidc.md).
121
121
 
122
122
  > ⚠️ **stdio has known transport issues.** The stdio transport has connection problems that streamable HTTP does not ([#1713](https://github.com/homeassistant-ai/ha-mcp/issues/1713)). It is recommended only for demo/testing tinkering — for a real setup, use the custom component or an HTTP method above.
123
123
 
@@ -85,7 +85,7 @@ These run the server outside Home Assistant — useful for **Container** / **Cor
85
85
  - **Docker (HTTP server):** run `ghcr.io/homeassistant-ai/ha-mcp` in HTTP mode, pointed at your Home Assistant URL and a long-lived token, and connect your client to its secret URL. See the [Setup Wizard](https://homeassistant-ai.github.io/ha-mcp/setup/) for the full command and per-client config.
86
86
  - **PyPI / uvx (HTTP server):** run the published `ha-mcp` package with `uvx ha-mcp@latest` (or pip) as a streamable-HTTP server the same way. Details in the [Setup Wizard](https://homeassistant-ai.github.io/ha-mcp/setup/).
87
87
  - **Local stdio (not recommended):** runs ha-mcp on your own machine over stdio. The one-command installers in the **Demo server** section below use this path; the [Setup Wizard](https://homeassistant-ai.github.io/ha-mcp/setup/) covers connecting it to your own Home Assistant.
88
- - **OIDC authentication:** gate remote access behind an external identity provider (Authentik, Keycloak, Auth0, Google, etc.) instead of a secret URL — all authenticated users share the server's Home Assistant credentials. See [OIDC Mode](docs/oidc.md).
88
+ - **OIDC authentication:** gate remote access behind an external identity provider (Authentik, Keycloak, Auth0, etc.) instead of a secret URL — all authenticated users share the server's Home Assistant credentials. See [OIDC Mode](docs/oidc.md).
89
89
 
90
90
  > ⚠️ **stdio has known transport issues.** The stdio transport has connection problems that streamable HTTP does not ([#1713](https://github.com/homeassistant-ai/ha-mcp/issues/1713)). It is recommended only for demo/testing tinkering — for a real setup, use the custom component or an HTTP method above.
91
91
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "8.2.0.dev2305"
7
+ version = "8.2.0.dev2307"
8
8
  description = "Home Assistant MCP Server - Complete control of Home Assistant through MCP"
9
9
  readme = "README.md"
10
10
  # Upper bound widened to <3.15 so the package installs on Home Assistant's
@@ -503,15 +503,31 @@ def _setup_logging(log_level_str: str, force: bool = True) -> None:
503
503
  of the sweep ``force`` performs (which removes *and closes* every root
504
504
  handler) so ``ha_report_issue`` keeps its startup diagnostics.
505
505
  """
506
+ log_level = getattr(logging, log_level_str)
507
+
508
+ import fastmcp
509
+
506
510
  from ha_mcp.utils.usage_logger import preserve_startup_collector
507
511
 
508
512
  with preserve_startup_collector():
509
513
  logging.basicConfig(
510
- level=getattr(logging, log_level_str),
514
+ level=log_level,
511
515
  format="%(asctime)s %(name)s %(levelname)s: %(message)s",
512
516
  datefmt=_LOG_DATE_FORMAT,
513
517
  force=force,
514
518
  )
519
+
520
+ fastmcp_logger = logging.getLogger("fastmcp")
521
+ if fastmcp.settings.log_enabled:
522
+ # FastMCP configures its own handler and disables propagation, so the root
523
+ # level above does not control its OIDC diagnostics. Preserve that handler
524
+ # and formatting while honoring ha-mcp's LOG_LEVEL setting.
525
+ fastmcp_logger.setLevel(log_level)
526
+ else:
527
+ # FastMCP deliberately leaves its logger unconfigured when logging is
528
+ # disabled. Prevent that NOTSET namespace from inheriting our root handler.
529
+ fastmcp_logger.setLevel(logging.CRITICAL + 1)
530
+
515
531
  logging.getLogger("mcp.server.streamable_http").addFilter(
516
532
  StatelessSessionLogFilter()
517
533
  )
@@ -1159,7 +1175,7 @@ def _oidc_verify_id_token_enabled() -> bool:
1159
1175
 
1160
1176
  Off by default: FastMCP's OIDCProxy verifies the access token as a JWT,
1161
1177
  which works for providers like Authentik and Keycloak. Providers that
1162
- issue opaque access tokens (Google always; Auth0 without an API
1178
+ issue opaque access tokens (such as Authelia, or Auth0 without an API
1163
1179
  audience) need ``verify_id_token=True`` so FastMCP verifies the ID token
1164
1180
  instead.
1165
1181
  """
@@ -1599,7 +1615,7 @@ def main_oidc() -> None:
1599
1615
  """Run server with OIDC authentication over HTTP.
1600
1616
 
1601
1617
  This mode enables authentication via an external OIDC provider
1602
- (Authentik, Keycloak, Auth0, Google, etc.). All authenticated users
1618
+ (Authentik, Keycloak, Auth0, etc.). All authenticated users
1603
1619
  share the same Home Assistant instance via the configured credentials.
1604
1620
 
1605
1621
  Unlike OAuth mode which collects per-user HA credentials via a consent form,
@@ -1621,7 +1637,7 @@ def main_oidc() -> None:
1621
1637
  patterns accepted from dynamically-registered clients. Strongly recommended for
1622
1638
  internet-facing deployments.
1623
1639
  - OIDC_VERIFY_ID_TOKEN (optional, default: false): Set true for providers that issue
1624
- opaque access tokens (e.g. Google, or Auth0 without an API audience).
1640
+ opaque access tokens (e.g. Authelia, or Auth0 without an API audience).
1625
1641
  - OIDC_AUDIENCE (optional): Expected `aud` claim for IdP-issued access tokens.
1626
1642
  Without it (and with OIDC_VERIFY_ID_TOKEN off), FastMCP's JWT verifier checks
1627
1643
  issuer, signature, and expiry but not audience. With OIDC_VERIFY_ID_TOKEN=true,
@@ -1638,6 +1654,8 @@ def main_oidc() -> None:
1638
1654
  - HA_MCP_DISABLE_SETTINGS_UI (optional): set truthy to not serve the
1639
1655
  settings UI at all
1640
1656
  - LOG_LEVEL (optional, default: INFO)
1657
+ - FASTMCP_LOG_ENABLED (optional, default: true): Set false to suppress
1658
+ FastMCP framework logs while leaving ha-mcp logs at LOG_LEVEL.
1641
1659
  """
1642
1660
  # Configure logging for OIDC mode (force=True needed since logging may already be configured)
1643
1661
  log_level = os.getenv("LOG_LEVEL", "INFO").upper()
@@ -1723,8 +1741,7 @@ async def _run_oidc_server(
1723
1741
  port: Port to listen on
1724
1742
  path: MCP endpoint path
1725
1743
  """
1726
- from fastmcp.server.auth.oidc_proxy import OIDCProxy
1727
-
1744
+ from ha_mcp.auth.oidc_compat import HaMcpOIDCProxy
1728
1745
  from ha_mcp.server import HomeAssistantSmartMCPServer
1729
1746
  from ha_mcp.transport_security import ensure_host_origin_guard_default_off
1730
1747
 
@@ -1742,6 +1759,11 @@ async def _run_oidc_server(
1742
1759
  # IdP (Authentik, Keycloak, etc.) -- unlike `False`, this does not
1743
1760
  # log a security warning at startup that consent is disabled.
1744
1761
  "require_authorization_consent": "external",
1762
+ # This entrypoint provides OIDC, so request the protocol-level scope
1763
+ # that makes upstream providers return an ID token. FastMCP also
1764
+ # advertises this scope through protected resource metadata so MCP
1765
+ # clients include it in the authorization flow.
1766
+ "required_scopes": ["openid"],
1745
1767
  # Preserve `or None`: an empty-but-set env var must not bypass
1746
1768
  # FastMCP's derive-from-client-secret default for jwt_signing_key.
1747
1769
  "jwt_signing_key": os.getenv("OIDC_JWT_SIGNING_KEY") or None,
@@ -1765,7 +1787,8 @@ async def _run_oidc_server(
1765
1787
  proxy_kwargs["audience"] = audience
1766
1788
 
1767
1789
  # Create OIDC auth provider — auto-discovers endpoints from config_url
1768
- auth = OIDCProxy(**proxy_kwargs)
1790
+ auth = HaMcpOIDCProxy(**proxy_kwargs)
1791
+ auth.setup_scope_compatibility()
1769
1792
 
1770
1793
  # Standard server with shared credentials (no proxy client needed)
1771
1794
  global _server
@@ -0,0 +1,106 @@
1
+ """FastMCP OIDC compatibility behavior scoped to ha-mcp's OIDC entrypoint."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import logging
6
+ from typing import override
7
+
8
+ from fastmcp.server.auth.oauth_proxy.models import ProxyDCRClient
9
+ from fastmcp.server.auth.oidc_proxy import OIDCProxy
10
+ from mcp.server.auth.provider import AuthorizationParams, RefreshToken
11
+ from mcp.shared.auth import OAuthClientInformationFull
12
+
13
+ logger = logging.getLogger(__name__)
14
+
15
+
16
+ class HaMcpOIDCProxy(OIDCProxy):
17
+ """OIDC proxy with ha-mcp's FastMCP 3.4.6 compatibility behavior."""
18
+
19
+ def _add_required_scopes(self, scopes: list[str]) -> list[str]:
20
+ """Prepend any configured required scopes missing from ``scopes``."""
21
+ missing_scopes = [
22
+ scope for scope in self.required_scopes if scope not in scopes
23
+ ]
24
+ return [*missing_scopes, *scopes]
25
+
26
+ def setup_scope_compatibility(self) -> None:
27
+ """Allow optional DCR scopes without advertising them as requirements.
28
+
29
+ FastMCP 3.4.6 copies ``required_scopes`` into both the DCR default and
30
+ valid-scope allow-list. The MCP SDK then rejects clients that add
31
+ ordinary optional OIDC scopes. ``None`` restores upstream IdP scope
32
+ validation while FastMCP continues to default, advertise, and enforce
33
+ ha-mcp's required ``openid`` scope.
34
+ """
35
+ if self.required_scopes != ["openid"]:
36
+ raise RuntimeError(
37
+ "HaMcpOIDCProxy requires exactly the openid scope before setup"
38
+ )
39
+ options = self.client_registration_options
40
+ if options is None:
41
+ raise RuntimeError("FastMCP OIDCProxy did not enable client registration")
42
+ if options.default_scopes != ["openid"] or self._default_scope_str != "openid":
43
+ raise RuntimeError("FastMCP OIDCProxy did not preserve the openid default")
44
+ options.valid_scopes = None
45
+
46
+ @override
47
+ async def register_client(self, client_info: OAuthClientInformationFull) -> None:
48
+ """Persist DCR clients with every required scope included."""
49
+ current_scopes = client_info.scope.split() if client_info.scope else []
50
+ normalized_scopes = self._add_required_scopes(current_scopes)
51
+ if normalized_scopes != current_scopes:
52
+ client_info.scope = " ".join(normalized_scopes)
53
+ await super().register_client(client_info)
54
+
55
+ @override
56
+ async def authorize(
57
+ self,
58
+ client: OAuthClientInformationFull,
59
+ params: AuthorizationParams,
60
+ ) -> str:
61
+ """Forward every authorization with required scopes included."""
62
+ current_scopes = params.scopes or []
63
+ normalized_scopes = self._add_required_scopes(current_scopes)
64
+ if normalized_scopes != current_scopes:
65
+ params = params.model_copy(update={"scopes": normalized_scopes})
66
+ return await super().authorize(client, params)
67
+
68
+ @override
69
+ async def get_client(self, client_id: str) -> OAuthClientInformationFull | None:
70
+ """Load a client, adding required scopes to persisted legacy records once."""
71
+ was_persisted = await self._client_store.get(key=client_id) is not None
72
+ client = await super().get_client(client_id)
73
+ if client is None or not was_persisted:
74
+ return client
75
+ if not isinstance(client, ProxyDCRClient):
76
+ raise RuntimeError("FastMCP returned an unexpected persisted client type")
77
+
78
+ current_scopes = client.scope.split() if client.scope else []
79
+ normalized_scopes = self._add_required_scopes(current_scopes)
80
+ if normalized_scopes == current_scopes:
81
+ return client
82
+
83
+ migrated = client.model_copy(update={"scope": " ".join(normalized_scopes)})
84
+ await self._client_store.put(key=client_id, value=migrated)
85
+ return migrated
86
+
87
+ @override
88
+ async def load_refresh_token(
89
+ self,
90
+ client: OAuthClientInformationFull,
91
+ refresh_token: str,
92
+ ) -> RefreshToken | None:
93
+ """Reject legacy refresh tokens that predate required OIDC scopes."""
94
+ loaded = await super().load_refresh_token(client, refresh_token)
95
+ if loaded is None:
96
+ return None
97
+ missing_scopes = set(self.required_scopes) - set(loaded.scopes)
98
+ if missing_scopes:
99
+ logger.debug(
100
+ "Rejecting legacy refresh token for client_id=%s: "
101
+ "missing required scopes %s",
102
+ client.client_id,
103
+ sorted(missing_scopes),
104
+ )
105
+ return None
106
+ return loaded
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 8.2.0.dev2305
3
+ Version: 8.2.0.dev2307
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
@@ -117,7 +117,7 @@ These run the server outside Home Assistant — useful for **Container** / **Cor
117
117
  - **Docker (HTTP server):** run `ghcr.io/homeassistant-ai/ha-mcp` in HTTP mode, pointed at your Home Assistant URL and a long-lived token, and connect your client to its secret URL. See the [Setup Wizard](https://homeassistant-ai.github.io/ha-mcp/setup/) for the full command and per-client config.
118
118
  - **PyPI / uvx (HTTP server):** run the published `ha-mcp` package with `uvx ha-mcp@latest` (or pip) as a streamable-HTTP server the same way. Details in the [Setup Wizard](https://homeassistant-ai.github.io/ha-mcp/setup/).
119
119
  - **Local stdio (not recommended):** runs ha-mcp on your own machine over stdio. The one-command installers in the **Demo server** section below use this path; the [Setup Wizard](https://homeassistant-ai.github.io/ha-mcp/setup/) covers connecting it to your own Home Assistant.
120
- - **OIDC authentication:** gate remote access behind an external identity provider (Authentik, Keycloak, Auth0, Google, etc.) instead of a secret URL — all authenticated users share the server's Home Assistant credentials. See [OIDC Mode](docs/oidc.md).
120
+ - **OIDC authentication:** gate remote access behind an external identity provider (Authentik, Keycloak, Auth0, etc.) instead of a secret URL — all authenticated users share the server's Home Assistant credentials. See [OIDC Mode](docs/oidc.md).
121
121
 
122
122
  > ⚠️ **stdio has known transport issues.** The stdio transport has connection problems that streamable HTTP does not ([#1713](https://github.com/homeassistant-ai/ha-mcp/issues/1713)). It is recommended only for demo/testing tinkering — for a real setup, use the custom component or an HTTP method above.
123
123
 
@@ -82,6 +82,7 @@ src/ha_mcp/_vendor/websockets/trio/server.py
82
82
  src/ha_mcp/_vendor/websockets/trio/utils.py
83
83
  src/ha_mcp/auth/__init__.py
84
84
  src/ha_mcp/auth/consent_form.py
85
+ src/ha_mcp/auth/oidc_compat.py
85
86
  src/ha_mcp/auth/provider.py
86
87
  src/ha_mcp/client/__init__.py
87
88
  src/ha_mcp/client/rest_client.py