Source code for tigl_mcp.tooling

"""Shared tool definitions for the TiGL MCP server."""

from __future__ import annotations

from collections.abc import Callable
from dataclasses import dataclass, field
from typing import Any

from pydantic import BaseModel, ConfigDict, ValidationError


[docs] class ToolParameters(BaseModel): """Base parameters schema for MCP tools.""" model_config = ConfigDict(extra="forbid")
[docs] @dataclass class ToolDefinition: """Description of a tool that can be registered with the server. Attributes: name: Unique name of the tool. description: Human-readable description of the tool purpose. parameters_model: Pydantic model used to validate input parameters. handler: Callable that executes the tool logic. """ name: str description: str parameters_model: type[ToolParameters] handler: Callable[[dict[str, Any]], dict[str, Any]] output_schema: dict[str, Any] | None = field(default=None)
[docs] def validate(self, parameters: dict[str, Any]) -> dict[str, Any]: """Validate and coerce incoming tool parameters. Args: parameters: Input parameters provided for the tool. Raises: ValueError: If parameter validation fails. Returns: Validated parameter dictionary. """ try: model = self.parameters_model(**parameters) except ValidationError as error: raise ValueError(f"Invalid parameters for tool '{self.name}'") from error return model.model_dump()
[docs] def metadata(self) -> dict[str, Any]: """Return a discovery-friendly description of the tool.""" metadata: dict[str, Any] = { "name": self.name, "description": self.description, "schema": self.parameters_model.model_json_schema(), } if self.output_schema is not None: metadata["output_schema"] = self.output_schema return metadata