Examples
Examples
This section contains runnable examples demonstrating various features and use cases of the gomcp
library.
You can find the full source code for these and more complex examples in the /examples
directory of the repository.
Basic Stdio Server
This example sets up a minimal server communicating over standard input/output.
package main
import (
"log"
"os"
"github.com/localrivet/gomcp/server"
"github.com/localrivet/gomcp/transport/stdio"
"github.com/localrivet/gomcp/types"
)
func main() {
serverInfo := types.Implementation{Name: "stdio-server", Version: "0.1.0"}
opts := server.NewServerOptions(serverInfo)
srv := server.NewServer(opts)
transport := stdio.NewStdioTransport(os.Stdin, os.Stdout, nil)
log.Println("Starting stdio MCP server...")
if err := srv.Run(transport); err != nil {
log.Fatalf("Server error: %v", err)
}
log.Println("Server stopped.")
}
(See examples/basic/stdio/main.go
for the full runnable version)
Registering a Simple Tool
Here’s how you define and register a basic “echo” tool within your server setup.
package main
import (
"context"
"fmt"
"log"
"os"
// ... other necessary imports from basic server example ...
"github.com/localrivet/gomcp/protocol"
"github.com/localrivet/gomcp/server"
"github.com/localrivet/gomcp/transport/stdio"
"github.com/localrivet/gomcp/types"
)
// 1. Define the Tool Handler
func handleEcho(ctx context.Context, args map[string]interface{}) ([]protocol.Content, error) {
input, ok := args["text"].(string)
if !ok {
return nil, fmt.Errorf("missing 'text' argument")
}
return []protocol.Content{
protocol.TextContent{Type: "text", Text: "Server Echo: " + input},
}, nil
}
func main() {
serverInfo := types.Implementation{Name: "tool-server", Version: "0.1.0"}
opts := server.NewServerOptions(serverInfo)
// Indicate tool support
opts.Capabilities.Tools = &protocol.ToolsCaps{}
srv := server.NewServer(opts)
// 2. Define the Tool Structure
echoToolDef := protocol.Tool{
Name: "echo",
Description: "Echoes back the provided text.",
InputSchema: protocol.ToolInputSchema{
Type: "object",
Properties: map[string]protocol.PropertyDetail{
"text": {Type: "string", Description: "Text to echo"},
},
Required: []string{"text"},
},
}
// 3. Register the Tool
if err := srv.RegisterTool(echoToolDef, handleEcho); err != nil {
log.Fatalf("Failed to register tool: %v", err)
}
log.Println("Registered 'echo' tool.")
transport := stdio.NewStdioTransport(os.Stdin, os.Stdout, nil)
log.Println("Starting tool MCP server on stdio...")
if err := srv.Run(transport); err != nil {
log.Fatalf("Server error: %v", err)
}
log.Println("Server stopped.")
}
(See examples/basic/tools/main.go
for the full runnable version)
Explore the other examples in the repository for more advanced scenarios involving different transports (HTTP/SSE, WebSockets), authentication, resource providers, and more.