mcp-test / main.go
rclon's picture
Update main.go
4cf54d8 verified
package main
import (
"context"
"flag"
"fmt"
"log"
"strconv"
"github.com/mark3labs/mcp-go/mcp"
"github.com/mark3labs/mcp-go/server"
)
// 两数求和 handler
func addHandler(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {
// 参数断言 float64 支持整数和小数
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 {
// 创建 MCP server
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" {
// 启动 stdio server
if err := server.ServeStdio(mcpServer); err != nil {
fmt.Printf("Server error: %v\n", err)
}
} else {
// 启动 SSE server
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)
}
}
}