ha-mcp-dev 7.5.0.dev508__tar.gz → 7.5.0.dev509__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 (111) hide show
  1. {ha_mcp_dev-7.5.0.dev508/src/ha_mcp_dev.egg-info → ha_mcp_dev-7.5.0.dev509}/PKG-INFO +1 -1
  2. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/pyproject.toml +1 -1
  3. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/tools_addons.py +55 -6
  4. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509/src/ha_mcp_dev.egg-info}/PKG-INFO +1 -1
  5. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/LICENSE +0 -0
  6. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/MANIFEST.in +0 -0
  7. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/README.md +0 -0
  8. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/setup.cfg +0 -0
  9. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/__init__.py +0 -0
  10. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/__main__.py +0 -0
  11. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/_pypi_marker +0 -0
  12. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/_version.py +0 -0
  13. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/auth/__init__.py +0 -0
  14. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/auth/consent_form.py +0 -0
  15. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/auth/provider.py +0 -0
  16. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/client/__init__.py +0 -0
  17. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/client/rest_client.py +0 -0
  18. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/client/supervisor_client.py +0 -0
  19. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/client/websocket_client.py +0 -0
  20. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/client/websocket_listener.py +0 -0
  21. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/config.py +0 -0
  22. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/errors.py +0 -0
  23. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/py.typed +0 -0
  24. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/resources/skills-vendor/.claude/settings.json +0 -0
  25. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/resources/skills-vendor/.claude-plugin/marketplace.json +0 -0
  26. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/resources/skills-vendor/.claude-plugin/plugin.json +0 -0
  27. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/resources/skills-vendor/.github/ISSUE_TEMPLATE/skill-rca.md +0 -0
  28. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/resources/skills-vendor/AGENTS.md +0 -0
  29. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/resources/skills-vendor/CLAUDE.md +0 -0
  30. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/resources/skills-vendor/CONTRIBUTING.md +0 -0
  31. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/resources/skills-vendor/LICENSE +0 -0
  32. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/resources/skills-vendor/README.md +0 -0
  33. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/SKILL.md +0 -0
  34. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/evals/evals.json +0 -0
  35. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/automation-patterns.md +0 -0
  36. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-cards.md +0 -0
  37. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/dashboard-guide.md +0 -0
  38. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/device-control.md +0 -0
  39. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/domain-docs.md +0 -0
  40. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/examples.yaml +0 -0
  41. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/helper-selection.md +0 -0
  42. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/safe-refactoring.md +0 -0
  43. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/resources/skills-vendor/skills/home-assistant-best-practices/references/template-guidelines.md +0 -0
  44. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/server.py +0 -0
  45. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/settings_ui.py +0 -0
  46. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/smoke_test.py +0 -0
  47. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/__init__.py +0 -0
  48. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/backup.py +0 -0
  49. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/best_practice_checker.py +0 -0
  50. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/device_control.py +0 -0
  51. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/enhanced.py +0 -0
  52. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/helpers.py +0 -0
  53. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/reference_validator.py +0 -0
  54. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/registry.py +0 -0
  55. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/smart_search.py +0 -0
  56. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/tools_areas.py +0 -0
  57. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/tools_blueprints.py +0 -0
  58. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/tools_bug_report.py +0 -0
  59. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/tools_calendar.py +0 -0
  60. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/tools_camera.py +0 -0
  61. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/tools_categories.py +0 -0
  62. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/tools_code.py +0 -0
  63. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/tools_config_automations.py +0 -0
  64. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/tools_config_dashboards.py +0 -0
  65. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/tools_config_entry_flow.py +0 -0
  66. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/tools_config_helpers.py +0 -0
  67. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/tools_config_scenes.py +0 -0
  68. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/tools_config_scripts.py +0 -0
  69. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/tools_energy.py +0 -0
  70. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/tools_entities.py +0 -0
  71. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/tools_filesystem.py +0 -0
  72. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/tools_groups.py +0 -0
  73. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/tools_hacs.py +0 -0
  74. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/tools_history.py +0 -0
  75. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/tools_integrations.py +0 -0
  76. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/tools_labels.py +0 -0
  77. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/tools_mcp_component.py +0 -0
  78. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/tools_registry.py +0 -0
  79. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/tools_resources.py +0 -0
  80. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/tools_search.py +0 -0
  81. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/tools_service.py +0 -0
  82. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/tools_services.py +0 -0
  83. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/tools_system.py +0 -0
  84. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/tools_todo.py +0 -0
  85. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/tools_traces.py +0 -0
  86. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/tools_updates.py +0 -0
  87. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/tools_utility.py +0 -0
  88. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/tools_voice_assistant.py +0 -0
  89. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/tools_yaml_config.py +0 -0
  90. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/tools_zones.py +0 -0
  91. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/tools/util_helpers.py +0 -0
  92. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/transforms/__init__.py +0 -0
  93. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/transforms/categorized_search.py +0 -0
  94. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/transforms/lite_docstrings.py +0 -0
  95. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/utils/__init__.py +0 -0
  96. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/utils/config_hash.py +0 -0
  97. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/utils/data_paths.py +0 -0
  98. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/utils/domain_handlers.py +0 -0
  99. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/utils/fuzzy_search.py +0 -0
  100. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/utils/kill_signal_diagnostics.py +0 -0
  101. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/utils/operation_manager.py +0 -0
  102. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/utils/python_sandbox.py +0 -0
  103. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp/utils/usage_logger.py +0 -0
  104. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp_dev.egg-info/SOURCES.txt +0 -0
  105. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp_dev.egg-info/dependency_links.txt +0 -0
  106. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp_dev.egg-info/entry_points.txt +0 -0
  107. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp_dev.egg-info/requires.txt +0 -0
  108. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/src/ha_mcp_dev.egg-info/top_level.txt +0 -0
  109. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/tests/__init__.py +0 -0
  110. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/tests/test_constants.py +0 -0
  111. {ha_mcp_dev-7.5.0.dev508 → ha_mcp_dev-7.5.0.dev509}/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.5.0.dev508
3
+ Version: 7.5.0.dev509
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.5.0.dev508"
7
+ version = "7.5.0.dev509"
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"
@@ -1135,6 +1135,17 @@ def _apply_array_ops(
1135
1135
  parameter=f"array_patch.operations[{index}].patches",
1136
1136
  )
1137
1137
  )
1138
+ if not patches:
1139
+ # `target.update({})` is a no-op; reject so the caller learns
1140
+ # their op was meaningless rather than seeing a silent
1141
+ # `summary["patched"]` entry with `"fields": []`.
1142
+ raise_tool_error(
1143
+ create_validation_error(
1144
+ f"array_patch patch op #{index} 'patches' cannot be empty "
1145
+ "(no fields to update)",
1146
+ parameter=f"array_patch.operations[{index}].patches",
1147
+ )
1148
+ )
1138
1149
  target = next(
1139
1150
  (
1140
1151
  it
@@ -1197,6 +1208,17 @@ def _apply_array_ops(
1197
1208
  )
1198
1209
  )
1199
1210
  new_id = new_item[id_field]
1211
+ if new_id is None or new_id == "":
1212
+ # Items missing the id field have `dict.get(id_field) == None`
1213
+ # by default, so allowing None/"" ids would let later patch /
1214
+ # delete ops match unrelated items.
1215
+ raise_tool_error(
1216
+ create_validation_error(
1217
+ f"array_patch add op #{index} item {id_field!r} cannot be "
1218
+ "None or an empty string",
1219
+ parameter=f"array_patch.operations[{index}].item.{id_field}",
1220
+ )
1221
+ )
1200
1222
  if any(
1201
1223
  isinstance(it, dict) and it.get(id_field) == new_id for it in working
1202
1224
  ):
@@ -1235,9 +1257,23 @@ def _apply_array_ops(
1235
1257
  if not (isinstance(it, dict) and it.get(field) == value)
1236
1258
  ]
1237
1259
  removed = before - len(working)
1238
- summary["deleted_where"].append(
1239
- {"field": field, "value": value, "count": removed}
1240
- )
1260
+ entry: dict[str, Any] = {"field": field, "value": value, "count": removed}
1261
+ # Distinguish "value not present" from "field name unknown to any
1262
+ # item" — the latter is almost always a typo and would otherwise
1263
+ # be a silent count=0. Only warn when there are dict items to
1264
+ # inspect; an empty array or all-non-dict array would `not any(...)`
1265
+ # trivially and produce a misleading typo suggestion.
1266
+ inspectable = [it for it in working if isinstance(it, dict)]
1267
+ if (
1268
+ removed == 0
1269
+ and inspectable
1270
+ and not any(field in it for it in inspectable)
1271
+ ):
1272
+ entry["warning"] = (
1273
+ f"field {field!r} is not present on any item — "
1274
+ "check for a typo in the field name"
1275
+ )
1276
+ summary["deleted_where"].append(entry)
1241
1277
 
1242
1278
  return working, summary
1243
1279
 
@@ -1830,9 +1866,9 @@ def register_addon_tools(mcp: Any, client: HomeAssistantClient, **kwargs: Any) -
1830
1866
  "Proxy/array-patch mode: extra HTTP headers to send to the addon API. "
1831
1867
  "Useful for addon-specific requirements such as Node-RED's "
1832
1868
  "`Node-RED-Deployment-Type: full`. The proxy's internal framing "
1833
- "(`X-Ingress-Path`, `X-Hass-Source`, `Content-Type`) is layered on "
1834
- "top, so caller-supplied values for those keys are overridden. "
1835
- "Not valid in config mode."
1869
+ "(`X-Ingress-Path`, `X-Hass-Source`, `Cookie`, `Content-Type`) is "
1870
+ "layered on top, so caller-supplied values for those keys are "
1871
+ "overridden. Not valid in config or websocket mode."
1836
1872
  ),
1837
1873
  default=None,
1838
1874
  ),
@@ -2049,6 +2085,19 @@ def register_addon_tools(mcp: Any, client: HomeAssistantClient, **kwargs: Any) -
2049
2085
  )
2050
2086
  )
2051
2087
 
2088
+ # request_headers applies only to HTTP / array_patch mode.
2089
+ # _call_addon_ws does not accept caller headers — reject the combo
2090
+ # rather than silently dropping them (matches the fail-loud-on-misroute
2091
+ # pattern used for message_limit / message_offset / summarize on HTTP).
2092
+ if request_headers is not None and websocket:
2093
+ raise_tool_error(
2094
+ create_validation_error(
2095
+ "request_headers applies only to HTTP and array_patch modes; "
2096
+ "remove it or set websocket=False",
2097
+ parameter="request_headers",
2098
+ )
2099
+ )
2100
+
2052
2101
  # Config mode: update Supervisor settings
2053
2102
  if config_data:
2054
2103
  ignored_fields: list[str] = [] # populated only when options are provided
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ha-mcp-dev
3
- Version: 7.5.0.dev508
3
+ Version: 7.5.0.dev509
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