ha-mcp-dev 7.3.0.dev397__tar.gz → 7.3.0.dev398__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 (103) hide show
  1. {ha_mcp_dev-7.3.0.dev397/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.3.0.dev398}/PKG-INFO +1 -1
  2. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/pyproject.toml +1 -1
  3. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/__main__.py +33 -0
  4. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  5. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/LICENSE +0 -0
  6. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/MANIFEST.in +0 -0
  7. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/README.md +0 -0
  8. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/setup.cfg +0 -0
  9. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/__init__.py +0 -0
  10. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/_pypi_marker +0 -0
  11. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/auth/__init__.py +0 -0
  12. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/auth/consent_form.py +0 -0
  13. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/auth/provider.py +0 -0
  14. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/client/__init__.py +0 -0
  15. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/client/rest_client.py +0 -0
  16. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/client/websocket_client.py +0 -0
  17. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/client/websocket_listener.py +0 -0
  18. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/config.py +0 -0
  19. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/errors.py +0 -0
  20. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/py.typed +0 -0
  21. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  22. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  23. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  24. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  25. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  26. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  27. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  28. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  29. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  30. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  31. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  32. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  33. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  34. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  35. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  36. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  37. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  38. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  39. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  40. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  41. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/server.py +0 -0
  42. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/smoke_test.py +0 -0
  43. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/__init__.py +0 -0
  44. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/backup.py +0 -0
  45. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  46. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/device_control.py +0 -0
  47. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/enhanced.py +0 -0
  48. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/helpers.py +0 -0
  49. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/reference_validator.py +0 -0
  50. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/registry.py +0 -0
  51. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/smart_search.py +0 -0
  52. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/tools_addons.py +0 -0
  53. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/tools_areas.py +0 -0
  54. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  55. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  56. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/tools_calendar.py +0 -0
  57. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/tools_camera.py +0 -0
  58. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/tools_categories.py +0 -0
  59. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  60. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  61. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/tools_config_entry_flow.py +0 -0
  62. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  63. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  64. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/tools_energy.py +0 -0
  65. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/tools_entities.py +0 -0
  66. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  67. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/tools_groups.py +0 -0
  68. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/tools_hacs.py +0 -0
  69. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/tools_history.py +0 -0
  70. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/tools_integrations.py +0 -0
  71. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/tools_labels.py +0 -0
  72. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
  73. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/tools_registry.py +0 -0
  74. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/tools_resources.py +0 -0
  75. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/tools_search.py +0 -0
  76. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/tools_service.py +0 -0
  77. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/tools_services.py +0 -0
  78. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/tools_system.py +0 -0
  79. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/tools_todo.py +0 -0
  80. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/tools_traces.py +0 -0
  81. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/tools_updates.py +0 -0
  82. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/tools_utility.py +0 -0
  83. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  84. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  85. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/tools_zones.py +0 -0
  86. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/tools/util_helpers.py +0 -0
  87. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/transforms/__init__.py +0 -0
  88. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/transforms/categorized_search.py +0 -0
  89. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/utils/__init__.py +0 -0
  90. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/utils/config_hash.py +0 -0
  91. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/utils/domain_handlers.py +0 -0
  92. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  93. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/utils/operation_manager.py +0 -0
  94. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/utils/python_sandbox.py +0 -0
  95. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp/utils/usage_logger.py +0 -0
  96. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  97. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  98. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  99. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  100. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  101. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/tests/__init__.py +0 -0
  102. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/tests/test_constants.py +0 -0
  103. {ha_mcp_dev-7.3.0.dev397 → ha_mcp_dev-7.3.0.dev398}/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.3.0.dev397
3
+ Version: 7.3.0.dev398
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.3.0.dev397"
7
+ version = "7.3.0.dev398"
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"
@@ -30,6 +30,8 @@ import threading # noqa: E402
30
30
  from collections.abc import Coroutine # noqa: E402
31
31
  from typing import TYPE_CHECKING, Any # noqa: E402
32
32
 
33
+ from fastmcp.exceptions import ToolError # noqa: E402
34
+ from pydantic import ValidationError as PydanticValidationError # noqa: E402
33
35
  from starlette.requests import Request # noqa: E402
34
36
  from starlette.responses import PlainTextResponse # noqa: E402
35
37
 
@@ -365,6 +367,36 @@ class StatelessSessionLogFilter(logging.Filter):
365
367
  return True
366
368
 
367
369
 
370
+ class ToolValidationLogFilter(logging.Filter):
371
+ """Demote fastmcp tool-failure tracebacks to single-line warnings.
372
+
373
+ Pydantic ValidationError and tool-raised ToolError aren't server bugs,
374
+ so the traceback through fastmcp/pydantic internals is just noise. The
375
+ structured error detail is preserved in the WARNING message; stack is
376
+ intentionally dropped because these are user-input errors, not bugs.
377
+ """
378
+
379
+ def filter(self, record: logging.LogRecord) -> bool:
380
+ if record.name != "fastmcp.server.server" or not record.exc_info:
381
+ return True
382
+
383
+ msg = record.getMessage()
384
+ err = record.exc_info[1]
385
+ if "Error validating tool" in msg and isinstance(err, PydanticValidationError):
386
+ record.msg = f"{msg}: {err.errors(include_url=False)}"
387
+ elif "Error calling tool" in msg and isinstance(err, ToolError):
388
+ record.msg = f"{msg}: {err}"
389
+ else:
390
+ return True
391
+
392
+ record.args = ()
393
+ record.levelno = logging.WARNING
394
+ record.levelname = "WARNING"
395
+ record.exc_info = None
396
+ record.exc_text = None
397
+ return True
398
+
399
+
368
400
  def _setup_logging(log_level_str: str, force: bool = False) -> None:
369
401
  """Configure root logger with consistent timestamp format."""
370
402
  logging.basicConfig(
@@ -376,6 +408,7 @@ def _setup_logging(log_level_str: str, force: bool = False) -> None:
376
408
  logging.getLogger("mcp.server.streamable_http").addFilter(
377
409
  StatelessSessionLogFilter()
378
410
  )
411
+ logging.getLogger("fastmcp.server.server").addFilter(ToolValidationLogFilter())
379
412
 
380
413
 
381
414
  def _get_timestamped_uvicorn_log_config() -> dict:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 7.3.0.dev397
3
+ Version: 7.3.0.dev398
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