package main import ( "context" mcp "github.com/metoro-io/mcp-golang" "github.com/metoro-io/mcp-golang/transport/stdio" "log" "os" "os/exec" ) // CalculateArgs Define type-safe arguments type CalculateArgs struct { Operation string `json:"operation"` A int `json:"a"` B int `json:"b"` } func main() { cmd := exec.Command("go", "run", "./server/main.go") stdin, err := cmd.StdinPipe() if err != nil { log.Fatalf("Failed to get stdin pipe: %v", err) } stdout, err := cmd.StdoutPipe() if err != nil { log.Fatalf("Failed to get stdout pipe: %v", err) } if err := cmd.Start(); err != nil { log.Fatalf("Failed to start server: %v", err) } defer func(Process *os.Process) { err := Process.Kill() if err != nil { log.Fatalf("Failed to kill server: %v", err) } }(cmd.Process) // Create and initialize client transport := stdio.NewStdioServerTransportWithIO(stdout, stdin) client := mcp.NewClient(transport) if _, err := client.Initialize(context.Background()); err != nil { log.Fatalf("Failed to initialize: %v", err) } // Call a tool with typed arguments args := CalculateArgs{ Operation: "add", A: 10, B: 5, } response, err := client.CallTool(context.Background(), "calculate", args) if err != nil { log.Fatalf("Failed to call tool: %v", err) } if response != nil && len(response.Content) > 0 { log.Printf("Result: %s", response.Content[0].TextContent.Text) } }