| package main |
|
|
| import ( |
| "context" |
| "flag" |
| "fmt" |
| "log" |
| "strconv" |
|
|
| "github.com/mark3labs/mcp-go/mcp" |
| "github.com/mark3labs/mcp-go/server" |
| ) |
|
|
| |
| func addHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { |
| |
| a, ok1 := request.Params.Arguments["a"].(float64) |
| b, ok2 := request.Params.Arguments["b"].(float64) |
| if !ok1 || !ok2 { |
| return nil, fmt.Errorf("参数类型错误,期望输入两个数字") |
| } |
|
|
| sum := a + b |
| resultStr := fmt.Sprintf("两数之和为: %.2f", sum) |
|
|
| return &mcp.CallToolResult{ |
| Content: []mcp.Content{ |
| mcp.TextContent{Type: "text", Text: resultStr}, |
| }, |
| }, nil |
| } |
|
|
| func NewMCPServer() *server.MCPServer { |
| |
| s := server.NewMCPServer( |
| "Calculator Demo", |
| "1.0.0", |
| server.WithResourceCapabilities(true, true), |
| server.WithLogging(), |
| ) |
|
|
| |
| addTool := mcp.NewTool("add", |
| mcp.WithDescription("两数求和工具"), |
| mcp.WithNumber("a", mcp.Description("第一个数字"), mcp.Required()), |
| mcp.WithNumber("b", mcp.Description("第二个数字"), mcp.Required()), |
| ) |
|
|
| s.AddTool(addTool, addHandler) |
| return s |
| } |
|
|
| func main() { |
| var transport string |
| var port int |
| flag.StringVar(&transport, "t", "sse", "Transport type (stdio or sse)") |
| flag.StringVar(&transport, "transport", "sse", "Transport type (stdio or sse)") |
| flag.IntVar(&port, "p", 8080, "Port number (default 8080)") |
| flag.IntVar(&port, "port", 8080, "Port number (default 8080)") |
| flag.Parse() |
|
|
| mcpServer := NewMCPServer() |
|
|
| if transport == "stdio" { |
| |
| if err := server.ServeStdio(mcpServer); err != nil { |
| fmt.Printf("Server error: %v\n", err) |
| } |
| } else { |
| |
| sseServer := server.NewSSEServer(mcpServer) |
| log.Printf("SSE server listening on :" + strconv.Itoa(port)) |
| if err := sseServer.Start(":" + strconv.Itoa(port)); err != nil { |
| log.Fatalf("Server error: %v", err) |
| } |
| } |
| } |