main.go
package mainimport ("context""fmt""github.com/mark3labs/mcp-go/mcp""github.com/mark3labs/mcp-go/server"
)func main() {// 创建一个新的MCP服务器s := server.NewMCPServer("mcp入门示例","1.0.0",server.WithResourceCapabilities(true, true),server.WithLogging(),)// 添加一个计算器工具calculatorTool := mcp.NewTool("calculate",mcp.WithDescription("执行计算"),mcp.WithString("operation",mcp.Required(),mcp.Description("要执行的操作(add, subtract, multiply, divide)"),mcp.Enum("add", "subtract", "multiply", "divide"),),mcp.WithNumber("x",mcp.Required(),mcp.Description("第一个数"),),mcp.WithNumber("y",mcp.Required(),mcp.Description("第二个数"),),)// 添加计算器处理程序,功能多了就是添加n个程序,类似于路由s.AddTool(calculatorTool, func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) {// 使用GetArguments()方法获取参数arguments := request.GetArguments()// 安全地获取operation参数opValue, ok := arguments["operation"]if !ok {return mcp.NewToolResultError("Missing operation parameter"), nil}op, ok := opValue.(string)if !ok {return mcp.NewToolResultError("Operation parameter must be a string"), nil}// 安全地获取x参数xValue, ok := arguments["x"]if !ok {return mcp.NewToolResultError("Missing x parameter"), nil}x, ok := xValue.(float64)if !ok {// 尝试转换为float64if xFloat, ok := xValue.(float32); ok {x = float64(xFloat)} else if xInt, ok := xValue.(int); ok {x = float64(xInt)} else {return mcp.NewToolResultError("X parameter must be a number"), nil}}// 安全地获取y参数yValue, ok := arguments["y"]if !ok {return mcp.NewToolResultError("Missing y parameter"), nil}y, ok := yValue.(float64)if !ok {// 尝试转换为float64if yFloat, ok := yValue.(float32); ok {y = float64(yFloat)} else if yInt, ok := yValue.(int); ok {y = float64(yInt)} else {return mcp.NewToolResultError("Y parameter must be a number"), nil}}var result float64switch op {case "add":result = x + ycase "subtract":result = x - ycase "multiply":result = x * ycase "divide":if y == 0 {return mcp.NewToolResultError("Cannot divide by zero"), nil}result = x / y}return mcp.NewToolResultText(fmt.Sprintf("%.2f", result)), nil})// 启动服务器if err := server.ServeStdio(s); err != nil {fmt.Printf("Server error: %v\n", err)}
}
执行go mod tidy
编译(可选),如果没有编译,后面配置mcp服务器可以直接用命令启动go run xx.go
配置mcp,这里我是用trace
![image]()
测试一下,编辑器会自动选择对应的mcp
![image]()