main.go
package main
import (
"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 {
// 尝试转换为float64
if 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 {
// 尝试转换为float64
if 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 float64
switch op {
case "add":
result = x + y
case "subtract":
result = x - y
case "multiply":
result = x * y
case "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]()