polytropos-mcp
Copyright(c) 2026 The Polytropos Authors
LicenseEUPL-1.2 OR Apache-2.0
Maintainernadia.yvette.chambers@ik.me
Stabilityexperimental
Portabilitynon-portable (GHC extensions)
Safe HaskellNone
LanguageGHC2021

Polytropos.MCP

Description

Model Context Protocol (MCP) tool integration and JSON-RPC dispatch for polytropos open records and variants.

Architectural Overview & Rationale

The MCP Schema Problem

In standard Model Context Protocol server implementations, defining tools requires tedious manual duplication: 1. Declaring a nominal parameter data type. 2. Deriving or writing an OpenAPI / JSON Schema definition. 3. Writing a parser that inspects the tool name string and runs the appropriate decoder. 4. Writing an error-prone dispatcher branch that invokes the handler.

The Polytropos Solution

polytropos-mcp collapses this entire pipeline into row types: * Tool Schemas: A tool's parameters are just an open record row type r. recordToTool reifies r into an OpenAPI schema directly via OpenApi. * Tool Call Variant: The entire suite of registered tools forms an open sum variant Variant s, where constructor tags match tool names and constructor payloads match parameter rows. * \(O(1)\) Dispatch: Tool calls are parsed into Variant s and dispatched using eliminateUniform, compiling to an indirect function call jump table without string comparisons or branch cascades. * Dynamic Extensibility: New tools can be added to the server by simply widening the variant with widenVariant.

When to Use This Module

  • When exposing polytropos data pipelines, compilers, or database query engines to AI coding assistants (such as Claude, Gemini, or custom agent frameworks) via the standard Model Context Protocol.

Worked Example

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedRecordDot #-}
{-# LANGUAGE TypeApplications #-}

import Data.Proxy (Proxy (..))
import Data.Text (Text)
import Polytropos
import Polytropos.MCP

-- 1. Define parameter rows for tools:
type SearchArgs = '["query" ':= Text, "limit" ':= Int]
type EchoArgs   = '["message" ':= Text]

-- 2. Define the tool registry as an open variant:
type MyTools = Variant
  '[ "search" ':= SearchArgs
   , "echo"   := EchoArgs
   ]

-- 3. Generate tool manifests with OpenAPI schemas:
toolList :: [McpTool]
toolList =
  [ recordToTool @"search" "Search indexed documents" (Proxy @SearchArgs)
  , recordToTool @"echo"   "Echo back a message"      (Proxy @EchoArgs)
  ]

-- 4. Dispatch tool calls using O(1) jump tables:
handleCall :: MyTools -> IO [McpContent]
handleCall = eliminateUniform REC
  { search = \args -> pure [TextContent ("Found hits for: " <> args.query)]
  , echo   = \args -> pure [TextContent ("Echo: " <> args.message)]
  }
Synopsis

MCP Protocol Data Types

data JsonRpcRequest Source #

A JSON-RPC 2.0 request or notification envelope.

Instances

Instances details
FromJSON JsonRpcRequest Source # 
Instance details

Defined in Polytropos.MCP

Eq JsonRpcRequest Source # 
Instance details

Defined in Polytropos.MCP

Generic JsonRpcRequest Source # 
Instance details

Defined in Polytropos.MCP

Associated Types

type Rep JsonRpcRequest 
Instance details

Defined in Polytropos.MCP

type Rep JsonRpcRequest = D1 ('MetaData "JsonRpcRequest" "Polytropos.MCP" "polytropos-mcp-0.1.0.0-inplace" 'False) (C1 ('MetaCons "JsonRpcRequest" 'PrefixI 'True) ((S1 ('MetaSel ('Just "jsonrpcReqVersion") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Text) :*: S1 ('MetaSel ('Just "jsonrpcReqMethod") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Text)) :*: (S1 ('MetaSel ('Just "jsonrpcReqId") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Maybe Value)) :*: S1 ('MetaSel ('Just "jsonrpcReqParams") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Maybe Value)))))
Show JsonRpcRequest Source # 
Instance details

Defined in Polytropos.MCP

type Rep JsonRpcRequest Source # 
Instance details

Defined in Polytropos.MCP

type Rep JsonRpcRequest = D1 ('MetaData "JsonRpcRequest" "Polytropos.MCP" "polytropos-mcp-0.1.0.0-inplace" 'False) (C1 ('MetaCons "JsonRpcRequest" 'PrefixI 'True) ((S1 ('MetaSel ('Just "jsonrpcReqVersion") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Text) :*: S1 ('MetaSel ('Just "jsonrpcReqMethod") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Text)) :*: (S1 ('MetaSel ('Just "jsonrpcReqId") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Maybe Value)) :*: S1 ('MetaSel ('Just "jsonrpcReqParams") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Maybe Value)))))

data JsonRpcResponse Source #

A JSON-RPC 2.0 response envelope.

Instances

Instances details
FromJSON JsonRpcResponse Source # 
Instance details

Defined in Polytropos.MCP

ToJSON JsonRpcResponse Source # 
Instance details

Defined in Polytropos.MCP

Eq JsonRpcResponse Source # 
Instance details

Defined in Polytropos.MCP

Generic JsonRpcResponse Source # 
Instance details

Defined in Polytropos.MCP

Associated Types

type Rep JsonRpcResponse 
Instance details

Defined in Polytropos.MCP

type Rep JsonRpcResponse = D1 ('MetaData "JsonRpcResponse" "Polytropos.MCP" "polytropos-mcp-0.1.0.0-inplace" 'False) (C1 ('MetaCons "JsonRpcResponse" 'PrefixI 'True) ((S1 ('MetaSel ('Just "jsonrpcRespVersion") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Text) :*: S1 ('MetaSel ('Just "jsonrpcRespId") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Maybe Value))) :*: (S1 ('MetaSel ('Just "jsonrpcRespResult") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Maybe Value)) :*: S1 ('MetaSel ('Just "jsonrpcRespError") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Maybe JsonRpcError)))))
Show JsonRpcResponse Source # 
Instance details

Defined in Polytropos.MCP

type Rep JsonRpcResponse Source # 
Instance details

Defined in Polytropos.MCP

type Rep JsonRpcResponse = D1 ('MetaData "JsonRpcResponse" "Polytropos.MCP" "polytropos-mcp-0.1.0.0-inplace" 'False) (C1 ('MetaCons "JsonRpcResponse" 'PrefixI 'True) ((S1 ('MetaSel ('Just "jsonrpcRespVersion") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Text) :*: S1 ('MetaSel ('Just "jsonrpcRespId") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Maybe Value))) :*: (S1 ('MetaSel ('Just "jsonrpcRespResult") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Maybe Value)) :*: S1 ('MetaSel ('Just "jsonrpcRespError") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Maybe JsonRpcError)))))

data JsonRpcError Source #

A JSON-RPC 2.0 protocol error object.

Instances

Instances details
FromJSON JsonRpcError Source # 
Instance details

Defined in Polytropos.MCP

ToJSON JsonRpcError Source # 
Instance details

Defined in Polytropos.MCP

Eq JsonRpcError Source # 
Instance details

Defined in Polytropos.MCP

Generic JsonRpcError Source # 
Instance details

Defined in Polytropos.MCP

Associated Types

type Rep JsonRpcError 
Instance details

Defined in Polytropos.MCP

type Rep JsonRpcError = D1 ('MetaData "JsonRpcError" "Polytropos.MCP" "polytropos-mcp-0.1.0.0-inplace" 'False) (C1 ('MetaCons "JsonRpcError" 'PrefixI 'True) (S1 ('MetaSel ('Just "jsonrpcErrorCode") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Int) :*: (S1 ('MetaSel ('Just "jsonrpcErrorMessage") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Text) :*: S1 ('MetaSel ('Just "jsonrpcErrorData") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Maybe Value)))))
Show JsonRpcError Source # 
Instance details

Defined in Polytropos.MCP

type Rep JsonRpcError Source # 
Instance details

Defined in Polytropos.MCP

type Rep JsonRpcError = D1 ('MetaData "JsonRpcError" "Polytropos.MCP" "polytropos-mcp-0.1.0.0-inplace" 'False) (C1 ('MetaCons "JsonRpcError" 'PrefixI 'True) (S1 ('MetaSel ('Just "jsonrpcErrorCode") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Int) :*: (S1 ('MetaSel ('Just "jsonrpcErrorMessage") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Text) :*: S1 ('MetaSel ('Just "jsonrpcErrorData") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Maybe Value)))))

data McpTool Source #

An MCP Tool specification describing a callable tool.

Constructors

McpTool 

Fields

Instances

Instances details
FromJSON McpTool Source # 
Instance details

Defined in Polytropos.MCP

ToJSON McpTool Source # 
Instance details

Defined in Polytropos.MCP

Eq McpTool Source # 
Instance details

Defined in Polytropos.MCP

Methods

(==) :: McpTool -> McpTool -> Bool #

(/=) :: McpTool -> McpTool -> Bool #

Generic McpTool Source # 
Instance details

Defined in Polytropos.MCP

Associated Types

type Rep McpTool 
Instance details

Defined in Polytropos.MCP

type Rep McpTool = D1 ('MetaData "McpTool" "Polytropos.MCP" "polytropos-mcp-0.1.0.0-inplace" 'False) (C1 ('MetaCons "McpTool" 'PrefixI 'True) (S1 ('MetaSel ('Just "toolName") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Text) :*: (S1 ('MetaSel ('Just "toolDescription") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Text) :*: S1 ('MetaSel ('Just "toolInputSchema") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Value))))

Methods

from :: McpTool -> Rep McpTool x

to :: Rep McpTool x -> McpTool

Show McpTool Source # 
Instance details

Defined in Polytropos.MCP

type Rep McpTool Source # 
Instance details

Defined in Polytropos.MCP

type Rep McpTool = D1 ('MetaData "McpTool" "Polytropos.MCP" "polytropos-mcp-0.1.0.0-inplace" 'False) (C1 ('MetaCons "McpTool" 'PrefixI 'True) (S1 ('MetaSel ('Just "toolName") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Text) :*: (S1 ('MetaSel ('Just "toolDescription") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Text) :*: S1 ('MetaSel ('Just "toolInputSchema") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Value))))

data CallToolParams Source #

Parameters passed in an MCP tools/call request.

Constructors

CallToolParams 

Fields

Instances

Instances details
FromJSON CallToolParams Source # 
Instance details

Defined in Polytropos.MCP

Eq CallToolParams Source # 
Instance details

Defined in Polytropos.MCP

Generic CallToolParams Source # 
Instance details

Defined in Polytropos.MCP

Associated Types

type Rep CallToolParams 
Instance details

Defined in Polytropos.MCP

type Rep CallToolParams = D1 ('MetaData "CallToolParams" "Polytropos.MCP" "polytropos-mcp-0.1.0.0-inplace" 'False) (C1 ('MetaCons "CallToolParams" 'PrefixI 'True) (S1 ('MetaSel ('Just "callToolName") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Text) :*: S1 ('MetaSel ('Just "callToolArguments") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Maybe Value))))
Show CallToolParams Source # 
Instance details

Defined in Polytropos.MCP

type Rep CallToolParams Source # 
Instance details

Defined in Polytropos.MCP

type Rep CallToolParams = D1 ('MetaData "CallToolParams" "Polytropos.MCP" "polytropos-mcp-0.1.0.0-inplace" 'False) (C1 ('MetaCons "CallToolParams" 'PrefixI 'True) (S1 ('MetaSel ('Just "callToolName") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Text) :*: S1 ('MetaSel ('Just "callToolArguments") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Maybe Value))))

data CallToolResult Source #

Result of an MCP tools/call execution.

Instances

Instances details
FromJSON CallToolResult Source # 
Instance details

Defined in Polytropos.MCP

ToJSON CallToolResult Source # 
Instance details

Defined in Polytropos.MCP

Eq CallToolResult Source # 
Instance details

Defined in Polytropos.MCP

Generic CallToolResult Source # 
Instance details

Defined in Polytropos.MCP

Associated Types

type Rep CallToolResult 
Instance details

Defined in Polytropos.MCP

type Rep CallToolResult = D1 ('MetaData "CallToolResult" "Polytropos.MCP" "polytropos-mcp-0.1.0.0-inplace" 'False) (C1 ('MetaCons "CallToolResult" 'PrefixI 'True) (S1 ('MetaSel ('Just "callToolContent") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 [McpContent]) :*: S1 ('MetaSel ('Just "callToolIsError") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Maybe Bool))))
Show CallToolResult Source # 
Instance details

Defined in Polytropos.MCP

type Rep CallToolResult Source # 
Instance details

Defined in Polytropos.MCP

type Rep CallToolResult = D1 ('MetaData "CallToolResult" "Polytropos.MCP" "polytropos-mcp-0.1.0.0-inplace" 'False) (C1 ('MetaCons "CallToolResult" 'PrefixI 'True) (S1 ('MetaSel ('Just "callToolContent") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 [McpContent]) :*: S1 ('MetaSel ('Just "callToolIsError") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Maybe Bool))))

data McpContent Source #

An MCP content item returned by a tool execution.

Constructors

TextContent !Text 
ImageContent !Text !Text

base64 data, mimeType

ResourceContent !Text !(Maybe Text)

uri, optional text

Instances

Instances details
FromJSON McpContent Source # 
Instance details

Defined in Polytropos.MCP

ToJSON McpContent Source # 
Instance details

Defined in Polytropos.MCP

Eq McpContent Source # 
Instance details

Defined in Polytropos.MCP

Generic McpContent Source # 
Instance details

Defined in Polytropos.MCP

Associated Types

type Rep McpContent 
Instance details

Defined in Polytropos.MCP

type Rep McpContent = D1 ('MetaData "McpContent" "Polytropos.MCP" "polytropos-mcp-0.1.0.0-inplace" 'False) (C1 ('MetaCons "TextContent" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Text)) :+: (C1 ('MetaCons "ImageContent" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Text) :*: S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Text)) :+: C1 ('MetaCons "ResourceContent" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Text) :*: S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Maybe Text)))))

Methods

from :: McpContent -> Rep McpContent x

to :: Rep McpContent x -> McpContent

Show McpContent Source # 
Instance details

Defined in Polytropos.MCP

type Rep McpContent Source # 
Instance details

Defined in Polytropos.MCP

type Rep McpContent = D1 ('MetaData "McpContent" "Polytropos.MCP" "polytropos-mcp-0.1.0.0-inplace" 'False) (C1 ('MetaCons "TextContent" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Text)) :+: (C1 ('MetaCons "ImageContent" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Text) :*: S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Text)) :+: C1 ('MetaCons "ResourceContent" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Text) :*: S1 ('MetaSel ('Nothing :: Maybe Symbol) 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Maybe Text)))))

data ServerInfo Source #

Server information reported during the initialize handshake.

Constructors

ServerInfo 

Fields

Instances

Instances details
ToJSON ServerInfo Source # 
Instance details

Defined in Polytropos.MCP

Eq ServerInfo Source # 
Instance details

Defined in Polytropos.MCP

Generic ServerInfo Source # 
Instance details

Defined in Polytropos.MCP

Associated Types

type Rep ServerInfo 
Instance details

Defined in Polytropos.MCP

type Rep ServerInfo = D1 ('MetaData "ServerInfo" "Polytropos.MCP" "polytropos-mcp-0.1.0.0-inplace" 'False) (C1 ('MetaCons "ServerInfo" 'PrefixI 'True) (S1 ('MetaSel ('Just "serverName") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Text) :*: S1 ('MetaSel ('Just "serverVersion") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Text)))

Methods

from :: ServerInfo -> Rep ServerInfo x

to :: Rep ServerInfo x -> ServerInfo

Show ServerInfo Source # 
Instance details

Defined in Polytropos.MCP

type Rep ServerInfo Source # 
Instance details

Defined in Polytropos.MCP

type Rep ServerInfo = D1 ('MetaData "ServerInfo" "Polytropos.MCP" "polytropos-mcp-0.1.0.0-inplace" 'False) (C1 ('MetaCons "ServerInfo" 'PrefixI 'True) (S1 ('MetaSel ('Just "serverName") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Text) :*: S1 ('MetaSel ('Just "serverVersion") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Text)))

data ServerCapabilities Source #

Server capabilities announced during initialization.

Constructors

ServerCapabilities 

Fields

Instances

Instances details
ToJSON ServerCapabilities Source # 
Instance details

Defined in Polytropos.MCP

Eq ServerCapabilities Source # 
Instance details

Defined in Polytropos.MCP

Generic ServerCapabilities Source # 
Instance details

Defined in Polytropos.MCP

Associated Types

type Rep ServerCapabilities 
Instance details

Defined in Polytropos.MCP

type Rep ServerCapabilities = D1 ('MetaData "ServerCapabilities" "Polytropos.MCP" "polytropos-mcp-0.1.0.0-inplace" 'False) (C1 ('MetaCons "ServerCapabilities" 'PrefixI 'True) (S1 ('MetaSel ('Just "capTools") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Maybe Value))))
Show ServerCapabilities Source # 
Instance details

Defined in Polytropos.MCP

type Rep ServerCapabilities Source # 
Instance details

Defined in Polytropos.MCP

type Rep ServerCapabilities = D1 ('MetaData "ServerCapabilities" "Polytropos.MCP" "polytropos-mcp-0.1.0.0-inplace" 'False) (C1 ('MetaCons "ServerCapabilities" 'PrefixI 'True) (S1 ('MetaSel ('Just "capTools") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 (Maybe Value))))

data InitializeResult Source #

The payload returned to the client upon a successful initialize handshake.

Instances

Instances details
ToJSON InitializeResult Source # 
Instance details

Defined in Polytropos.MCP

Eq InitializeResult Source # 
Instance details

Defined in Polytropos.MCP

Generic InitializeResult Source # 
Instance details

Defined in Polytropos.MCP

Associated Types

type Rep InitializeResult 
Instance details

Defined in Polytropos.MCP

type Rep InitializeResult = D1 ('MetaData "InitializeResult" "Polytropos.MCP" "polytropos-mcp-0.1.0.0-inplace" 'False) (C1 ('MetaCons "InitializeResult" 'PrefixI 'True) (S1 ('MetaSel ('Just "initProtocolVersion") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Text) :*: (S1 ('MetaSel ('Just "initCapabilities") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 ServerCapabilities) :*: S1 ('MetaSel ('Just "initServerInfo") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 ServerInfo))))
Show InitializeResult Source # 
Instance details

Defined in Polytropos.MCP

type Rep InitializeResult Source # 
Instance details

Defined in Polytropos.MCP

type Rep InitializeResult = D1 ('MetaData "InitializeResult" "Polytropos.MCP" "polytropos-mcp-0.1.0.0-inplace" 'False) (C1 ('MetaCons "InitializeResult" 'PrefixI 'True) (S1 ('MetaSel ('Just "initProtocolVersion") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 Text) :*: (S1 ('MetaSel ('Just "initCapabilities") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 ServerCapabilities) :*: S1 ('MetaSel ('Just "initServerInfo") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict) (Rec0 ServerInfo))))

Tool Schema Synthesis

recordToTool Source #

Arguments

:: forall (name :: Symbol) (r :: Row). (KnownSymbol name, Typeable r, AllToSchema r) 
=> Text

Human-readable tool description

-> Proxy r

Parameter row proxy

-> McpTool 

Synthesizes an MCP McpTool definition from an open record row type r. The tool's parameter schema is generated via toSchema.

Tool Call Parsing & Dispatch

toolCallToVariant Source #

Arguments

:: forall (s :: SumRow). AllCtorsFromJSON s 
=> Text

Invoked tool name

-> Value

JSON argument object

-> Either String (Variant s) 

Parses tool call arguments into a Polytropos Variant sum row s. Constructs a tagged singleton object {"toolName": arguments} and decodes via AllCtorsFromJSON.

dispatchToolCall :: forall (s :: SumRow). AllCtorsFromJSON s => (Variant s -> IO [McpContent]) -> Text -> Value -> IO CallToolResult Source #

Dispatches a tool execution request by decoding into Variant s and invoking the provided handler (typically constructed via eliminateUniform).

handleJsonRpcMessage :: ServerInfo -> [McpTool] -> (Text -> Value -> IO CallToolResult) -> ByteString -> IO (Maybe ByteString) Source #

Handles a single incoming JSON-RPC raw message line, producing a response (or Nothing for notifications that expect no reply).

runStdioServer :: ServerInfo -> [McpTool] -> (Text -> Value -> IO CallToolResult) -> IO () Source #

Runs an MCP server over standard input/output using newline-delimited JSON-RPC messages.