from __future__ import annotations
from dataclasses import dataclass
from typing import Any
from .error import ZapError
@dataclass
class Tool:
name: str
description: str
schema: dict[str, Any]
@dataclass
class Resource:
uri: str
name: str
description: str
mime_type: str
@dataclass
class ResourceContent:
uri: str
mime_type: str
content: str | bytes
class Client:
def __init__(self, url: str) -> None:
self.url = url
self._connected = False
@classmethod
async def connect(cls, url: str) -> Client:
client = cls(url)
client._connected = True
return client
async def list_tools(self) -> list[Tool]:
if not self._connected:
raise ZapError("Not connected")
return []
async def call_tool(self, name: str, args: dict[str, Any]) -> Any:
if not self._connected:
raise ZapError("Not connected")
return None
async def list_resources(self) -> list[Resource]:
if not self._connected:
raise ZapError("Not connected")
return []
async def read_resource(self, uri: str) -> ResourceContent:
if not self._connected:
raise ZapError("Not connected")
return ResourceContent(uri=uri, mime_type="text/plain", content="")
async def close(self) -> None:
self._connected = False