ha-mcp-dev 7.9.0.dev768__tar.gz → 7.9.0.dev769__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 (159) hide show
  1. {ha_mcp_dev-7.9.0.dev768/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.9.0.dev769}/PKG-INFO +1 -1
  2. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/pyproject.toml +1 -1
  3. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/validation_middleware.py +21 -6
  4. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  5. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/LICENSE +0 -0
  6. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/MANIFEST.in +0 -0
  7. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/README.md +0 -0
  8. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/setup.cfg +0 -0
  9. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/__init__.py +0 -0
  10. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/__main__.py +0 -0
  11. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/_pypi_marker +0 -0
  12. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/_version.py +0 -0
  13. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/auth/__init__.py +0 -0
  14. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/auth/consent_form.py +0 -0
  15. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/auth/provider.py +0 -0
  16. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/backup_manager.py +0 -0
  17. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/client/__init__.py +0 -0
  18. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/client/rest_client.py +0 -0
  19. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/client/supervisor_client.py +0 -0
  20. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/client/websocket_client.py +0 -0
  21. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/client/websocket_listener.py +0 -0
  22. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/config.py +0 -0
  23. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/dashboard_screenshot/__init__.py +0 -0
  24. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/dashboard_screenshot/capture.py +0 -0
  25. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/dashboard_screenshot/provision.py +0 -0
  26. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/errors.py +0 -0
  27. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/policy/__init__.py +0 -0
  28. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/policy/approval_queue.py +0 -0
  29. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/policy/evaluator.py +0 -0
  30. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/policy/handlers.py +0 -0
  31. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/policy/middleware.py +0 -0
  32. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/policy/model.py +0 -0
  33. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/policy/persistence.py +0 -0
  34. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/policy/value_sources.py +0 -0
  35. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/py.typed +0 -0
  36. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/read_only.py +0 -0
  37. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  38. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  39. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  40. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  41. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/.github/pull_request_template.md +0 -0
  42. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  43. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  44. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  45. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  46. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  47. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  48. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  49. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/appdaemon.md +0 -0
  50. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  51. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  52. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  53. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  54. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  55. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  56. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  57. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  58. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/scenes.md +0 -0
  59. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  60. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/yaml-only-integrations.md +0 -0
  61. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/server.py +0 -0
  62. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/settings_ui/__init__.py +0 -0
  63. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/settings_ui/settings.css +0 -0
  64. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/settings_ui/settings.html +0 -0
  65. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/settings_ui/settings.js +0 -0
  66. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/smoke_test.py +0 -0
  67. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/stdio_settings_sidecar.py +0 -0
  68. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/__init__.py +0 -0
  69. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/auto_backup.py +0 -0
  70. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/backup.py +0 -0
  71. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  72. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/config_entry_flow.py +0 -0
  73. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/device_control.py +0 -0
  74. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/enhanced.py +0 -0
  75. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/helpers.py +0 -0
  76. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/radio/__init__.py +0 -0
  77. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/radio/base.py +0 -0
  78. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/radio/matter.py +0 -0
  79. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/radio/thread.py +0 -0
  80. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/radio/zigbee.py +0 -0
  81. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/radio/zwave.py +0 -0
  82. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/reference_validator.py +0 -0
  83. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/registry.py +0 -0
  84. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/smart_search/__init__.py +0 -0
  85. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/smart_search/_base.py +0 -0
  86. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/smart_search/_config.py +0 -0
  87. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/smart_search/_deep.py +0 -0
  88. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/smart_search/_entities.py +0 -0
  89. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/smart_search/_fetch.py +0 -0
  90. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/smart_search/_overview.py +0 -0
  91. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/smart_search/_scenes.py +0 -0
  92. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/smart_search/_scoring.py +0 -0
  93. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tool_search_hint_middleware.py +0 -0
  94. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_addons.py +0 -0
  95. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_areas.py +0 -0
  96. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  97. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  98. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_calendar.py +0 -0
  99. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_camera.py +0 -0
  100. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_categories.py +0 -0
  101. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_code.py +0 -0
  102. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  103. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  104. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  105. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  106. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  107. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_dashboard_screenshot.py +0 -0
  108. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_energy.py +0 -0
  109. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_entities.py +0 -0
  110. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  111. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_groups.py +0 -0
  112. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_hacs.py +0 -0
  113. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_history.py +0 -0
  114. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_integrations.py +0 -0
  115. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_labels.py +0 -0
  116. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
  117. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_radio.py +0 -0
  118. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_registry.py +0 -0
  119. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_resources.py +0 -0
  120. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_search.py +0 -0
  121. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_service.py +0 -0
  122. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_services.py +0 -0
  123. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_system.py +0 -0
  124. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_themes.py +0 -0
  125. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_todo.py +0 -0
  126. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_traces.py +0 -0
  127. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_updates.py +0 -0
  128. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_utility.py +0 -0
  129. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  130. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  131. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/tools_zones.py +0 -0
  132. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/tools/util_helpers.py +0 -0
  133. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/transforms/__init__.py +0 -0
  134. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/transforms/categorized_search.py +0 -0
  135. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  136. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/transport_security.py +0 -0
  137. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/update_check.py +0 -0
  138. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/utils/__init__.py +0 -0
  139. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/utils/config_hash.py +0 -0
  140. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/utils/data_paths.py +0 -0
  141. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/utils/domain_handlers.py +0 -0
  142. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  143. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  144. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/utils/operation_manager.py +0 -0
  145. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/utils/python_sandbox.py +0 -0
  146. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/utils/skill_loader.py +0 -0
  147. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/utils/usage_logger.py +0 -0
  148. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/visibility/__init__.py +0 -0
  149. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/visibility/model.py +0 -0
  150. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/visibility/persistence.py +0 -0
  151. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp/visibility/resolver.py +0 -0
  152. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  153. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  154. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  155. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  156. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  157. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/tests/__init__.py +0 -0
  158. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/tests/test_constants.py +0 -0
  159. {ha_mcp_dev-7.9.0.dev768 → ha_mcp_dev-7.9.0.dev769}/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.9.0.dev768
3
+ Version: 7.9.0.dev769
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.9.0.dev768"
7
+ version = "7.9.0.dev769"
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
@@ -1,9 +1,11 @@
1
1
  """FastMCP middleware that converts Pydantic validation errors to structured ToolErrors.
2
2
 
3
3
  When a model passes the wrong type for a tool parameter (e.g. a JSON string where
4
- a dict is required), FastMCP raises a PydanticValidationError with a raw message
5
- like "Input should be a valid dictionary". This middleware intercepts those errors
6
- and converts them to ha-mcp's structured format with actionable guidance.
4
+ a dict is required), FastMCP surfaces a validation error with a raw message like
5
+ "Input should be a valid dictionary" -- a bare ``pydantic.ValidationError`` on
6
+ older FastMCP, or a ``fastmcp.exceptions.ValidationError`` wrapping it (chained
7
+ via ``from e``) on FastMCP >= 3.4.3. This middleware intercepts either shape and
8
+ converts it to ha-mcp's structured format with actionable guidance.
7
9
  """
8
10
 
9
11
  from __future__ import annotations
@@ -11,6 +13,7 @@ from __future__ import annotations
11
13
  import logging
12
14
  from typing import Any
13
15
 
16
+ from fastmcp.exceptions import ValidationError as FastMCPValidationError
14
17
  from fastmcp.server.middleware.middleware import CallNext, Middleware, MiddlewareContext
15
18
  from pydantic import ValidationError as PydanticValidationError
16
19
 
@@ -40,9 +43,20 @@ class ValidationErrorMiddleware(Middleware):
40
43
  self, context: MiddlewareContext, call_next: CallNext
41
44
  ) -> Any:
42
45
  try:
43
- return await call_next(context)
44
- except PydanticValidationError as exc:
45
- errors = exc.errors(include_url=False)
46
+ result = await call_next(context)
47
+ except (PydanticValidationError, FastMCPValidationError) as exc:
48
+ # fastmcp >= 3.4.3 re-raises an argument-validation failure as
49
+ # ``fastmcp.exceptions.ValidationError`` wrapping the pydantic error
50
+ # (chained via ``from e``); older fastmcp raises the pydantic error
51
+ # directly. Recover the pydantic errors from whichever shape arrived,
52
+ # and let any other fastmcp ValidationError (e.g. a return-value
53
+ # failure with no pydantic cause) propagate unchanged.
54
+ pydantic_exc = (
55
+ exc if isinstance(exc, PydanticValidationError) else exc.__cause__
56
+ )
57
+ if not isinstance(pydantic_exc, PydanticValidationError):
58
+ raise
59
+ errors = pydantic_exc.errors(include_url=False)
46
60
  # Group by the real argument path. A union param like
47
61
  # `str | list[str]` emits one error per arm with loc (param, "str"),
48
62
  # (param, "list[str]"); without grouping the user saw `param.str` /
@@ -73,3 +87,4 @@ class ValidationErrorMiddleware(Middleware):
73
87
  details=", ".join(dict.fromkeys(err["type"] for err in errors)),
74
88
  )
75
89
  )
90
+ return result
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 7.9.0.dev768
3
+ Version: 7.9.0.dev769
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