ha-mcp-dev 7.8.1.dev720__tar.gz → 7.8.1.dev722__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 (144) hide show
  1. {ha_mcp_dev-7.8.1.dev720/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.8.1.dev722}/PKG-INFO +1 -1
  2. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/pyproject.toml +1 -1
  3. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_integrations.py +88 -0
  4. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  5. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/LICENSE +0 -0
  6. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/MANIFEST.in +0 -0
  7. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/README.md +0 -0
  8. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/setup.cfg +0 -0
  9. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/__init__.py +0 -0
  10. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/__main__.py +0 -0
  11. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/_pypi_marker +0 -0
  12. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/_version.py +0 -0
  13. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/auth/__init__.py +0 -0
  14. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/auth/consent_form.py +0 -0
  15. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/auth/provider.py +0 -0
  16. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/backup_manager.py +0 -0
  17. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/client/__init__.py +0 -0
  18. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/client/rest_client.py +0 -0
  19. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/client/supervisor_client.py +0 -0
  20. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/client/websocket_client.py +0 -0
  21. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/client/websocket_listener.py +0 -0
  22. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/config.py +0 -0
  23. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  24. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  25. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  26. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/errors.py +0 -0
  27. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/policy/__init__.py +0 -0
  28. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/policy/approval_queue.py +0 -0
  29. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/policy/evaluator.py +0 -0
  30. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/policy/handlers.py +0 -0
  31. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/policy/middleware.py +0 -0
  32. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/policy/model.py +0 -0
  33. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/policy/persistence.py +0 -0
  34. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/policy/value_sources.py +0 -0
  35. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/py.typed +0 -0
  36. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/read_only.py +0 -0
  37. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  38. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  39. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  40. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  41. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  42. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  43. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  44. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  45. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  46. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  47. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  48. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  49. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  50. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  51. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  52. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  53. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  54. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  55. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  56. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  57. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  58. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  59. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/server.py +0 -0
  60. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/settings.css +0 -0
  61. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/settings.js +0 -0
  62. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/settings_ui.py +0 -0
  63. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/smoke_test.py +0 -0
  64. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  65. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/__init__.py +0 -0
  66. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/auto_backup.py +0 -0
  67. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/backup.py +0 -0
  68. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  69. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  70. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/device_control.py +0 -0
  71. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/enhanced.py +0 -0
  72. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/helpers.py +0 -0
  73. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/reference_validator.py +0 -0
  74. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/registry.py +0 -0
  75. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  76. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  77. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  78. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  79. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  80. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  81. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  82. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  83. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  84. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  85. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_addons.py +0 -0
  86. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_areas.py +0 -0
  87. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  88. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  89. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_calendar.py +0 -0
  90. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_camera.py +0 -0
  91. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_categories.py +0 -0
  92. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_code.py +0 -0
  93. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  94. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  95. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  96. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  97. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  98. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  99. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_energy.py +0 -0
  100. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_entities.py +0 -0
  101. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  102. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_groups.py +0 -0
  103. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_hacs.py +0 -0
  104. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_history.py +0 -0
  105. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_labels.py +0 -0
  106. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
  107. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_registry.py +0 -0
  108. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_resources.py +0 -0
  109. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_search.py +0 -0
  110. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_service.py +0 -0
  111. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_services.py +0 -0
  112. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_system.py +0 -0
  113. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_themes.py +0 -0
  114. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_todo.py +0 -0
  115. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_traces.py +0 -0
  116. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_updates.py +0 -0
  117. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_utility.py +0 -0
  118. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  119. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  120. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/tools_zones.py +0 -0
  121. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/util_helpers.py +0 -0
  122. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/tools/validation_middleware.py +0 -0
  123. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/transforms/__init__.py +0 -0
  124. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/transforms/categorized_search.py +0 -0
  125. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  126. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/update_check.py +0 -0
  127. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/utils/__init__.py +0 -0
  128. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/utils/config_hash.py +0 -0
  129. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/utils/data_paths.py +0 -0
  130. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/utils/domain_handlers.py +0 -0
  131. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  132. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  133. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/utils/operation_manager.py +0 -0
  134. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/utils/python_sandbox.py +0 -0
  135. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/utils/skill_loader.py +0 -0
  136. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp/utils/usage_logger.py +0 -0
  137. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  138. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  139. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  140. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  141. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  142. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/tests/__init__.py +0 -0
  143. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/tests/test_constants.py +0 -0
  144. {ha_mcp_dev-7.8.1.dev720 → ha_mcp_dev-7.8.1.dev722}/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.8.1.dev720
3
+ Version: 7.8.1.dev722
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.8.1.dev720"
7
+ version = "7.8.1.dev722"
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"
@@ -445,6 +445,25 @@ class IntegrationTools:
445
445
  default=False,
446
446
  ),
447
447
  ] = False,
448
+ include_knx_project: Annotated[
449
+ bool,
450
+ Field(
451
+ description=(
452
+ "When entry_id is a KNX config entry, also return the parsed "
453
+ "ETS project: the full group-address table (address, name, "
454
+ "DPT, description) under knx_project.group_addresses, plus the "
455
+ "group-range hierarchy and project metadata. This is the "
456
+ "parsed-project GA table that is NOT in the diagnostics dump; "
457
+ "per-entity GA assignments are already covered by "
458
+ "include_diagnostics (config_store / configuration_yaml). "
459
+ "Ignored (with a warning) when the entry is not a KNX "
460
+ "integration. The KNX integration exposes a single project, "
461
+ "so the result is the same regardless of which KNX entry_id "
462
+ "is used."
463
+ ),
464
+ default=False,
465
+ ),
466
+ ] = False,
448
467
  device_id: Annotated[
449
468
  str | None,
450
469
  Field(
@@ -553,6 +572,7 @@ class IntegrationTools:
553
572
  - Get entry with editable fields: ha_get_integration(entry_id="abc123", include_schema=True)
554
573
  - Get entry with diagnostics dump: ha_get_integration(entry_id="abc123", include_diagnostics=True)
555
574
  - Get device-scoped diagnostics: ha_get_integration(entry_id="abc123", include_diagnostics=True, device_id="dev123")
575
+ - Get the parsed KNX ETS project (group-address table): ha_get_integration(entry_id="<knx entry>", include_knx_project=True)
556
576
  - Walk a sub-tree: ha_get_integration(entry_id="abc123", include_diagnostics=True, diagnostics_data_path="<dotted-path>")
557
577
  - Paginate a large list: ha_get_integration(entry_id="abc123", include_diagnostics=True, diagnostics_data_path="<list-valued path>", diagnostics_data_limit=10, diagnostics_data_offset=20)
558
578
  - List config subentries: ha_get_integration(entry_id="abc123", include_subentries=True)
@@ -580,6 +600,7 @@ class IntegrationTools:
580
600
  include_opts = include_options
581
601
  include_schema_bool = include_schema
582
602
  include_diagnostics_bool = include_diagnostics
603
+ include_knx_project_bool = include_knx_project
583
604
  include_subentries_bool = include_subentries
584
605
  include_subentry_schema_bool = include_subentry_schema
585
606
  show_advanced_options_bool = show_advanced_options
@@ -639,6 +660,8 @@ class IntegrationTools:
639
660
  "device_id was provided but ignored because "
640
661
  "include_diagnostics=False"
641
662
  )
663
+ if include_knx_project_bool:
664
+ await self._attach_knx_project(resp, entry_id)
642
665
  return resp
643
666
 
644
667
  # List mode - get all config entries
@@ -648,6 +671,8 @@ class IntegrationTools:
648
671
  ignored_detail_params = []
649
672
  if include_diagnostics_bool:
650
673
  ignored_detail_params.append("include_diagnostics")
674
+ if include_knx_project_bool:
675
+ ignored_detail_params.append("include_knx_project")
651
676
  if device_id is not None:
652
677
  ignored_detail_params.append("device_id")
653
678
  if fields_list is not None:
@@ -777,6 +802,69 @@ class IntegrationTools:
777
802
  )
778
803
  return None # unreachable: exception_to_structured_error raises
779
804
 
805
+ async def _attach_knx_project(self, resp: dict[str, Any], entry_id: str) -> None:
806
+ """Attach the parsed KNX ETS project to a single-entry response.
807
+
808
+ Reads ``knx/get_knx_project`` (the same command the KNX panel uses) and
809
+ attaches the group-address table, group-range hierarchy, and project
810
+ metadata under ``resp["knx_project"]``. The KNX integration exposes one
811
+ project globally, so the command takes no entry scope; this is gated on
812
+ the entry actually being a KNX integration to avoid attaching unrelated
813
+ data to a non-KNX entry.
814
+
815
+ Failures are surfaced as warnings rather than raised — the primary
816
+ entry read already succeeded, mirroring how diagnostics fetch failures
817
+ are handled. The "KNX integration not loaded" case collapses into
818
+ ha_get_integration's existing no-such-entry handling (no KNX entry → no
819
+ entry_id to pass here), so it needs no special casing.
820
+ """
821
+ entry = resp.get("entry") if isinstance(resp.get("entry"), dict) else {}
822
+ domain = entry.get("domain") if isinstance(entry, dict) else None
823
+ if domain != "knx":
824
+ resp.setdefault("warnings", []).append(
825
+ f"include_knx_project ignored: entry {entry_id} is not a KNX "
826
+ f"integration (domain={domain!r})"
827
+ )
828
+ return
829
+
830
+ result = await self._client.send_websocket_message(
831
+ {"type": "knx/get_knx_project"}
832
+ )
833
+ if not isinstance(result, dict) or not result.get("success"):
834
+ error_msg = websocket_error_message(
835
+ result.get("error", "Unknown error")
836
+ if isinstance(result, dict)
837
+ else result
838
+ )
839
+ resp.setdefault("warnings", []).append(
840
+ f"Failed to fetch KNX project: {error_msg}"
841
+ )
842
+ return
843
+
844
+ project = result.get("result")
845
+ if not project:
846
+ # No ETS project uploaded yet — get_knxproject() returns None.
847
+ resp["knx_project"] = {
848
+ "count": 0,
849
+ "group_addresses": {},
850
+ "group_ranges": {},
851
+ "info": {},
852
+ "note": (
853
+ "The KNX integration is loaded but no ETS project has been "
854
+ "uploaded yet. Upload a .knxproj file via the KNX panel to "
855
+ "populate the group-address table."
856
+ ),
857
+ }
858
+ return
859
+
860
+ group_addresses = project.get("group_addresses", {})
861
+ resp["knx_project"] = {
862
+ "count": len(group_addresses),
863
+ "group_addresses": group_addresses,
864
+ "group_ranges": project.get("group_ranges", {}),
865
+ "info": project.get("info", {}),
866
+ }
867
+
780
868
  async def _fetch_config_subentries(self, entry_id: str) -> list[dict[str, Any]]:
781
869
  """Fetch config subentries for a detailed entry response."""
782
870
  result = await self._client.list_config_subentries(entry_id)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 7.8.1.dev720
3
+ Version: 7.8.1.dev722
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