Kitchen Sink
Kitchen Sink
This page details the example found in the /examples/kitchen-sink
directory. As the name suggests, this example aims to demonstrate a wide variety of gomcp
features working together in a single server application.
This includes:
- Multiple transport options (e.g., Stdio, HTTP+SSE, WebSocket) selectable via flags.
- Registration of multiple tools with different functionalities.
- Registration of resources and prompts.
- Handling of configuration, logging, and potentially other aspects.
Kitchen Sink Server (examples/kitchen-sink/server
)
This example likely combines elements from many of the other examples, using command-line flags to configure which transport to use and potentially which features to enable.
Conceptual Snippets (Illustrative - check main.go
for actual implementation):
package main
import (
"flag"
"log"
"net/http"
"os"
// ... many other imports: server, protocol, types, stdio, sse, websocket, viper ...
"github.com/localrivet/gomcp/protocol" // Added for protocol types
"github.com/localrivet/gomcp/server" // Added for server types
"github.com/localrivet/gomcp/types" // Added for types.Implementation
)
// ... Define multiple tool handlers (handleEcho, handleCalc, handleReadFile, etc.) ...
// ... Define resource providers ...
func main() {
// --- Command-Line Flags ---
transportType := flag.String("transport", "stdio", "Transport type: stdio, http, websocket")
listenAddr := flag.String("listen", ":8080", "Listen address for http/websocket")
// ... other flags ...
flag.Parse()
// --- Load Configuration (Optional, e.g., using Viper) ---
// ... viper setup ...
// --- Setup MCP Server ---
serverInfo := types.Implementation{Name: "kitchen-sink", Version: "0.1.0"}
opts := server.NewServerOptions(serverInfo)
// Set capabilities based on features being enabled
opts.Capabilities.Tools = &protocol.ToolsCaps{ /* ... */ }
opts.Capabilities.Resources = &protocol.ResourcesCaps{ /* ... */ }
// ... etc ...
srv := server.NewServer(opts)
// --- Register Multiple Capabilities ---
log.Println("Registering capabilities...")
// Register echo tool
// err := srv.RegisterTool(echoToolDef, handleEcho) ...
// Register calculator tool
// err = srv.RegisterTool(calcToolDef, handleCalc) ...
// Register file reader tool
// err = srv.RegisterTool(readFileToolDef, handleReadFile) ...
// Register resources
// err = srv.RegisterResource(fileResource, fileProvider) ...
// Register prompts
// err = srv.RegisterPrompt(examplePrompt) ...
// --- Setup and Run Selected Transport ---
log.Printf("Starting kitchen-sink server using %s transport...", *transportType)
var runErr error
switch *transportType {
case "http":
sseServer := sse.NewServer(srv, opts.Logger)
mux := http.NewServeMux()
mux.HandleFunc("/events", sseServer.HTTPHandler)
mux.HandleFunc("/message", srv.HTTPHandler)
log.Printf(" Listening on %s", *listenAddr)
runErr = http.ListenAndServe(*listenAddr, mux)
case "websocket":
wsFactory := websocket.NewFactory(srv, opts.Logger)
mux := http.NewServeMux()
mux.HandleFunc("/ws", wsFactory.HTTPHandler)
log.Printf(" Listening on %s/ws", *listenAddr)
runErr = http.ListenAndServe(*listenAddr, mux)
case "stdio":
fallthrough // Default to stdio
default:
transport := stdio.NewStdioTransport(os.Stdin, os.Stdout, opts.Logger)
runErr = srv.Run(transport)
}
// --- Handle Run Error ---
if runErr != nil {
log.Fatalf("Server error: %v", runErr)
}
log.Println("Server stopped.")
}
To Run:
- Navigate to
examples/kitchen-sink/server
. - Build:
go build -o kitchen-sink-server
- Run with desired transport:
./kitchen-sink-server -transport stdio
./kitchen-sink-server -transport http -listen :8080
./kitchen-sink-server -transport websocket -listen :9090
This example serves as a comprehensive reference for integrating various gomcp
components. Consult the main.go
file for the full implementation details.