{-# LANGUAGE DeriveGeneric     #-}
{-# LANGUAGE OverloadedStrings #-}

module MCP.Server.Types
  ( -- * Content Types
    Content(..)
  , ContentImageData(..)
  , ContentResourceData(..)

    -- * Error Types
  , Error(..)

    -- * Definition Types
  , PromptDefinition(..)
  , ResourceDefinition(..)
  , ToolDefinition(..)
  , ArgumentDefinition(..)
  , InputSchemaDefinition(..)
  , InputSchemaDefinitionProperty(..)

    -- * Server Types
  , McpServerInfo(..)
  , McpServerHandlers(..)
  , ServerCapabilities(..)
  , PromptCapabilities(..)
  , ResourceCapabilities(..)
  , ToolCapabilities(..)
  , LoggingCapabilities(..)

    -- * Request/Response Types
  , PromptListHandler
  , PromptGetHandler
  , ResourceListHandler
  , ResourceReadHandler
  , ToolListHandler
  , ToolCallHandler

    -- * Basic Types
  , PromptName
  , ToolName
  , ArgumentName
  , ArgumentValue
  ) where

import           Data.Aeson
import           Data.Aeson.Key   (fromText)
import           Data.Aeson.Types (Parser)
import           Data.Maybe       (catMaybes)
import           Data.Text        (Text)
import qualified Data.Text        as T
import           GHC.Generics     (Generic)
import           Network.URI      (URI)

type PromptName = Text
type ToolName = Text
type ArgumentName = Text
type ArgumentValue = Text

-- | Content that can be returned by prompts, resources, and tools
data Content
  = ContentText Text
  | ContentImage ContentImageData
  | ContentResource ContentResourceData
  deriving (Int -> Content -> ShowS
[Content] -> ShowS
Content -> String
(Int -> Content -> ShowS)
-> (Content -> String) -> ([Content] -> ShowS) -> Show Content
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Content -> ShowS
showsPrec :: Int -> Content -> ShowS
$cshow :: Content -> String
show :: Content -> String
$cshowList :: [Content] -> ShowS
showList :: [Content] -> ShowS
Show, Content -> Content -> Bool
(Content -> Content -> Bool)
-> (Content -> Content -> Bool) -> Eq Content
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Content -> Content -> Bool
== :: Content -> Content -> Bool
$c/= :: Content -> Content -> Bool
/= :: Content -> Content -> Bool
Eq, (forall x. Content -> Rep Content x)
-> (forall x. Rep Content x -> Content) -> Generic Content
forall x. Rep Content x -> Content
forall x. Content -> Rep Content x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Content -> Rep Content x
from :: forall x. Content -> Rep Content x
$cto :: forall x. Rep Content x -> Content
to :: forall x. Rep Content x -> Content
Generic)

instance ToJSON Content where
  toJSON :: Content -> Value
toJSON (ContentText Text
text) = [Pair] -> Value
object
    [ Key
"type" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Text
"text" :: Text)
    , Key
"text" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text
text
    ]
  toJSON (ContentImage ContentImageData
img) = [Pair] -> Value
object
    [ Key
"type" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Text
"image" :: Text)
    , Key
"data" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= ContentImageData -> Text
contentImageData ContentImageData
img
    , Key
"mimeType" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= ContentImageData -> Text
contentImageMimeType ContentImageData
img
    ]
  toJSON (ContentResource ContentResourceData
res) = [Pair] -> Value
object
    [ Key
"type" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Text
"resource" :: Text)
    , Key
"resource" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [Pair] -> Value
object
        [ Key
"uri" Key -> URI -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= ContentResourceData -> URI
contentResourceUri ContentResourceData
res
        , Key
"mimeType" Key -> Maybe Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= ContentResourceData -> Maybe Text
contentResourceMimeType ContentResourceData
res
        ]
    ]

instance FromJSON Content where
  parseJSON :: Value -> Parser Content
parseJSON = String -> (Object -> Parser Content) -> Value -> Parser Content
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"Content" ((Object -> Parser Content) -> Value -> Parser Content)
-> (Object -> Parser Content) -> Value -> Parser Content
forall a b. (a -> b) -> a -> b
$ \Object
o -> do
    contentType <- Object
o Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"type" :: Parser Text
    case contentType of
      Text
"text" -> Text -> Content
ContentText (Text -> Content) -> Parser Text -> Parser Content
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"text"
      Text
"image" -> do
        imgData <- Object
o Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"data"
        mimeType <- o .: "mimeType"
        return $ ContentImage $ ContentImageData imgData mimeType
      Text
"resource" -> do
        res <- Object
o Object -> Key -> Parser Object
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"resource"
        uri <- res .: "uri"
        mimeType <- res .:? "mimeType"
        return $ ContentResource $ ContentResourceData uri mimeType
      Text
_ -> String -> Parser Content
forall a. String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser Content) -> String -> Parser Content
forall a b. (a -> b) -> a -> b
$ String
"Unknown content type: " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Text -> String
T.unpack Text
contentType

data ContentImageData = ContentImageData
  { ContentImageData -> Text
contentImageData     :: Text
  , ContentImageData -> Text
contentImageMimeType :: Text
  } deriving (Int -> ContentImageData -> ShowS
[ContentImageData] -> ShowS
ContentImageData -> String
(Int -> ContentImageData -> ShowS)
-> (ContentImageData -> String)
-> ([ContentImageData] -> ShowS)
-> Show ContentImageData
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ContentImageData -> ShowS
showsPrec :: Int -> ContentImageData -> ShowS
$cshow :: ContentImageData -> String
show :: ContentImageData -> String
$cshowList :: [ContentImageData] -> ShowS
showList :: [ContentImageData] -> ShowS
Show, ContentImageData -> ContentImageData -> Bool
(ContentImageData -> ContentImageData -> Bool)
-> (ContentImageData -> ContentImageData -> Bool)
-> Eq ContentImageData
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ContentImageData -> ContentImageData -> Bool
== :: ContentImageData -> ContentImageData -> Bool
$c/= :: ContentImageData -> ContentImageData -> Bool
/= :: ContentImageData -> ContentImageData -> Bool
Eq, (forall x. ContentImageData -> Rep ContentImageData x)
-> (forall x. Rep ContentImageData x -> ContentImageData)
-> Generic ContentImageData
forall x. Rep ContentImageData x -> ContentImageData
forall x. ContentImageData -> Rep ContentImageData x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. ContentImageData -> Rep ContentImageData x
from :: forall x. ContentImageData -> Rep ContentImageData x
$cto :: forall x. Rep ContentImageData x -> ContentImageData
to :: forall x. Rep ContentImageData x -> ContentImageData
Generic)

data ContentResourceData = ContentResourceData
  { ContentResourceData -> URI
contentResourceUri      :: URI
  , ContentResourceData -> Maybe Text
contentResourceMimeType :: Maybe Text
  } deriving (Int -> ContentResourceData -> ShowS
[ContentResourceData] -> ShowS
ContentResourceData -> String
(Int -> ContentResourceData -> ShowS)
-> (ContentResourceData -> String)
-> ([ContentResourceData] -> ShowS)
-> Show ContentResourceData
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ContentResourceData -> ShowS
showsPrec :: Int -> ContentResourceData -> ShowS
$cshow :: ContentResourceData -> String
show :: ContentResourceData -> String
$cshowList :: [ContentResourceData] -> ShowS
showList :: [ContentResourceData] -> ShowS
Show, ContentResourceData -> ContentResourceData -> Bool
(ContentResourceData -> ContentResourceData -> Bool)
-> (ContentResourceData -> ContentResourceData -> Bool)
-> Eq ContentResourceData
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ContentResourceData -> ContentResourceData -> Bool
== :: ContentResourceData -> ContentResourceData -> Bool
$c/= :: ContentResourceData -> ContentResourceData -> Bool
/= :: ContentResourceData -> ContentResourceData -> Bool
Eq, (forall x. ContentResourceData -> Rep ContentResourceData x)
-> (forall x. Rep ContentResourceData x -> ContentResourceData)
-> Generic ContentResourceData
forall x. Rep ContentResourceData x -> ContentResourceData
forall x. ContentResourceData -> Rep ContentResourceData x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. ContentResourceData -> Rep ContentResourceData x
from :: forall x. ContentResourceData -> Rep ContentResourceData x
$cto :: forall x. Rep ContentResourceData x -> ContentResourceData
to :: forall x. Rep ContentResourceData x -> ContentResourceData
Generic)

-- | MCP protocol errors
data Error
  = InvalidPromptName Text
  | MissingRequiredParams Text
  | ResourceNotFound Text
  | InternalError Text
  | UnknownTool Text
  | InvalidRequest Text
  | MethodNotFound Text
  | InvalidParams Text
  deriving (Int -> Error -> ShowS
[Error] -> ShowS
Error -> String
(Int -> Error -> ShowS)
-> (Error -> String) -> ([Error] -> ShowS) -> Show Error
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Error -> ShowS
showsPrec :: Int -> Error -> ShowS
$cshow :: Error -> String
show :: Error -> String
$cshowList :: [Error] -> ShowS
showList :: [Error] -> ShowS
Show, Error -> Error -> Bool
(Error -> Error -> Bool) -> (Error -> Error -> Bool) -> Eq Error
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Error -> Error -> Bool
== :: Error -> Error -> Bool
$c/= :: Error -> Error -> Bool
/= :: Error -> Error -> Bool
Eq, (forall x. Error -> Rep Error x)
-> (forall x. Rep Error x -> Error) -> Generic Error
forall x. Rep Error x -> Error
forall x. Error -> Rep Error x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Error -> Rep Error x
from :: forall x. Error -> Rep Error x
$cto :: forall x. Rep Error x -> Error
to :: forall x. Rep Error x -> Error
Generic)

instance ToJSON Error where
  toJSON :: Error -> Value
toJSON Error
err = [Pair] -> Value
object
    [ Key
"code" Key -> Int -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Error -> Int
errorCode Error
err
    , Key
"message" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Error -> Text
errorMessage Error
err
    ]
    where
      errorCode :: Error -> Int
      errorCode :: Error -> Int
errorCode (InvalidPromptName Text
_)     = -Int
32602
      errorCode (MissingRequiredParams Text
_) = -Int
32602
      errorCode (ResourceNotFound Text
_)      = -Int
32602
      errorCode (InternalError Text
_)         = -Int
32603
      errorCode (UnknownTool Text
_)           = -Int
32602
      errorCode (InvalidRequest Text
_)        = -Int
32600
      errorCode (MethodNotFound Text
_)        = -Int
32601
      errorCode (InvalidParams Text
_)         = -Int
32602

      errorMessage :: Error -> Text
      errorMessage :: Error -> Text
errorMessage (InvalidPromptName Text
msg) = Text
"Invalid prompt name: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
msg
      errorMessage (MissingRequiredParams Text
msg) = Text
"Missing required parameters: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
msg
      errorMessage (ResourceNotFound Text
msg) = Text
"Resource not found: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
msg
      errorMessage (InternalError Text
msg) = Text
"Internal error: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
msg
      errorMessage (UnknownTool Text
msg) = Text
"Unknown tool: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
msg
      errorMessage (InvalidRequest Text
msg) = Text
"Invalid request: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
msg
      errorMessage (MethodNotFound Text
msg) = Text
"Method not found: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
msg
      errorMessage (InvalidParams Text
msg) = Text
"Invalid parameters: " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
msg

-- | Prompt definition
data PromptDefinition = PromptDefinition
  { PromptDefinition -> Text
promptDefinitionName        :: Text
  , PromptDefinition -> Text
promptDefinitionDescription :: Text
  , PromptDefinition -> [ArgumentDefinition]
promptDefinitionArguments   :: [ArgumentDefinition]
  } deriving (Int -> PromptDefinition -> ShowS
[PromptDefinition] -> ShowS
PromptDefinition -> String
(Int -> PromptDefinition -> ShowS)
-> (PromptDefinition -> String)
-> ([PromptDefinition] -> ShowS)
-> Show PromptDefinition
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> PromptDefinition -> ShowS
showsPrec :: Int -> PromptDefinition -> ShowS
$cshow :: PromptDefinition -> String
show :: PromptDefinition -> String
$cshowList :: [PromptDefinition] -> ShowS
showList :: [PromptDefinition] -> ShowS
Show, PromptDefinition -> PromptDefinition -> Bool
(PromptDefinition -> PromptDefinition -> Bool)
-> (PromptDefinition -> PromptDefinition -> Bool)
-> Eq PromptDefinition
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: PromptDefinition -> PromptDefinition -> Bool
== :: PromptDefinition -> PromptDefinition -> Bool
$c/= :: PromptDefinition -> PromptDefinition -> Bool
/= :: PromptDefinition -> PromptDefinition -> Bool
Eq, (forall x. PromptDefinition -> Rep PromptDefinition x)
-> (forall x. Rep PromptDefinition x -> PromptDefinition)
-> Generic PromptDefinition
forall x. Rep PromptDefinition x -> PromptDefinition
forall x. PromptDefinition -> Rep PromptDefinition x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. PromptDefinition -> Rep PromptDefinition x
from :: forall x. PromptDefinition -> Rep PromptDefinition x
$cto :: forall x. Rep PromptDefinition x -> PromptDefinition
to :: forall x. Rep PromptDefinition x -> PromptDefinition
Generic)

instance ToJSON PromptDefinition where
  toJSON :: PromptDefinition -> Value
toJSON PromptDefinition
def = [Pair] -> Value
object
    [ Key
"name" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= PromptDefinition -> Text
promptDefinitionName PromptDefinition
def
    , Key
"description" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= PromptDefinition -> Text
promptDefinitionDescription PromptDefinition
def
    , Key
"arguments" Key -> [ArgumentDefinition] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= PromptDefinition -> [ArgumentDefinition]
promptDefinitionArguments PromptDefinition
def
    ]

-- | Resource definition
data ResourceDefinition = ResourceDefinition
  { ResourceDefinition -> Text
resourceDefinitionURI         :: Text
  , ResourceDefinition -> Text
resourceDefinitionName        :: Text
  , ResourceDefinition -> Maybe Text
resourceDefinitionDescription :: Maybe Text
  , ResourceDefinition -> Maybe Text
resourceDefinitionMimeType    :: Maybe Text
  } deriving (Int -> ResourceDefinition -> ShowS
[ResourceDefinition] -> ShowS
ResourceDefinition -> String
(Int -> ResourceDefinition -> ShowS)
-> (ResourceDefinition -> String)
-> ([ResourceDefinition] -> ShowS)
-> Show ResourceDefinition
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ResourceDefinition -> ShowS
showsPrec :: Int -> ResourceDefinition -> ShowS
$cshow :: ResourceDefinition -> String
show :: ResourceDefinition -> String
$cshowList :: [ResourceDefinition] -> ShowS
showList :: [ResourceDefinition] -> ShowS
Show, ResourceDefinition -> ResourceDefinition -> Bool
(ResourceDefinition -> ResourceDefinition -> Bool)
-> (ResourceDefinition -> ResourceDefinition -> Bool)
-> Eq ResourceDefinition
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ResourceDefinition -> ResourceDefinition -> Bool
== :: ResourceDefinition -> ResourceDefinition -> Bool
$c/= :: ResourceDefinition -> ResourceDefinition -> Bool
/= :: ResourceDefinition -> ResourceDefinition -> Bool
Eq, (forall x. ResourceDefinition -> Rep ResourceDefinition x)
-> (forall x. Rep ResourceDefinition x -> ResourceDefinition)
-> Generic ResourceDefinition
forall x. Rep ResourceDefinition x -> ResourceDefinition
forall x. ResourceDefinition -> Rep ResourceDefinition x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. ResourceDefinition -> Rep ResourceDefinition x
from :: forall x. ResourceDefinition -> Rep ResourceDefinition x
$cto :: forall x. Rep ResourceDefinition x -> ResourceDefinition
to :: forall x. Rep ResourceDefinition x -> ResourceDefinition
Generic)

instance ToJSON ResourceDefinition where
  toJSON :: ResourceDefinition -> Value
toJSON ResourceDefinition
def = [Pair] -> Value
object ([Pair] -> Value) -> [Pair] -> Value
forall a b. (a -> b) -> a -> b
$
    [ Key
"uri" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= ResourceDefinition -> Text
resourceDefinitionURI ResourceDefinition
def
    , Key
"name" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= ResourceDefinition -> Text
resourceDefinitionName ResourceDefinition
def
    ] [Pair] -> [Pair] -> [Pair]
forall a. [a] -> [a] -> [a]
++
    [Pair] -> (Text -> [Pair]) -> Maybe Text -> [Pair]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] (\Text
d -> [Key
"description" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text
d]) (ResourceDefinition -> Maybe Text
resourceDefinitionDescription ResourceDefinition
def) [Pair] -> [Pair] -> [Pair]
forall a. [a] -> [a] -> [a]
++
    [Pair] -> (Text -> [Pair]) -> Maybe Text -> [Pair]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] (\Text
m -> [Key
"mimeType" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Text
m]) (ResourceDefinition -> Maybe Text
resourceDefinitionMimeType ResourceDefinition
def)

-- | Tool definition
data ToolDefinition = ToolDefinition
  { ToolDefinition -> Text
toolDefinitionName        :: Text
  , ToolDefinition -> Text
toolDefinitionDescription :: Text
  , ToolDefinition -> InputSchemaDefinition
toolDefinitionInputSchema :: InputSchemaDefinition
  } deriving (Int -> ToolDefinition -> ShowS
[ToolDefinition] -> ShowS
ToolDefinition -> String
(Int -> ToolDefinition -> ShowS)
-> (ToolDefinition -> String)
-> ([ToolDefinition] -> ShowS)
-> Show ToolDefinition
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ToolDefinition -> ShowS
showsPrec :: Int -> ToolDefinition -> ShowS
$cshow :: ToolDefinition -> String
show :: ToolDefinition -> String
$cshowList :: [ToolDefinition] -> ShowS
showList :: [ToolDefinition] -> ShowS
Show, ToolDefinition -> ToolDefinition -> Bool
(ToolDefinition -> ToolDefinition -> Bool)
-> (ToolDefinition -> ToolDefinition -> Bool) -> Eq ToolDefinition
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ToolDefinition -> ToolDefinition -> Bool
== :: ToolDefinition -> ToolDefinition -> Bool
$c/= :: ToolDefinition -> ToolDefinition -> Bool
/= :: ToolDefinition -> ToolDefinition -> Bool
Eq, (forall x. ToolDefinition -> Rep ToolDefinition x)
-> (forall x. Rep ToolDefinition x -> ToolDefinition)
-> Generic ToolDefinition
forall x. Rep ToolDefinition x -> ToolDefinition
forall x. ToolDefinition -> Rep ToolDefinition x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. ToolDefinition -> Rep ToolDefinition x
from :: forall x. ToolDefinition -> Rep ToolDefinition x
$cto :: forall x. Rep ToolDefinition x -> ToolDefinition
to :: forall x. Rep ToolDefinition x -> ToolDefinition
Generic)

instance ToJSON ToolDefinition where
  toJSON :: ToolDefinition -> Value
toJSON ToolDefinition
def = [Pair] -> Value
object
    [ Key
"name" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= ToolDefinition -> Text
toolDefinitionName ToolDefinition
def
    , Key
"description" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= ToolDefinition -> Text
toolDefinitionDescription ToolDefinition
def
    , Key
"inputSchema" Key -> InputSchemaDefinition -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= ToolDefinition -> InputSchemaDefinition
toolDefinitionInputSchema ToolDefinition
def
    ]

-- | Argument definition for prompts
data ArgumentDefinition = ArgumentDefinition
  { ArgumentDefinition -> Text
argumentDefinitionName        :: Text
  , ArgumentDefinition -> Text
argumentDefinitionDescription :: Text
  , ArgumentDefinition -> Bool
argumentDefinitionRequired    :: Bool
  } deriving (Int -> ArgumentDefinition -> ShowS
[ArgumentDefinition] -> ShowS
ArgumentDefinition -> String
(Int -> ArgumentDefinition -> ShowS)
-> (ArgumentDefinition -> String)
-> ([ArgumentDefinition] -> ShowS)
-> Show ArgumentDefinition
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ArgumentDefinition -> ShowS
showsPrec :: Int -> ArgumentDefinition -> ShowS
$cshow :: ArgumentDefinition -> String
show :: ArgumentDefinition -> String
$cshowList :: [ArgumentDefinition] -> ShowS
showList :: [ArgumentDefinition] -> ShowS
Show, ArgumentDefinition -> ArgumentDefinition -> Bool
(ArgumentDefinition -> ArgumentDefinition -> Bool)
-> (ArgumentDefinition -> ArgumentDefinition -> Bool)
-> Eq ArgumentDefinition
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ArgumentDefinition -> ArgumentDefinition -> Bool
== :: ArgumentDefinition -> ArgumentDefinition -> Bool
$c/= :: ArgumentDefinition -> ArgumentDefinition -> Bool
/= :: ArgumentDefinition -> ArgumentDefinition -> Bool
Eq, (forall x. ArgumentDefinition -> Rep ArgumentDefinition x)
-> (forall x. Rep ArgumentDefinition x -> ArgumentDefinition)
-> Generic ArgumentDefinition
forall x. Rep ArgumentDefinition x -> ArgumentDefinition
forall x. ArgumentDefinition -> Rep ArgumentDefinition x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. ArgumentDefinition -> Rep ArgumentDefinition x
from :: forall x. ArgumentDefinition -> Rep ArgumentDefinition x
$cto :: forall x. Rep ArgumentDefinition x -> ArgumentDefinition
to :: forall x. Rep ArgumentDefinition x -> ArgumentDefinition
Generic)

instance ToJSON ArgumentDefinition where
  toJSON :: ArgumentDefinition -> Value
toJSON ArgumentDefinition
def = [Pair] -> Value
object
    [ Key
"name" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= ArgumentDefinition -> Text
argumentDefinitionName ArgumentDefinition
def
    , Key
"description" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= ArgumentDefinition -> Text
argumentDefinitionDescription ArgumentDefinition
def
    , Key
"required" Key -> Bool -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= ArgumentDefinition -> Bool
argumentDefinitionRequired ArgumentDefinition
def
    ]

-- | Input schema definition for tools
data InputSchemaDefinition = InputSchemaDefinitionObject
  { InputSchemaDefinition -> [(Text, InputSchemaDefinitionProperty)]
properties :: [(Text, InputSchemaDefinitionProperty)]
  , InputSchemaDefinition -> [Text]
required   :: [Text]
  } deriving (Int -> InputSchemaDefinition -> ShowS
[InputSchemaDefinition] -> ShowS
InputSchemaDefinition -> String
(Int -> InputSchemaDefinition -> ShowS)
-> (InputSchemaDefinition -> String)
-> ([InputSchemaDefinition] -> ShowS)
-> Show InputSchemaDefinition
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> InputSchemaDefinition -> ShowS
showsPrec :: Int -> InputSchemaDefinition -> ShowS
$cshow :: InputSchemaDefinition -> String
show :: InputSchemaDefinition -> String
$cshowList :: [InputSchemaDefinition] -> ShowS
showList :: [InputSchemaDefinition] -> ShowS
Show, InputSchemaDefinition -> InputSchemaDefinition -> Bool
(InputSchemaDefinition -> InputSchemaDefinition -> Bool)
-> (InputSchemaDefinition -> InputSchemaDefinition -> Bool)
-> Eq InputSchemaDefinition
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: InputSchemaDefinition -> InputSchemaDefinition -> Bool
== :: InputSchemaDefinition -> InputSchemaDefinition -> Bool
$c/= :: InputSchemaDefinition -> InputSchemaDefinition -> Bool
/= :: InputSchemaDefinition -> InputSchemaDefinition -> Bool
Eq, (forall x. InputSchemaDefinition -> Rep InputSchemaDefinition x)
-> (forall x. Rep InputSchemaDefinition x -> InputSchemaDefinition)
-> Generic InputSchemaDefinition
forall x. Rep InputSchemaDefinition x -> InputSchemaDefinition
forall x. InputSchemaDefinition -> Rep InputSchemaDefinition x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. InputSchemaDefinition -> Rep InputSchemaDefinition x
from :: forall x. InputSchemaDefinition -> Rep InputSchemaDefinition x
$cto :: forall x. Rep InputSchemaDefinition x -> InputSchemaDefinition
to :: forall x. Rep InputSchemaDefinition x -> InputSchemaDefinition
Generic)

instance ToJSON InputSchemaDefinition where
  toJSON :: InputSchemaDefinition -> Value
toJSON (InputSchemaDefinitionObject [(Text, InputSchemaDefinitionProperty)]
props [Text]
req) = [Pair] -> Value
object
    [ Key
"type" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= (Text
"object" :: Text)
    , Key
"properties" Key -> Value -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [Pair] -> Value
object (((Text, InputSchemaDefinitionProperty) -> Pair)
-> [(Text, InputSchemaDefinitionProperty)] -> [Pair]
forall a b. (a -> b) -> [a] -> [b]
map (\(Text
k, InputSchemaDefinitionProperty
v) -> Text -> Key
fromText Text
k Key -> InputSchemaDefinitionProperty -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= InputSchemaDefinitionProperty
v) [(Text, InputSchemaDefinitionProperty)]
props)
    , Key
"required" Key -> [Text] -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [Text]
req
    ]

data InputSchemaDefinitionProperty = InputSchemaDefinitionProperty
  { InputSchemaDefinitionProperty -> Text
propertyType        :: Text
  , InputSchemaDefinitionProperty -> Text
propertyDescription :: Text
  } deriving (Int -> InputSchemaDefinitionProperty -> ShowS
[InputSchemaDefinitionProperty] -> ShowS
InputSchemaDefinitionProperty -> String
(Int -> InputSchemaDefinitionProperty -> ShowS)
-> (InputSchemaDefinitionProperty -> String)
-> ([InputSchemaDefinitionProperty] -> ShowS)
-> Show InputSchemaDefinitionProperty
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> InputSchemaDefinitionProperty -> ShowS
showsPrec :: Int -> InputSchemaDefinitionProperty -> ShowS
$cshow :: InputSchemaDefinitionProperty -> String
show :: InputSchemaDefinitionProperty -> String
$cshowList :: [InputSchemaDefinitionProperty] -> ShowS
showList :: [InputSchemaDefinitionProperty] -> ShowS
Show, InputSchemaDefinitionProperty
-> InputSchemaDefinitionProperty -> Bool
(InputSchemaDefinitionProperty
 -> InputSchemaDefinitionProperty -> Bool)
-> (InputSchemaDefinitionProperty
    -> InputSchemaDefinitionProperty -> Bool)
-> Eq InputSchemaDefinitionProperty
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: InputSchemaDefinitionProperty
-> InputSchemaDefinitionProperty -> Bool
== :: InputSchemaDefinitionProperty
-> InputSchemaDefinitionProperty -> Bool
$c/= :: InputSchemaDefinitionProperty
-> InputSchemaDefinitionProperty -> Bool
/= :: InputSchemaDefinitionProperty
-> InputSchemaDefinitionProperty -> Bool
Eq, (forall x.
 InputSchemaDefinitionProperty
 -> Rep InputSchemaDefinitionProperty x)
-> (forall x.
    Rep InputSchemaDefinitionProperty x
    -> InputSchemaDefinitionProperty)
-> Generic InputSchemaDefinitionProperty
forall x.
Rep InputSchemaDefinitionProperty x
-> InputSchemaDefinitionProperty
forall x.
InputSchemaDefinitionProperty
-> Rep InputSchemaDefinitionProperty x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x.
InputSchemaDefinitionProperty
-> Rep InputSchemaDefinitionProperty x
from :: forall x.
InputSchemaDefinitionProperty
-> Rep InputSchemaDefinitionProperty x
$cto :: forall x.
Rep InputSchemaDefinitionProperty x
-> InputSchemaDefinitionProperty
to :: forall x.
Rep InputSchemaDefinitionProperty x
-> InputSchemaDefinitionProperty
Generic)

instance ToJSON InputSchemaDefinitionProperty where
  toJSON :: InputSchemaDefinitionProperty -> Value
toJSON InputSchemaDefinitionProperty
prop = [Pair] -> Value
object
    [ Key
"type" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= InputSchemaDefinitionProperty -> Text
propertyType InputSchemaDefinitionProperty
prop
    , Key
"description" Key -> Text -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= InputSchemaDefinitionProperty -> Text
propertyDescription InputSchemaDefinitionProperty
prop
    ]

-- | Server information
data McpServerInfo = McpServerInfo
  { McpServerInfo -> Text
serverName         :: Text
  , McpServerInfo -> Text
serverVersion      :: Text
  , McpServerInfo -> Text
serverInstructions :: Text
  } deriving (Int -> McpServerInfo -> ShowS
[McpServerInfo] -> ShowS
McpServerInfo -> String
(Int -> McpServerInfo -> ShowS)
-> (McpServerInfo -> String)
-> ([McpServerInfo] -> ShowS)
-> Show McpServerInfo
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> McpServerInfo -> ShowS
showsPrec :: Int -> McpServerInfo -> ShowS
$cshow :: McpServerInfo -> String
show :: McpServerInfo -> String
$cshowList :: [McpServerInfo] -> ShowS
showList :: [McpServerInfo] -> ShowS
Show, McpServerInfo -> McpServerInfo -> Bool
(McpServerInfo -> McpServerInfo -> Bool)
-> (McpServerInfo -> McpServerInfo -> Bool) -> Eq McpServerInfo
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: McpServerInfo -> McpServerInfo -> Bool
== :: McpServerInfo -> McpServerInfo -> Bool
$c/= :: McpServerInfo -> McpServerInfo -> Bool
/= :: McpServerInfo -> McpServerInfo -> Bool
Eq, (forall x. McpServerInfo -> Rep McpServerInfo x)
-> (forall x. Rep McpServerInfo x -> McpServerInfo)
-> Generic McpServerInfo
forall x. Rep McpServerInfo x -> McpServerInfo
forall x. McpServerInfo -> Rep McpServerInfo x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. McpServerInfo -> Rep McpServerInfo x
from :: forall x. McpServerInfo -> Rep McpServerInfo x
$cto :: forall x. Rep McpServerInfo x -> McpServerInfo
to :: forall x. Rep McpServerInfo x -> McpServerInfo
Generic)

-- | Individual capability objects
data PromptCapabilities = PromptCapabilities
  { PromptCapabilities -> Maybe Bool
promptListChanged :: Maybe Bool
  } deriving (Int -> PromptCapabilities -> ShowS
[PromptCapabilities] -> ShowS
PromptCapabilities -> String
(Int -> PromptCapabilities -> ShowS)
-> (PromptCapabilities -> String)
-> ([PromptCapabilities] -> ShowS)
-> Show PromptCapabilities
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> PromptCapabilities -> ShowS
showsPrec :: Int -> PromptCapabilities -> ShowS
$cshow :: PromptCapabilities -> String
show :: PromptCapabilities -> String
$cshowList :: [PromptCapabilities] -> ShowS
showList :: [PromptCapabilities] -> ShowS
Show, PromptCapabilities -> PromptCapabilities -> Bool
(PromptCapabilities -> PromptCapabilities -> Bool)
-> (PromptCapabilities -> PromptCapabilities -> Bool)
-> Eq PromptCapabilities
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: PromptCapabilities -> PromptCapabilities -> Bool
== :: PromptCapabilities -> PromptCapabilities -> Bool
$c/= :: PromptCapabilities -> PromptCapabilities -> Bool
/= :: PromptCapabilities -> PromptCapabilities -> Bool
Eq, (forall x. PromptCapabilities -> Rep PromptCapabilities x)
-> (forall x. Rep PromptCapabilities x -> PromptCapabilities)
-> Generic PromptCapabilities
forall x. Rep PromptCapabilities x -> PromptCapabilities
forall x. PromptCapabilities -> Rep PromptCapabilities x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. PromptCapabilities -> Rep PromptCapabilities x
from :: forall x. PromptCapabilities -> Rep PromptCapabilities x
$cto :: forall x. Rep PromptCapabilities x -> PromptCapabilities
to :: forall x. Rep PromptCapabilities x -> PromptCapabilities
Generic)

instance ToJSON PromptCapabilities where
  toJSON :: PromptCapabilities -> Value
toJSON PromptCapabilities
caps = [Pair] -> Value
object ([Pair] -> Value) -> [Pair] -> Value
forall a b. (a -> b) -> a -> b
$ [Maybe Pair] -> [Pair]
forall a. [Maybe a] -> [a]
catMaybes
    [ (Bool -> Pair) -> Maybe Bool -> Maybe Pair
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Key
"listChanged" Key -> Bool -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.=) (PromptCapabilities -> Maybe Bool
promptListChanged PromptCapabilities
caps)
    ]

data ResourceCapabilities = ResourceCapabilities
  { ResourceCapabilities -> Maybe Bool
resourceSubscribe   :: Maybe Bool
  , ResourceCapabilities -> Maybe Bool
resourceListChanged :: Maybe Bool
  } deriving (Int -> ResourceCapabilities -> ShowS
[ResourceCapabilities] -> ShowS
ResourceCapabilities -> String
(Int -> ResourceCapabilities -> ShowS)
-> (ResourceCapabilities -> String)
-> ([ResourceCapabilities] -> ShowS)
-> Show ResourceCapabilities
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ResourceCapabilities -> ShowS
showsPrec :: Int -> ResourceCapabilities -> ShowS
$cshow :: ResourceCapabilities -> String
show :: ResourceCapabilities -> String
$cshowList :: [ResourceCapabilities] -> ShowS
showList :: [ResourceCapabilities] -> ShowS
Show, ResourceCapabilities -> ResourceCapabilities -> Bool
(ResourceCapabilities -> ResourceCapabilities -> Bool)
-> (ResourceCapabilities -> ResourceCapabilities -> Bool)
-> Eq ResourceCapabilities
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ResourceCapabilities -> ResourceCapabilities -> Bool
== :: ResourceCapabilities -> ResourceCapabilities -> Bool
$c/= :: ResourceCapabilities -> ResourceCapabilities -> Bool
/= :: ResourceCapabilities -> ResourceCapabilities -> Bool
Eq, (forall x. ResourceCapabilities -> Rep ResourceCapabilities x)
-> (forall x. Rep ResourceCapabilities x -> ResourceCapabilities)
-> Generic ResourceCapabilities
forall x. Rep ResourceCapabilities x -> ResourceCapabilities
forall x. ResourceCapabilities -> Rep ResourceCapabilities x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. ResourceCapabilities -> Rep ResourceCapabilities x
from :: forall x. ResourceCapabilities -> Rep ResourceCapabilities x
$cto :: forall x. Rep ResourceCapabilities x -> ResourceCapabilities
to :: forall x. Rep ResourceCapabilities x -> ResourceCapabilities
Generic)

instance ToJSON ResourceCapabilities where
  toJSON :: ResourceCapabilities -> Value
toJSON ResourceCapabilities
caps = [Pair] -> Value
object ([Pair] -> Value) -> [Pair] -> Value
forall a b. (a -> b) -> a -> b
$ [Maybe Pair] -> [Pair]
forall a. [Maybe a] -> [a]
catMaybes
    [ (Bool -> Pair) -> Maybe Bool -> Maybe Pair
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Key
"subscribe" Key -> Bool -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.=) (ResourceCapabilities -> Maybe Bool
resourceSubscribe ResourceCapabilities
caps)
    , (Bool -> Pair) -> Maybe Bool -> Maybe Pair
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Key
"listChanged" Key -> Bool -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.=) (ResourceCapabilities -> Maybe Bool
resourceListChanged ResourceCapabilities
caps)
    ]

data ToolCapabilities = ToolCapabilities
  { ToolCapabilities -> Maybe Bool
toolListChanged :: Maybe Bool
  } deriving (Int -> ToolCapabilities -> ShowS
[ToolCapabilities] -> ShowS
ToolCapabilities -> String
(Int -> ToolCapabilities -> ShowS)
-> (ToolCapabilities -> String)
-> ([ToolCapabilities] -> ShowS)
-> Show ToolCapabilities
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ToolCapabilities -> ShowS
showsPrec :: Int -> ToolCapabilities -> ShowS
$cshow :: ToolCapabilities -> String
show :: ToolCapabilities -> String
$cshowList :: [ToolCapabilities] -> ShowS
showList :: [ToolCapabilities] -> ShowS
Show, ToolCapabilities -> ToolCapabilities -> Bool
(ToolCapabilities -> ToolCapabilities -> Bool)
-> (ToolCapabilities -> ToolCapabilities -> Bool)
-> Eq ToolCapabilities
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ToolCapabilities -> ToolCapabilities -> Bool
== :: ToolCapabilities -> ToolCapabilities -> Bool
$c/= :: ToolCapabilities -> ToolCapabilities -> Bool
/= :: ToolCapabilities -> ToolCapabilities -> Bool
Eq, (forall x. ToolCapabilities -> Rep ToolCapabilities x)
-> (forall x. Rep ToolCapabilities x -> ToolCapabilities)
-> Generic ToolCapabilities
forall x. Rep ToolCapabilities x -> ToolCapabilities
forall x. ToolCapabilities -> Rep ToolCapabilities x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. ToolCapabilities -> Rep ToolCapabilities x
from :: forall x. ToolCapabilities -> Rep ToolCapabilities x
$cto :: forall x. Rep ToolCapabilities x -> ToolCapabilities
to :: forall x. Rep ToolCapabilities x -> ToolCapabilities
Generic)

instance ToJSON ToolCapabilities where
  toJSON :: ToolCapabilities -> Value
toJSON ToolCapabilities
caps = [Pair] -> Value
object ([Pair] -> Value) -> [Pair] -> Value
forall a b. (a -> b) -> a -> b
$ [Maybe Pair] -> [Pair]
forall a. [Maybe a] -> [a]
catMaybes
    [ (Bool -> Pair) -> Maybe Bool -> Maybe Pair
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Key
"listChanged" Key -> Bool -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.=) (ToolCapabilities -> Maybe Bool
toolListChanged ToolCapabilities
caps)
    ]

data LoggingCapabilities = LoggingCapabilities
  { -- No specific sub-capabilities for logging yet
  } deriving (Int -> LoggingCapabilities -> ShowS
[LoggingCapabilities] -> ShowS
LoggingCapabilities -> String
(Int -> LoggingCapabilities -> ShowS)
-> (LoggingCapabilities -> String)
-> ([LoggingCapabilities] -> ShowS)
-> Show LoggingCapabilities
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> LoggingCapabilities -> ShowS
showsPrec :: Int -> LoggingCapabilities -> ShowS
$cshow :: LoggingCapabilities -> String
show :: LoggingCapabilities -> String
$cshowList :: [LoggingCapabilities] -> ShowS
showList :: [LoggingCapabilities] -> ShowS
Show, LoggingCapabilities -> LoggingCapabilities -> Bool
(LoggingCapabilities -> LoggingCapabilities -> Bool)
-> (LoggingCapabilities -> LoggingCapabilities -> Bool)
-> Eq LoggingCapabilities
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: LoggingCapabilities -> LoggingCapabilities -> Bool
== :: LoggingCapabilities -> LoggingCapabilities -> Bool
$c/= :: LoggingCapabilities -> LoggingCapabilities -> Bool
/= :: LoggingCapabilities -> LoggingCapabilities -> Bool
Eq, (forall x. LoggingCapabilities -> Rep LoggingCapabilities x)
-> (forall x. Rep LoggingCapabilities x -> LoggingCapabilities)
-> Generic LoggingCapabilities
forall x. Rep LoggingCapabilities x -> LoggingCapabilities
forall x. LoggingCapabilities -> Rep LoggingCapabilities x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. LoggingCapabilities -> Rep LoggingCapabilities x
from :: forall x. LoggingCapabilities -> Rep LoggingCapabilities x
$cto :: forall x. Rep LoggingCapabilities x -> LoggingCapabilities
to :: forall x. Rep LoggingCapabilities x -> LoggingCapabilities
Generic)

instance ToJSON LoggingCapabilities where
  toJSON :: LoggingCapabilities -> Value
toJSON LoggingCapabilities
_ = [Pair] -> Value
object []

-- | Server capabilities
data ServerCapabilities = ServerCapabilities
  { ServerCapabilities -> Maybe PromptCapabilities
capabilityPrompts   :: Maybe PromptCapabilities
  , ServerCapabilities -> Maybe ResourceCapabilities
capabilityResources :: Maybe ResourceCapabilities
  , ServerCapabilities -> Maybe ToolCapabilities
capabilityTools     :: Maybe ToolCapabilities
  , ServerCapabilities -> Maybe LoggingCapabilities
capabilityLogging   :: Maybe LoggingCapabilities
  } deriving (Int -> ServerCapabilities -> ShowS
[ServerCapabilities] -> ShowS
ServerCapabilities -> String
(Int -> ServerCapabilities -> ShowS)
-> (ServerCapabilities -> String)
-> ([ServerCapabilities] -> ShowS)
-> Show ServerCapabilities
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ServerCapabilities -> ShowS
showsPrec :: Int -> ServerCapabilities -> ShowS
$cshow :: ServerCapabilities -> String
show :: ServerCapabilities -> String
$cshowList :: [ServerCapabilities] -> ShowS
showList :: [ServerCapabilities] -> ShowS
Show, ServerCapabilities -> ServerCapabilities -> Bool
(ServerCapabilities -> ServerCapabilities -> Bool)
-> (ServerCapabilities -> ServerCapabilities -> Bool)
-> Eq ServerCapabilities
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ServerCapabilities -> ServerCapabilities -> Bool
== :: ServerCapabilities -> ServerCapabilities -> Bool
$c/= :: ServerCapabilities -> ServerCapabilities -> Bool
/= :: ServerCapabilities -> ServerCapabilities -> Bool
Eq, (forall x. ServerCapabilities -> Rep ServerCapabilities x)
-> (forall x. Rep ServerCapabilities x -> ServerCapabilities)
-> Generic ServerCapabilities
forall x. Rep ServerCapabilities x -> ServerCapabilities
forall x. ServerCapabilities -> Rep ServerCapabilities x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. ServerCapabilities -> Rep ServerCapabilities x
from :: forall x. ServerCapabilities -> Rep ServerCapabilities x
$cto :: forall x. Rep ServerCapabilities x -> ServerCapabilities
to :: forall x. Rep ServerCapabilities x -> ServerCapabilities
Generic)

instance ToJSON ServerCapabilities where
  toJSON :: ServerCapabilities -> Value
toJSON ServerCapabilities
caps = [Pair] -> Value
object ([Pair] -> Value) -> [Pair] -> Value
forall a b. (a -> b) -> a -> b
$ [Maybe Pair] -> [Pair]
forall a. [Maybe a] -> [a]
catMaybes
    [ (PromptCapabilities -> Pair)
-> Maybe PromptCapabilities -> Maybe Pair
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Key
"prompts" Key -> PromptCapabilities -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.=) (ServerCapabilities -> Maybe PromptCapabilities
capabilityPrompts ServerCapabilities
caps)
    , (ResourceCapabilities -> Pair)
-> Maybe ResourceCapabilities -> Maybe Pair
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Key
"resources" Key -> ResourceCapabilities -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.=) (ServerCapabilities -> Maybe ResourceCapabilities
capabilityResources ServerCapabilities
caps)
    , (ToolCapabilities -> Pair) -> Maybe ToolCapabilities -> Maybe Pair
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Key
"tools" Key -> ToolCapabilities -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.=) (ServerCapabilities -> Maybe ToolCapabilities
capabilityTools ServerCapabilities
caps)
    , (LoggingCapabilities -> Pair)
-> Maybe LoggingCapabilities -> Maybe Pair
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Key
"logging" Key -> LoggingCapabilities -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.=) (ServerCapabilities -> Maybe LoggingCapabilities
capabilityLogging ServerCapabilities
caps)
    ]


-- | Handler type definitions
type PromptListHandler m = m [PromptDefinition]
type PromptGetHandler m = PromptName -> [(ArgumentName, ArgumentValue)] -> m (Either Error Content)

type ResourceListHandler m = m [ResourceDefinition]
type ResourceReadHandler m = URI -> m (Either Error Content)

type ToolListHandler m = m [ToolDefinition]
type ToolCallHandler m = ToolName -> [(ArgumentName, ArgumentValue)] -> m (Either Error Content)

-- | Server handlers
data McpServerHandlers m = McpServerHandlers
  { forall (m :: * -> *).
McpServerHandlers m
-> Maybe (PromptListHandler m, PromptGetHandler m)
prompts   :: Maybe (PromptListHandler m, PromptGetHandler m)
  , forall (m :: * -> *).
McpServerHandlers m
-> Maybe (ResourceListHandler m, ResourceReadHandler m)
resources :: Maybe (ResourceListHandler m, ResourceReadHandler m)
  , forall (m :: * -> *).
McpServerHandlers m
-> Maybe (ToolListHandler m, PromptGetHandler m)
tools     :: Maybe (ToolListHandler m, ToolCallHandler m)
  }