This is an automated email from the ASF dual-hosted git repository.
FreeOnePlus pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris-mcp-server.git
The following commit(s) were added to refs/heads/master by this push:
new bd65c85 feat: reserve Doris administration domain (#184)
bd65c85 is described below
commit bd65c85651fc8913a316e17d4859a91a0cf4598f
Author: Yijia Su <[email protected]>
AuthorDate: Fri Jul 31 22:39:58 2026 +0800
feat: reserve Doris administration domain (#184)
---
.env.example | 6 +
CHANGELOG.md | 5 +
README.md | 28 ++++
doris_mcp_server/main.py | 6 +
doris_mcp_server/tools/admin_domain.py | 186 ++++++++++++++++++++++++++
doris_mcp_server/utils/config.py | 47 +++++++
test/tools/test_admin_domain.py | 229 +++++++++++++++++++++++++++++++++
7 files changed, 507 insertions(+)
diff --git a/.env.example b/.env.example
index c2b6e6f..e4c9338 100644
--- a/.env.example
+++ b/.env.example
@@ -79,6 +79,12 @@ DORIS_MAX_CONNECTION_AGE=3600
MCP_TOOL_PROVIDERS=
MCP_TOOL_EXPOSURE_MODE=hierarchical
+# Doris-changing MCP actions are reserved for a separately reviewed release.
+# The 1.0 server rejects attempts to enable this domain or disable its future
+# confirmation requirement; no administration tool or handler is registered.
+MCP_ADMIN_DOMAIN_ENABLED=false
+MCP_ADMIN_REQUIRE_CONFIRMATION=true
+
# Route-private capability snapshots drive each child availability decision.
# A failed refresh may reuse the previous snapshot only during the bounded
# stale grace window; unavailable or unknown capabilities remain fail-closed.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c8ce2a0..09c53fc 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -68,6 +68,9 @@ under **Unreleased** until a new version is selected and
published.
- An experimental read-only Apache Ossie Core semantic-grounding domain with
four capability-gated children, revisioned model-summary resources, and
explicit server-private Doris binding manifests.
+- A fail-closed `doris_admin` architecture reservation that defines future
+ high-risk action, scope, preview/execute, confirmation, idempotency, and
+ rollback contracts without registering any management capability.
- Real Doris process tests covering Streamable HTTP and stdio.
### Changed
@@ -117,6 +120,8 @@ under **Unreleased** until a new version is selected and
published.
expressions.
- Aligned semantic OAuth discovery, execution, resource exposure, and Doris
OAuth scope issuance on explicit channel opt-in plus `semantic:read`.
+- Rejected 1.0 configuration attempts to enable the reserved administration
+ domain or disable its mandatory confirmation invariant.
### Fixed
diff --git a/README.md b/README.md
index bfbd110..f1ca67c 100644
--- a/README.md
+++ b/README.md
@@ -332,6 +332,11 @@ cp .env.example .env
eight domain tools with progressive child discovery; `flat` returns
the same 47 children under exact collision-free formal names
(default: hierarchical)
+ * `MCP_ADMIN_DOMAIN_ENABLED`: Reserved administration-domain switch.
+ It must remain `false` in 1.0; setting it to `true` fails startup
+ validation
+ * `MCP_ADMIN_REQUIRE_CONFIRMATION`: Future administration confirmation
+ invariant. It must remain `true`; disabling it fails startup validation
* `MCP_TOOL_PROVIDERS`: Comma-separated allowlist of installed
`doris_mcp_server.tool_providers` entry points (default: empty)
* `CAPABILITY_SNAPSHOT_TTL_SECONDS`: Lifetime of a private route-specific
@@ -465,6 +470,29 @@ discovery grant are omitted, while authorized but
unavailable children remain
visible with `callable=false`. Doris RBAC remains the final data authorization
backend for all Doris object access.
+#### Administration domain reservation
+
+The `doris_admin` name and its future discovery, preview, execute,
+confirmation, idempotency, and rollback contracts are reserved, but 1.0
+registers no administration domain, child, handler, resource, prompt, or write
+operation. Neither hierarchical nor flat exposure includes an administration
+tool, and a guessed `doris_admin` name receives the normal `Tool not found`
+result.
+
+The reservation is deliberately fail-closed:
+
+```bash
+MCP_ADMIN_DOMAIN_ENABLED=false
+MCP_ADMIN_REQUIRE_CONFIRMATION=true
+```
+
+Changing the first value to `true`, or the second to `false`, makes
+configuration validation fail. A future release must separately review every
+action's exact scope, preview and execute handlers, explicit single-use
+confirmation, argument digest, idempotency key, rollback behavior, Doris
+authorization, and real write-path tests before it can register any
+administration capability.
+
#### Apache Ossie semantic grounding (experimental)
The optional `doris_semantic` domain reads the Apache Ossie Core semantic model
diff --git a/doris_mcp_server/main.py b/doris_mcp_server/main.py
index 76bf12c..5b9a93e 100644
--- a/doris_mcp_server/main.py
+++ b/doris_mcp_server/main.py
@@ -92,6 +92,12 @@ def _multiworker_environment(
"MCP_LIST_PAGE_SIZE": str(config.mcp_list_page_size),
"MCP_TOOL_PROVIDERS": ",".join(config.mcp_tool_providers),
"MCP_TOOL_EXPOSURE_MODE": config.tool_exposure.mode,
+ "MCP_ADMIN_DOMAIN_ENABLED": str(
+ config.administration.enabled
+ ).lower(),
+ "MCP_ADMIN_REQUIRE_CONFIRMATION": str(
+ config.administration.require_confirmation
+ ).lower(),
"CAPABILITY_SNAPSHOT_TTL_SECONDS": str(
config.capability.snapshot_ttl_seconds
),
diff --git a/doris_mcp_server/tools/admin_domain.py
b/doris_mcp_server/tools/admin_domain.py
new file mode 100644
index 0000000..5ea41b8
--- /dev/null
+++ b/doris_mcp_server/tools/admin_domain.py
@@ -0,0 +1,186 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+"""Fail-closed contracts reserved for a future Doris administration domain."""
+
+from __future__ import annotations
+
+from enum import StrEnum
+from typing import Annotated, Any, Literal, Self
+
+from pydantic import Field, model_validator
+
+from .domain_models import (
+ BindingName,
+ ContractModel,
+ Identifier,
+ NonEmptyText,
+ ToolContractAnnotations,
+)
+
+ADMIN_DOMAIN_NAME = "doris_admin"
+ADMIN_DOMAIN_DISCOVERY_SCOPE = "domain:discover:doris_admin"
+ADMIN_ACTION_ANNOTATIONS = ToolContractAnnotations(
+ read_only=False,
+ idempotent=False,
+ destructive=True,
+ open_world=False,
+ requires_confirmation=True,
+)
+
+
+class AdminRiskLevel(StrEnum):
+ """Allowed risk classifications for a future administrative action."""
+
+ HIGH = "high"
+ CRITICAL = "critical"
+
+
+class AdminConfirmationContract(ContractModel):
+ """Single-use confirmation bound to a preview and exact arguments."""
+
+ required: Literal[True] = True
+ method: Literal["explicit_token"] = "explicit_token"
+ token_field: Identifier = "confirmation_token"
+ preview_revision_field: Identifier = "preview_revision"
+ argument_digest_algorithm: Literal["sha256"] = "sha256"
+ single_use: Literal[True] = True
+ expires_seconds: Annotated[int, Field(ge=30, le=900)] = 300
+
+
+class AdminActionContract(ContractModel):
+ """Future preview/execute boundary; this release registers no actions."""
+
+ name: Identifier
+ title: NonEmptyText
+ description: NonEmptyText
+ risk_level: AdminRiskLevel
+ preview_scope: BindingName
+ execute_scope: BindingName
+ preview_handler_name: BindingName
+ execute_handler_name: BindingName
+ confirmation: AdminConfirmationContract = Field(
+ default_factory=AdminConfirmationContract
+ )
+ idempotency_key_field: Identifier = "idempotency_key"
+ rollback_supported: bool = False
+ rollback_scope: BindingName | None = None
+ rollback_handler_name: BindingName | None = None
+ annotations: ToolContractAnnotations = ADMIN_ACTION_ANNOTATIONS
+
+ @model_validator(mode="after")
+ def _validate_action_boundary(self) -> Self:
+ expected_values = {
+ "preview_scope": f"child:preview:{ADMIN_DOMAIN_NAME}:{self.name}",
+ "execute_scope": f"child:call:{ADMIN_DOMAIN_NAME}:{self.name}",
+ "preview_handler_name": f"admin:preview:{self.name}",
+ "execute_handler_name": f"admin:execute:{self.name}",
+ }
+ for field_name, expected in expected_values.items():
+ if getattr(self, field_name) != expected:
+ raise ValueError(f"{field_name} must be {expected!r}")
+ if self.annotations != ADMIN_ACTION_ANNOTATIONS:
+ raise ValueError(
+ "administrative actions must be destructive, closed-world, "
+ "non-read-only, and confirmation-required"
+ )
+
+ rollback_values = (
+ self.rollback_scope,
+ self.rollback_handler_name,
+ )
+ if self.rollback_supported:
+ expected_rollback = (
+ f"child:rollback:{ADMIN_DOMAIN_NAME}:{self.name}",
+ f"admin:rollback:{self.name}",
+ )
+ if rollback_values != expected_rollback:
+ raise ValueError(
+ "rollback-enabled actions require canonical rollback "
+ "scope and handler bindings"
+ )
+ elif any(value is not None for value in rollback_values):
+ raise ValueError(
+ "rollback scope and handler require rollback_supported=true"
+ )
+ return self
+
+
+class AdminDomainReservation(ContractModel):
+ """Versioned reservation that cannot expose actions in the 1.0 release."""
+
+ name: Identifier = ADMIN_DOMAIN_NAME
+ title: NonEmptyText = "Doris Administration"
+ description: NonEmptyText = (
+ "Reserved boundary for separately reviewed Doris-changing actions."
+ )
+ status: Literal["reserved"] = "reserved"
+ enabled: Literal[False] = False
+ discovery_scope: BindingName = ADMIN_DOMAIN_DISCOVERY_SCOPE
+ require_confirmation: Literal[True] = True
+ actions: tuple[AdminActionContract, ...] = ()
+
+ @model_validator(mode="after")
+ def _validate_release_reservation(self) -> Self:
+ if self.name != ADMIN_DOMAIN_NAME:
+ raise ValueError(f"administration domain name must be
{ADMIN_DOMAIN_NAME!r}")
+ if self.discovery_scope != ADMIN_DOMAIN_DISCOVERY_SCOPE:
+ raise ValueError(
+ "administration discovery scope must use the reserved domain
scope"
+ )
+ if self.actions:
+ raise ValueError(
+ "the Doris MCP 1.0 administration reservation cannot register
actions"
+ )
+ return self
+
+
+def administration_config_errors(
+ *,
+ enabled: Any,
+ require_confirmation: Any,
+) -> tuple[str, ...]:
+ """Return fail-closed runtime errors for the 1.0 reservation."""
+ errors: list[str] = []
+ if not isinstance(enabled, bool):
+ errors.append("Administration domain enabled flag must be boolean")
+ elif enabled:
+ errors.append(
+ "Administration domain is reserved and cannot be enabled in 1.0"
+ )
+ if not isinstance(require_confirmation, bool):
+ errors.append("Administration confirmation flag must be boolean")
+ elif not require_confirmation:
+ errors.append(
+ "Administration domain confirmation requirement cannot be disabled"
+ )
+ return tuple(errors)
+
+
+DORIS_ADMIN_DOMAIN_RESERVATION = AdminDomainReservation()
+
+__all__ = [
+ "ADMIN_ACTION_ANNOTATIONS",
+ "ADMIN_DOMAIN_DISCOVERY_SCOPE",
+ "ADMIN_DOMAIN_NAME",
+ "AdminActionContract",
+ "AdminConfirmationContract",
+ "AdminDomainReservation",
+ "AdminRiskLevel",
+ "DORIS_ADMIN_DOMAIN_RESERVATION",
+ "administration_config_errors",
+]
diff --git a/doris_mcp_server/utils/config.py b/doris_mcp_server/utils/config.py
index cc64943..ae33fc4 100644
--- a/doris_mcp_server/utils/config.py
+++ b/doris_mcp_server/utils/config.py
@@ -43,6 +43,7 @@ from ..result_limits import (
DEFAULT_RESULT_ROWS,
MIN_RESULT_BYTES,
)
+from ..tools.admin_domain import administration_config_errors
from ..tools.tool_provider import (
ToolProviderError,
normalize_tool_provider_names,
@@ -856,6 +857,14 @@ class ToolExposureConfig:
mode: str = "hierarchical"
+@dataclass
+class AdministrationConfig:
+ """Fail-closed reservation for future Doris-changing actions."""
+
+ enabled: bool = False
+ require_confirmation: bool = True
+
+
@dataclass
class CapabilityConfig:
"""Private Doris capability snapshot controls."""
@@ -944,6 +953,9 @@ class DorisConfig:
tool_exposure: ToolExposureConfig = field(
default_factory=ToolExposureConfig
)
+ administration: AdministrationConfig = field(
+ default_factory=AdministrationConfig
+ )
capability: CapabilityConfig = field(
default_factory=CapabilityConfig
)
@@ -1603,6 +1615,14 @@ class DorisConfig:
config.tool_exposure.mode,
).strip()
_mark_source(config, "mcp_tool_exposure_mode", "env")
+ if "MCP_ADMIN_DOMAIN_ENABLED" in os.environ:
+ config.administration.enabled = _str_to_bool(
+ os.getenv("MCP_ADMIN_DOMAIN_ENABLED")
+ )
+ if "MCP_ADMIN_REQUIRE_CONFIRMATION" in os.environ:
+ config.administration.require_confirmation = _str_to_bool(
+ os.getenv("MCP_ADMIN_REQUIRE_CONFIRMATION")
+ )
if "CAPABILITY_SNAPSHOT_TTL_SECONDS" in os.environ:
config.capability.snapshot_ttl_seconds = _env_int(
"CAPABILITY_SNAPSHOT_TTL_SECONDS",
@@ -1835,6 +1855,12 @@ class DorisConfig:
"config_file",
)
+ if "administration" in config_data:
+ administration_config = config_data["administration"]
+ for key, value in administration_config.items():
+ if hasattr(config.administration, key):
+ setattr(config.administration, key, value)
+
if "capability" in config_data:
capability_config = config_data["capability"]
for key, value in capability_config.items():
@@ -1881,6 +1907,12 @@ class DorisConfig:
"tool_exposure": {
"mode": self.tool_exposure.mode,
},
+ "administration": {
+ "enabled": self.administration.enabled,
+ "require_confirmation": (
+ self.administration.require_confirmation
+ ),
+ },
"capability": {
"snapshot_ttl_seconds": (
self.capability.snapshot_ttl_seconds
@@ -2164,6 +2196,14 @@ class DorisConfig:
errors.append(
"MCP tool exposure mode must be hierarchical or flat"
)
+ errors.extend(
+ administration_config_errors(
+ enabled=self.administration.enabled,
+ require_confirmation=(
+ self.administration.require_confirmation
+ ),
+ )
+ )
if not 1 <= self.capability.snapshot_ttl_seconds <= 86400:
errors.append(
"Capability snapshot TTL must be in the range 1-86400 seconds"
@@ -2465,6 +2505,13 @@ class DorisConfig:
"tool_exposure": {
"mode": self.tool_exposure.mode,
},
+ "administration": {
+ "enabled": self.administration.enabled,
+ "require_confirmation": (
+ self.administration.require_confirmation
+ ),
+ "status": "reserved",
+ },
"capability": {
"snapshot_ttl_seconds": (
self.capability.snapshot_ttl_seconds
diff --git a/test/tools/test_admin_domain.py b/test/tools/test_admin_domain.py
new file mode 100644
index 0000000..54c8811
--- /dev/null
+++ b/test/tools/test_admin_domain.py
@@ -0,0 +1,229 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+"""Fail-closed tests for the reserved Doris administration domain."""
+
+from __future__ import annotations
+
+from typing import Any
+from unittest.mock import Mock
+
+import pytest
+from pydantic import ValidationError
+
+from doris_mcp_server.main import _multiworker_environment
+from doris_mcp_server.tools.admin_domain import (
+ ADMIN_ACTION_ANNOTATIONS,
+ ADMIN_DOMAIN_DISCOVERY_SCOPE,
+ ADMIN_DOMAIN_NAME,
+ DORIS_ADMIN_DOMAIN_RESERVATION,
+ AdminActionContract,
+ AdminConfirmationContract,
+ AdminDomainReservation,
+ AdminRiskLevel,
+)
+from doris_mcp_server.tools.domain_catalog import DORIS_DOMAIN_CATALOG
+from doris_mcp_server.tools.domain_dispatcher import (
+ ToolExposureMode,
+ ToolNotFoundError,
+)
+from doris_mcp_server.tools.domain_models import (
+ Availability,
+ AvailabilityStatus,
+ ChildToolDefinition,
+ DomainDefinition,
+)
+from doris_mcp_server.tools.tools_manager import DorisToolsManager
+from doris_mcp_server.utils.config import DorisConfig
+
+
+class _UnavailableProvider:
+ async def availability_for(
+ self,
+ domain: DomainDefinition,
+ child: ChildToolDefinition,
+ auth_context: Any | None,
+ ) -> Availability:
+ del domain, child, auth_context
+ return Availability(
+ status=AvailabilityStatus.UNKNOWN,
+ callable=False,
+ reason_code="TEST_CAPABILITY_DISABLED",
+ )
+
+
+def _manager(mode: ToolExposureMode) -> DorisToolsManager:
+ connection_manager = Mock()
+ connection_manager.config = DorisConfig()
+ return DorisToolsManager(
+ connection_manager,
+ domain_availability_provider=_UnavailableProvider(),
+ tool_exposure_mode=mode,
+ )
+
+
+def _action(**updates: Any) -> AdminActionContract:
+ values: dict[str, Any] = {
+ "name": "cancel_query",
+ "title": "Cancel a Doris query",
+ "description": "Future reviewed action contract used only for
validation.",
+ "risk_level": AdminRiskLevel.HIGH,
+ "preview_scope": "child:preview:doris_admin:cancel_query",
+ "execute_scope": "child:call:doris_admin:cancel_query",
+ "preview_handler_name": "admin:preview:cancel_query",
+ "execute_handler_name": "admin:execute:cancel_query",
+ }
+ values.update(updates)
+ return AdminActionContract(**values)
+
+
+def test_reservation_has_no_actions_and_cannot_be_enabled() -> None:
+ assert DORIS_ADMIN_DOMAIN_RESERVATION.to_wire() == {
+ "name": ADMIN_DOMAIN_NAME,
+ "title": "Doris Administration",
+ "description": (
+ "Reserved boundary for separately reviewed Doris-changing actions."
+ ),
+ "status": "reserved",
+ "enabled": False,
+ "discovery_scope": ADMIN_DOMAIN_DISCOVERY_SCOPE,
+ "require_confirmation": True,
+ "actions": [],
+ }
+
+ with pytest.raises(ValidationError, match="Input should be False"):
+ AdminDomainReservation(enabled=True)
+
+
+def test_future_action_contract_requires_canonical_scopes_and_handlers() ->
None:
+ action = _action()
+
+ assert action.annotations == ADMIN_ACTION_ANNOTATIONS
+ assert action.confirmation == AdminConfirmationContract()
+ assert action.idempotency_key_field == "idempotency_key"
+
+ with pytest.raises(ValidationError, match="preview_scope"):
+ _action(preview_scope="child:preview:doris_admin:other")
+
+ with pytest.raises(ValidationError, match="execute_handler_name"):
+ _action(execute_handler_name="admin:execute:other")
+
+
+def test_future_action_contract_requires_confirmation_and_rollback_pairing()
-> None:
+ with pytest.raises(ValidationError, match="Input should be True"):
+ _action(confirmation={"required": False})
+
+ with pytest.raises(ValidationError, match="rollback scope"):
+ _action(
+ rollback_supported=True,
+ rollback_scope="child:rollback:doris_admin:cancel_query",
+ )
+
+ rollback = _action(
+ rollback_supported=True,
+ rollback_scope="child:rollback:doris_admin:cancel_query",
+ rollback_handler_name="admin:rollback:cancel_query",
+ )
+ assert rollback.rollback_supported is True
+
+
+def test_administration_config_is_reserved_and_fail_closed(
+ monkeypatch: pytest.MonkeyPatch,
+) -> None:
+ default = DorisConfig.from_env()
+ assert default.administration.enabled is False
+ assert default.administration.require_confirmation is True
+ assert not [
+ error
+ for error in default.validate()
+ if error.startswith("Administration")
+ ]
+
+ monkeypatch.setenv("MCP_ADMIN_DOMAIN_ENABLED", "true")
+ enabled = DorisConfig.from_env()
+ assert enabled.administration.enabled is True
+ assert (
+ "Administration domain is reserved and cannot be enabled in 1.0"
+ in enabled.validate()
+ )
+
+ monkeypatch.delenv("MCP_ADMIN_DOMAIN_ENABLED")
+ monkeypatch.setenv("MCP_ADMIN_REQUIRE_CONFIRMATION", "false")
+ unsafe = DorisConfig.from_env()
+ assert unsafe.administration.require_confirmation is False
+ assert (
+ "Administration domain confirmation requirement cannot be disabled"
+ in unsafe.validate()
+ )
+
+
+def test_administration_config_is_serialized_without_enabling_actions() ->
None:
+ config = DorisConfig()
+
+ assert config.to_dict()["administration"] == {
+ "enabled": False,
+ "require_confirmation": True,
+ }
+ assert config.get_config_summary()["administration"] == {
+ "enabled": False,
+ "require_confirmation": True,
+ "status": "reserved",
+ }
+
+
+def test_multiworker_environment_preserves_the_disabled_reservation() -> None:
+ config = DorisConfig()
+
+ environment = _multiworker_environment(
+ config,
+ host="127.0.0.1",
+ port=3000,
+ workers=2,
+ )
+
+ assert environment["MCP_ADMIN_DOMAIN_ENABLED"] == "false"
+ assert environment["MCP_ADMIN_REQUIRE_CONFIRMATION"] == "true"
+
+
[email protected]
[email protected](
+ "mode",
+ (ToolExposureMode.HIERARCHICAL, ToolExposureMode.FLAT),
+)
+async def test_admin_domain_is_not_listed_or_callable(
+ mode: ToolExposureMode,
+) -> None:
+ manager = _manager(mode)
+ listed_names = {tool.name for tool in await manager.list_tools()}
+
+ assert ADMIN_DOMAIN_NAME not in listed_names
+ assert not any(name.startswith(f"{ADMIN_DOMAIN_NAME}_") for name in
listed_names)
+ assert ADMIN_DOMAIN_NAME not in {
+ domain.name for domain in DORIS_DOMAIN_CATALOG.domains
+ }
+ assert not any(
+ name.startswith(f"{ADMIN_DOMAIN_NAME}_")
+ for name in manager.domain_dispatcher.formal_flat_names
+ )
+
+ with pytest.raises(ToolNotFoundError, match="Tool not found"):
+ await manager.call_tool(ADMIN_DOMAIN_NAME, {})
+ with pytest.raises(ToolNotFoundError, match="Tool not found"):
+ await manager.call_tool(
+ f"{ADMIN_DOMAIN_NAME}_cancel_query",
+ {},
+ )
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]