ha-mcp-dev 7.0.0.dev279__tar.gz → 7.0.0.dev280__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 (95) hide show
  1. {ha_mcp_dev-7.0.0.dev279/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.0.0.dev280}/PKG-INFO +2 -1
  2. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/README.md +1 -0
  3. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/pyproject.toml +1 -1
  4. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/utils/python_sandbox.py +9 -3
  5. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280/src/ha_mcp_dev.egg-info}/PKG-INFO +2 -1
  6. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/LICENSE +0 -0
  7. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/MANIFEST.in +0 -0
  8. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/setup.cfg +0 -0
  9. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/__init__.py +0 -0
  10. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/__main__.py +0 -0
  11. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/_pypi_marker +0 -0
  12. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/auth/__init__.py +0 -0
  13. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/auth/consent_form.py +0 -0
  14. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/auth/provider.py +0 -0
  15. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/client/__init__.py +0 -0
  16. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/client/rest_client.py +0 -0
  17. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/client/websocket_client.py +0 -0
  18. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/client/websocket_listener.py +0 -0
  19. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/config.py +0 -0
  20. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/errors.py +0 -0
  21. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/py.typed +0 -0
  22. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/resources/card_types.json +0 -0
  23. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/resources/dashboard_guide.md +0 -0
  24. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  25. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  26. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  27. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  28. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  29. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  30. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  31. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  32. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  33. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  34. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  35. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  36. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  37. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  38. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  39. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  40. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/server.py +0 -0
  41. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/smoke_test.py +0 -0
  42. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/__init__.py +0 -0
  43. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/backup.py +0 -0
  44. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  45. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/device_control.py +0 -0
  46. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/enhanced.py +0 -0
  47. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/helpers.py +0 -0
  48. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/registry.py +0 -0
  49. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/smart_search.py +0 -0
  50. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/tools_addons.py +0 -0
  51. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/tools_areas.py +0 -0
  52. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  53. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  54. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/tools_calendar.py +0 -0
  55. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/tools_camera.py +0 -0
  56. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  57. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  58. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/tools_config_entry_flow.py +0 -0
  59. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  60. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/tools_config_info.py +0 -0
  61. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  62. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/tools_entities.py +0 -0
  63. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  64. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/tools_groups.py +0 -0
  65. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/tools_hacs.py +0 -0
  66. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/tools_history.py +0 -0
  67. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/tools_integrations.py +0 -0
  68. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/tools_labels.py +0 -0
  69. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
  70. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/tools_registry.py +0 -0
  71. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/tools_resources.py +0 -0
  72. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/tools_search.py +0 -0
  73. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/tools_service.py +0 -0
  74. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/tools_services.py +0 -0
  75. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/tools_system.py +0 -0
  76. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/tools_todo.py +0 -0
  77. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/tools_traces.py +0 -0
  78. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/tools_updates.py +0 -0
  79. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/tools_utility.py +0 -0
  80. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  81. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/tools_zones.py +0 -0
  82. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/tools/util_helpers.py +0 -0
  83. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/utils/__init__.py +0 -0
  84. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/utils/domain_handlers.py +0 -0
  85. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  86. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/utils/operation_manager.py +0 -0
  87. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp/utils/usage_logger.py +0 -0
  88. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  89. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  90. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  91. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  92. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  93. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/tests/__init__.py +0 -0
  94. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/tests/test_constants.py +0 -0
  95. {ha_mcp_dev-7.0.0.dev279 → ha_mcp_dev-7.0.0.dev280}/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.0.0.dev279
3
+ Version: 7.0.0.dev280
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
@@ -275,6 +275,7 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
275
275
  - **[@saphid](https://github.com/saphid)** — Config entry options flow tools (initial design, #590).
276
276
  - **[@adraguidev](https://github.com/adraguidev)** — Fix menu-based config entry flows for group helpers (#647).
277
277
  - **[@transportrefer](https://github.com/transportrefer)** — Integration options inspection (`ha_get_integration` schema support, #689).
278
+ - **[@restriction](https://github.com/restriction)** — Responsible disclosure: python_transform sandbox missing call target validation.
278
279
 
279
280
  ---
280
281
 
@@ -245,6 +245,7 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
245
245
  - **[@saphid](https://github.com/saphid)** — Config entry options flow tools (initial design, #590).
246
246
  - **[@adraguidev](https://github.com/adraguidev)** — Fix menu-based config entry flows for group helpers (#647).
247
247
  - **[@transportrefer](https://github.com/transportrefer)** — Integration options inspection (`ha_get_integration` schema support, #689).
248
+ - **[@restriction](https://github.com/restriction)** — Responsible disclosure: python_transform sandbox missing call target validation.
248
249
 
249
250
  ---
250
251
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ha-mcp-dev"
7
- version = "7.0.0.dev279"
7
+ version = "7.0.0.dev280"
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"
@@ -1,8 +1,9 @@
1
1
  """
2
- Python expression sandbox using AST validation.
2
+ Python expression validation for dashboard transformations.
3
3
 
4
- Provides safe execution of Python expressions for dashboard transformations.
5
- Blocks imports, file I/O, dangerous builtins, and common sandbox escapes.
4
+ Restricts expressions to a known-safe subset: dict/list operations,
5
+ basic control flow, and whitelisted methods. Not a security boundary
6
+ callers are already authenticated MCP users with full HA access.
6
7
  """
7
8
 
8
9
  import ast
@@ -189,6 +190,11 @@ def validate_expression(expr: str) -> tuple[bool, str]:
189
190
  f"Forbidden method: {method_name} (allowed: {', '.join(sorted(SAFE_METHODS))})",
190
191
  )
191
192
 
193
+ # Reject subscript calls, chained calls, and all other non-standard targets
194
+ # e.g., config['fn']() or config.get('fn')() would bypass Name/Attribute checks
195
+ else:
196
+ return False, f"Forbidden call target type: {type(node.func).__name__}"
197
+
192
198
  # Block function definitions (could be used for obfuscation)
193
199
  if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef, ast.ClassDef)):
194
200
  return False, "Forbidden: function/class definitions not allowed"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 7.0.0.dev279
3
+ Version: 7.0.0.dev280
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
@@ -275,6 +275,7 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
275
275
  - **[@saphid](https://github.com/saphid)** — Config entry options flow tools (initial design, #590).
276
276
  - **[@adraguidev](https://github.com/adraguidev)** — Fix menu-based config entry flows for group helpers (#647).
277
277
  - **[@transportrefer](https://github.com/transportrefer)** — Integration options inspection (`ha_get_integration` schema support, #689).
278
+ - **[@restriction](https://github.com/restriction)** — Responsible disclosure: python_transform sandbox missing call target validation.
278
279
 
279
280
  ---
280
281