from __future__ import annotations from typing import Any from nanobot.agent.tools.base import Tool from nanobot.agent.tools.registry import ToolRegistry class _FakeTool(Tool): def __init__(self, name: str): self._name = name @property def name(self) -> str: return self._name @property def description(self) -> str: return f"{self._name} tool" @property def parameters(self) -> dict[str, Any]: return {"type": "object", "properties": {}} async def execute(self, **kwargs: Any) -> Any: return kwargs def _tool_names(definitions: list[dict[str, Any]]) -> list[str]: names: list[str] = [] for definition in definitions: fn = definition.get("function", {}) names.append(fn.get("name", "")) return names def test_get_definitions_orders_builtins_then_mcp_tools() -> None: registry = ToolRegistry() registry.register(_FakeTool("mcp_git_status")) registry.register(_FakeTool("write_file")) registry.register(_FakeTool("mcp_fs_list")) registry.register(_FakeTool("read_file")) assert _tool_names(registry.get_definitions()) == [ "read_file", "write_file", "mcp_fs_list", "mcp_git_status", ]