mcp-server-0.1.0.0: examples/TemplateHaskell.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
module Main where
import MCP.Server
import MCP.Server.Derive
import System.IO (hPutStrLn, stderr)
import Types
-- High-level handler functions
handlePrompt :: MyPrompt -> IO Content
handlePrompt (Recipe idea) =
pure $ ContentText $ "Recipe prompt for " <> idea <> ": Start by gathering fresh ingredients..."
handlePrompt (Shopping description) =
pure $ ContentText $ "Shopping prompt for " <> description <> ": Create a detailed shopping list..."
handleResource :: MyResource -> IO Content
handleResource ProductCategories = pure $ ContentText "Fresh Produce, Dairy, Bakery, Meat & Seafood, Frozen Foods"
handleResource SaleItems = pure $ ContentText "Organic Apples $2.99/lb, Free Range Eggs $4.50/dozen, Artisan Bread $3.25/loaf"
handleResource HeadlineBannerAd = pure $ ContentText "🛒 Weekly Special: 20% off all organic produce! 🥕🥬🍎"
handleTool :: MyTool -> IO Content
handleTool (SearchForProduct q category) =
case category of
Nothing -> pure $ ContentText $ "Search results for '" <> q <> "': Found 15 products across all categories"
Just cat -> pure $ ContentText $ "Search results for '" <> q <> "' in " <> cat <> ": Found 8 products"
handleTool (AddToCart sku) = pure $ ContentText $ "Added item " <> sku <> " to your cart. Cart total: 3 items"
handleTool Checkout = pure $ ContentText "Checkout completed! Order #12345 confirmed. Thank you for shopping with us!"
main :: IO ()
main = do
hPutStrLn stderr "Starting Template Haskell MCP Server..."
hPutStrLn stderr "Using automatic Template Haskell derivation!"
hPutStrLn stderr "Ready for JSON-RPC communication"
-- Derive the handlers using Template Haskell
let prompts = $(derivePromptHandler ''MyPrompt 'handlePrompt)
resources = $(deriveResourceHandler ''MyResource 'handleResource)
tools = $(deriveToolHandler ''MyTool 'handleTool)
in runMcpServerStdIn
McpServerInfo
{ serverName = "Template Haskell MCP Server"
, serverVersion = "0.3.0"
, serverInstructions = "MCP server using Template Haskell for automatic handler derivation"
}
McpServerHandlers
{ prompts = Just prompts
, resources = Just resources
, tools = Just tools
}