@dataclass(frozen=True)
class ToolAnnotations:
read_only: bool = False
destructive: bool = False
idempotent: bool = False
stateful: bool = False
security_tier: str = 'Medium' # 'Low' | 'Medium' | 'High' | 'Critical'@dataclass(frozen=True)
class ToolRateLimit:
max_calls: int
window_seconds: float = 60.0@dataclass(frozen=True)
class ToolDefinition:
name: str
description: str
input_schema: dict[str, Any] # JSON Schema (type: object)
output_schema: dict[str, Any] # JSON Schema (not enforced at runtime)
annotations: ToolAnnotations
handler: ToolHandler # Callable[[dict], dict]
rate_limit: Optional[ToolRateLimit] = None
capability_manifest: Optional[dict[str, Any]] = None
def get_security_tier(self) -> str
# Returns: 'Low' | 'Medium' | 'High' | 'Critical'
# Priority: capability_manifest['security_tier'] > annotation derivationdef register(
self,
name: str,
description: str,
input_schema: dict[str, Any],
output_schema: dict[str, Any],
handler: ToolHandler,
*,
annotations: ToolAnnotations = ToolAnnotations(),
rate_limit: Optional[ToolRateLimit] = None,
capability_manifest: Optional[dict[str, Any]] = None,
) -> None- Pre:
namemust not already be registered. - Post: Tool is callable via
call(name, arguments).
def call(self, name: str, arguments: dict[str, Any]) -> dict[str, Any]- Pre: Tool
nameregistered;argumentsmust passinput_schemavalidation. - Post: Returns handler result (possibly modified by post-hooks).
- Raises:
ToolExecutionError(unknown tool, rate limit exceeded),ToolValidationError(schema mismatch),HookError(pre-hook veto).
def get(self, name: str) -> Optional[ToolDefinition]Returns the ToolDefinition or None.
def list_tools(self) -> list[ToolDefinition]All registered tools.
def attach_hooks(self, hook_registry: HookRegistry) -> NoneAssociates a HookRegistry with this tool registry. All subsequent call() invocations use the hooks.
ToolHandler = Callable[[dict[str, Any]], dict[str, Any]]